bp_nouveau_ajax_groups_send_message()

Send group message to group members.

Description

Source

File: bp-templates/bp-nouveau/includes/groups/ajax.php

function bp_nouveau_ajax_groups_send_message() {

	global $wpdb, $bp;

	if ( false === bp_disable_group_messages() ) {
		return;
	}

	if ( empty( $_POST['action'] ) ) {
		wp_send_json_error();
	}

	$response = array(
		'feedback' => '<div class="bp-feedback error"><span class="bp-icon" aria-hidden="true"></span><p>' . __( 'There was a problem loading recipients. Please try again.', 'buddyboss' ) . '</p></div>',
		'type'     => 'error',
	);

	if ( false === bp_is_active( 'messages' ) ) {
		wp_send_json_error( $response );
	}

	if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'send_messages_users' ) ) {
		wp_send_json_error( $response );
	}

	if ( isset( $_POST['gif'] ) && '' !== $_POST['gif'] ) {
		$_POST['gif_data'] = json_decode( wp_kses_stripslashes( $_POST['gif'] ), true );
	}

	if ( isset( $_POST['media'] ) && '' !== $_POST['media'] ) {
		$_POST['media'] = json_decode( wp_kses_stripslashes( $_POST['media'] ), true );
	}

	if ( isset( $_POST['document'] ) && '' !== $_POST['document'] ) {
		$_POST['document'] = json_decode( wp_kses_stripslashes( $_POST['document'] ), true );
	}

	if ( '' === $_POST['content'] && ( ! empty( $_POST['document'] ) || !empty( $_POST['media'] ) ) ) {
		$_POST['content'] = '&nbsp;';
	}

	// Get Members list if "All Group Members" selected.
	if ( 'all' === $_POST['users'] ) {

		// Fetch all the group members.
		$args = array(
			'per_page'            => 9999999999999999999,
			'group_id'            => trim( $_POST['group'] ),
			'exclude'             => array( bp_loggedin_user_id() ),
			'exclude_admins_mods' => false,
		);

		$group_members = groups_get_group_members( $args );
		$members       = wp_list_pluck( $group_members['members'], 'ID' );

		// We get members array from $_POST['users_list'] because user already selected them.
	} else {
		$members = $_POST['users_list'];
	}

	if ( empty( $members ) ) {
		$response['feedback'] = 'No Members Selected.';
		wp_send_json_error( $response );
	}

	$group         = ( isset( $_POST ) && isset( $_POST['group'] ) && '' !== $_POST['group'] ) ? trim( $_POST['group'] ) : ''; // Group id
	$message_users = ( isset( $_POST ) && isset( $_POST['users'] ) && '' !== $_POST['users'] ) ? trim( $_POST['users'] ) : ''; // all - individual
	$message_type  = ( isset( $_POST ) && isset( $_POST['type'] ) && '' !== $_POST['type'] ) ? trim( $_POST['type'] ) : ''; // open - private

	if ( empty( $group ) ) {
		$response['feedback'] = 'No group Selected.';
		wp_send_json_error( $response );
	}

	// If "Group Thread" selected.
	if ( 'open' === $message_type ) {

		// "All Group Members" selected.
		if ( 'all' === $message_users ) {

			// Comma separated members list to find in meta query.
			$message_users_ids = implode( ',', $members );

			// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "message_users_ids".
			$_POST['message_meta_users_list'] = $message_users_ids;

			$group_thread                 = groups_get_groupmeta( (int) $group, 'group_message_thread' );
			$is_deleted                   = false;
			$group_thread_id              = '';
			$_POST['message_thread_type'] = '';

			if ( '' !== $group_thread ) {
				$total_threads = $wpdb->get_results( $wpdb->prepare( "SELECT is_deleted FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", (int) $group_thread ) ); // db call ok; no-cache ok;
				foreach ( $total_threads as $thread ) {
					if ( 1 === (int) $thread->is_deleted ) {
						$is_deleted = true;
						break;
					}
				}

				if ( $is_deleted ) {
					// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
					$_POST['message_thread_type'] = 'new';
				}
			}

			if ( '' !== $group_thread && ! $is_deleted && isset( $_POST['message_thread_type'] ) && empty( $_POST['message_thread_type'] ) ) {
				// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
				$_POST['message_thread_type'] = 'reply';
				$group_thread_id              = $group_thread;
			} else {

				// Backward compatibility when we dont store thread_id in group meta.
				$meta = array(
					array(
						'key'     => 'group_id',
						'value'   => $group,
						'compare' => '=',
					),
					array(
						'key'     => 'group_message_users',
						'value'   => 'all',
						'compare' => '=',
					),
					array(
						'key'     => 'group_message_type',
						'value'   => 'open',
						'compare' => '=',
					),
					array(
						'key'   => 'message_users_ids',
						'value' => $message_users_ids,
					),
				);

				// Check if there is already previously group thread created.
				if ( bp_has_message_threads( array( 'meta_query' => $meta ) ) ) {

					$thread_id = 0;

					while ( bp_message_threads() ) {
						bp_message_thread();
						$thread_id = bp_get_message_thread_id();

						if ( $thread_id ) {
							break;
						}
					}

					// If $thread_id found then add as a reply to that thread.
					if ( $thread_id ) {
						$group_thread_id = $thread_id;

						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'reply';

						// Create a new group thread.
					} else {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'new';
					}

					// Create a new group thread.
				} else {
					// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
					$_POST['message_thread_type'] = 'new';
				}
			}

			/**
			 * Create Message based on the `message_thread_type` and `group_thread_id`.
			 */
			if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) {
				$send = bp_groups_messages_new_message(
					array(
						'recipients'    => $members,
						'subject'       => wp_trim_words( $_POST['content'], messages_get_default_subject_length() ),
						'content'       => $_POST['content'],
						'error_type'    => 'wp_error',
						'append_thread' => false,
					)
				);

				if ( ! is_wp_error( $send ) && ! empty( $send ) ) {
					groups_update_groupmeta( (int) $group, 'group_message_thread', $send );
				}

				bp_groups_messages_validate_message( $send );
			} elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $group_thread_id ) ) {
				groups_update_groupmeta( (int) $group, 'group_message_thread', $group_thread_id );

				$new_reply = bp_groups_messages_new_message(
					array(
						'thread_id'    => $group_thread_id,
						'subject'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
						'content'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
						'date_sent'    => bp_core_current_time(),
						'mark_visible' => true,
						'error_type'   => 'wp_error',
					)
				);

				bp_groups_messages_validate_message( $new_reply );
			}

			// "Individual Members" Selected.
		} else {
			$meta = array(
				array(
					'key'     => 'group_message_type',
					'value'   => 'open',
					'compare' => '!=',
				),
			);

			$individual_thread_id         = 0;
			$_POST['message_thread_type'] = '';

			// Check if there is already previously individual group thread created.
			if ( bp_has_message_threads( array( 'meta_query' => $meta ) ) ) {

				$thread_id = 0;

				while ( bp_message_threads() ) {
					bp_message_thread();
					$thread_id = bp_get_message_thread_id();

					if ( $thread_id ) {

						// get the thread recipients.
						$thread                     = new BP_Messages_Thread( $thread_id );
						$thread_recipients          = $thread->get_recipients();
						$previous_thread_recipients = array();

						// Store thread recipients to $previous_ids array.
						foreach ( $thread_recipients as $thread_recipient ) {
							if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
								$previous_thread_recipients[] = $thread_recipient->user_id;
							}
						}

						$current_recipients = array();
						$current_recipients = $members;
						$members_recipients = array();

						// Store current recipients to $members array.
						foreach ( $current_recipients as $single_recipients ) {
							$members_recipients[] = (int) $single_recipients;
						}

						// check both previous and current recipients are same.
						$is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members_recipients ) && count( $previous_thread_recipients ) === count( $members_recipients ) && array_diff( $previous_thread_recipients, $members_recipients ) === array_diff( $members_recipients, $previous_thread_recipients ) );

						$group_thread = (int) groups_get_groupmeta( (int) $group, 'group_message_thread' );

						// If recipients are matched.
						if ( $is_recipient_match && (int) $thread_id !== $group_thread ) {
							break;
						}
					}
				}

				// If $thread_id found then add as a reply to that thread.
				if ( $thread_id ) {
					// get the thread recipients.
					$thread                     = new BP_Messages_Thread( $thread_id );
					$thread_recipients          = $thread->get_recipients();
					$previous_thread_recipients = array();

					$last_message = BP_Messages_Thread::get_last_message( $thread_id );
					$message_type = bp_messages_get_meta( $last_message->id, 'group_message_users', true );

					// Store thread recipients to $previous_ids array.
					foreach ( $thread_recipients as $thread_recipient ) {
						if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
							$previous_thread_recipients[] = $thread_recipient->user_id;
						}
					}

					$current_recipients = array();
					$current_recipients = $members;
					$members_recipients = array();

					// Store current recipients to $members array.
					foreach ( $current_recipients as $single_recipients ) {
						$members_recipients[] = (int) $single_recipients;
					}

					// check both previous and current recipients are same.
					$is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members_recipients ) && count( $previous_thread_recipients ) === count( $members_recipients ) && array_diff( $previous_thread_recipients, $members_recipients ) === array_diff( $members_recipients, $previous_thread_recipients ) );

					$group_thread = (int) groups_get_groupmeta( (int) $group, 'group_message_thread' );

					// If recipients are matched.
					if ( $is_recipient_match && (int) $thread_id !== $group_thread ) {
						$individual_thread_id = $thread_id;

						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'reply';

						// Else recipients not matched.
					} else {
						$previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() );
						$existing_thread  = 0;
						if ( $previous_threads ) {
							foreach ( $previous_threads as $thread ) {

								$is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() );

								if ( $is_active_recipient ) {
									// get the thread recipients.
									$thread                     = new BP_Messages_Thread( $thread->thread_id );
									$thread_recipients          = $thread->get_recipients();
									$previous_thread_recipients = array();

									// Store thread recipients to $previous_ids array.
									foreach ( $thread_recipients as $thread_recipient ) {
										if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
											$previous_thread_recipients[] = $thread_recipient->user_id;
										}
									}

									$current_recipients = array();
									$current_recipients = $members;
									$members            = array();

									// Store current recipients to $members array.
									foreach ( $current_recipients as $single_recipients ) {
										$members[] = (int) $single_recipients;
									}

									// check both previous and current recipients are same.
									$is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) );

									// check any messages of this thread should not be a open & all.
									$message_ids  = wp_list_pluck( $thread->messages, 'id' );
									$add_existing = true;
									foreach ( $message_ids as $id ) {
										// group_message_users not open.
										$message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual.
										if ( 'all' === $message_users ) {
											$add_existing = false;
											break;
										}
									}

									// If recipients are matched.
									if ( $is_recipient_match && $add_existing ) {
										$existing_thread = (int) $thread->thread_id;
									}
								}
							}

							if ( $existing_thread > 0 ) {
								$individual_thread_id = $existing_thread;

								// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
								$_POST['message_thread_type'] = 'reply';
							} else {
								// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
								$_POST['message_thread_type'] = 'new';
							}
						} else {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'new';
						}
					}
					// Else no thread found.
				} else {
					$previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() );
					$existing_thread  = 0;
					if ( $previous_threads ) {
						foreach ( $previous_threads as $thread ) {
							$is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() );
							if ( $is_active_recipient ) {

								// get the thread recipients.
								$thread                     = new BP_Messages_Thread( $thread->thread_id );
								$thread_recipients          = $thread->get_recipients();
								$previous_thread_recipients = array();

								// Store thread recipients to $previous_ids array.
								foreach ( $thread_recipients as $thread_recipient ) {
									if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
										$previous_thread_recipients[] = $thread_recipient->user_id;
									}
								}

								$current_recipients = array();
								$current_recipients = $members;
								$members            = array();

								// Store current recipients to $members array.
								foreach ( $current_recipients as $single_recipients ) {
									$members[] = (int) $single_recipients;
								}

								// check both previous and current recipients are same.
								$is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) );

								// check any messages of this thread should not be a open & all.
								$message_ids  = wp_list_pluck( $thread->messages, 'id' );
								$add_existing = true;
								foreach ( $message_ids as $id ) {
									// group_message_users not open
									$message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual.
									if ( 'all' === $message_users ) {
										$add_existing = false;
										break;
									}
								}

								// If recipients are matched.
								if ( $is_recipient_match && $add_existing ) {
									$existing_thread = (int) $thread->thread_id;
								}
							}
						}

						if ( $existing_thread > 0 ) {
							$individual_thread_id = $existing_thread;

							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'reply';
						} else {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'new';
						}
					} else {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'new';
					}
				}

				// Else no previous thread found.
			} else {
				$previous_threads = BP_Messages_Message::get_existing_threads( $members, bp_loggedin_user_id() );
				$existing_thread  = 0;

				if ( $previous_threads ) {
					foreach ( $previous_threads as $thread ) {

						$is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() );

						if ( $is_active_recipient ) {
							// get the thread recipients.
							$thread                     = new BP_Messages_Thread( $thread->thread_id );
							$thread_recipients          = $thread->get_recipients();
							$previous_thread_recipients = array();

							// Store thread recipients to $previous_ids array.
							foreach ( $thread_recipients as $thread_recipient ) {
								if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
									$previous_thread_recipients[] = $thread_recipient->user_id;
								}
							}

							$current_recipients = array();
							$current_recipients = $members;
							$members            = array();

							// Store current recipients to $members array.
							foreach ( $current_recipients as $single_recipients ) {
								$members[] = (int) $single_recipients;
							}

							// check both previous and current recipients are same.
							$is_recipient_match = ( is_array( $previous_thread_recipients ) && is_array( $members ) && count( $previous_thread_recipients ) === count( $members ) && array_diff( $previous_thread_recipients, $members ) === array_diff( $members, $previous_thread_recipients ) );

							// check any messages of this thread should not be a open & all.
							$message_ids  = wp_list_pluck( $thread->messages, 'id' );
							$add_existing = true;
							foreach ( $message_ids as $id ) {
								// group_message_users not open
								$message_users = bp_messages_get_meta( $id, 'group_message_users', true ); // all - individual.
								if ( 'all' === $message_users ) {
									$add_existing = false;
									break;
								}
							}

							// If recipients are matched.
							if ( $is_recipient_match && $add_existing ) {
								$existing_thread = (int) $thread->thread_id;
							}
						}
					}

					if ( $existing_thread > 0 ) {
						$individual_thread_id = $existing_thread;

						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'reply';
					} else {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'new';
					}
				} else {
					// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
					$_POST['message_thread_type'] = 'new';
				}
			}

			/**
			 * Create Message based on the `message_thread_type` and `individual_thread_id`.
			 */
			if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) {
				$send = bp_groups_messages_new_message(
					array(
						'recipients'    => $members,
						'subject'       => wp_trim_words( $_POST['content'], messages_get_default_subject_length() ),
						'content'       => $_POST['content'],
						'error_type'    => 'wp_error',
						'append_thread' => false,
					)
				);

				bp_groups_messages_validate_message( $send, 'individual' );
			} elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $individual_thread_id ) ) {
				$new_reply = bp_groups_messages_new_message(
					array(
						'thread_id'    => $individual_thread_id,
						'subject'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
						'content'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
						'date_sent'    => bp_core_current_time(),
						'mark_visible' => true,
						'error_type'   => 'wp_error',
					)
				);

				bp_groups_messages_validate_message( $new_reply, 'individual' );
			}
		}

		// Else "Private Reply (BCC)" selected.
	} else {

		// We have to send Message to all members to "Individual" message in both cases like "All Group Members" OR "Individual Members" selected.
		foreach ( $members as $member ) {
			$meta = array(
				array(
					'key'     => 'group_message_type',
					'value'   => 'open',
					'compare' => '!=',
				),
			);

			$thread_loop_message_member = $member;
			$thread_loop_message_sent   = false;

			// Find existing thread which are private.
			if ( bp_has_message_threads( array( 'meta_query' => $meta ) ) ) {

				$thread_id = 0;

				$member_thread_id = 0;

				while ( bp_message_threads() ) {
					bp_message_thread();

					$thread_id = bp_get_message_thread_id();

					if ( $thread_id ) {
						// get the thread recipients.
						$thread                     = new BP_Messages_Thread( $thread_id );
						$thread_recipients          = $thread->get_recipients();
						$previous_thread_recipients = array();

						// Store thread recipients to $previous_ids array.
						foreach ( $thread_recipients as $thread_recipient ) {
							if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
								$previous_thread_recipients[] = $thread_recipient->user_id;
							}
						}

						$current_recipients   = array();
						$current_recipients[] = $thread_loop_message_member;
						$member_arr           = array();

						// Store current recipients to $members array.
						foreach ( $current_recipients as $single_recipients ) {
							$member_arr[] = (int) $single_recipients;
						}

						$first_message = BP_Messages_Thread::get_first_message( $thread_id );
						$message_user  = bp_messages_get_meta( $first_message->id, 'group_message_users', true );
						$message_type  = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private.

						// check both previous and current recipients are same.
						$is_recipient_match = ( $previous_thread_recipients == $member_arr );

						// If recipients are matched.
						if ( $is_recipient_match && 'all' !== $message_user ) {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'reply';
							$member_thread_id             = $thread_id;

							$thread_loop_message_sent = true;

							// If recipients then break the loop and go ahead because we don't need to check other threads.
							break;
						} elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'reply';
							$member_thread_id             = $thread_id;

							$thread_loop_message_sent = true;

							// If recipients then break the loop and go ahead because we don't need to check other threads.
							break;
						}
					}
				}

				// If there is no any thread matched.
				if ( false === $thread_loop_message_sent ) {
					$member_check     = array();
					$member_check[]   = $member;
					$member_check[]   = bp_loggedin_user_id();
					$previous_threads = BP_Messages_Message::get_existing_threads( $member_check, bp_loggedin_user_id() );
					$existing_thread  = 0;

					if ( $previous_threads ) {
						foreach ( $previous_threads as $thread ) {

							$is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() );

							if ( $is_active_recipient ) {
								// get the thread recipients.
								$thread                     = new BP_Messages_Thread( $thread->thread_id );
								$thread_recipients          = $thread->get_recipients();
								$previous_thread_recipients = array();

								// Store thread recipients to $previous_ids array.
								foreach ( $thread_recipients as $thread_recipient ) {
									if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
										$previous_thread_recipients[] = $thread_recipient->user_id;
									}
								}

								$current_recipients = array();
								if ( is_array( $member ) ) {
									$current_recipients = $member;
								} else {
									$current_recipients[] = $member;
								}
								$members = array();

								// Store current recipients to $members array.
								foreach ( $current_recipients as $single_recipients ) {
									$members[] = (int) $single_recipients;
								}

								$first_message = BP_Messages_Thread::get_first_message( $thread->thread_id );
								$message_user  = bp_messages_get_meta( $first_message->id, 'group_message_users', true );
								$message_type  = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private

								// check both previous and current recipients are same.
								$is_recipient_match = ( $previous_thread_recipients == $members );

								// If recipients are matched.
								if ( $is_recipient_match && 'all' !== $message_user ) {
									$existing_thread = (int) $thread->thread_id;
								} elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) {
									$existing_thread = (int) $thread->thread_id;
								}
							}
						}

						if ( $existing_thread > 0 ) {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'reply';

							$member_thread_id = $existing_thread;

						} else {
							// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
							$_POST['message_thread_type'] = 'new';
						}
					} else {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'new';
					}
				}

				/**
				 * Create Message based on the `message_thread_type` and `member_thread_id`.
				 */
				if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) {
					$message = bp_groups_messages_new_message(
						array(
							'recipients'    => $member,
							'subject'       => wp_trim_words( $_POST['content'], messages_get_default_subject_length() ),
							'content'       => $_POST['content'],
							'error_type'    => 'wp_error',
							'is_hidden'     => true,
							'append_thread' => false,
						)
					);
				} elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $member_thread_id ) ) {
					$message = bp_groups_messages_new_message(
						array(
							'thread_id'    => $member_thread_id,
							'subject'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
							'content'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
							'date_sent'    => bp_core_current_time(),
							'mark_visible' => true,
							'error_type'   => 'wp_error',
						)
					);
				}
				// If no existing private thread found.
			} else {

				$member_check     = array();
				$member_check[]   = $member;
				$member_check[]   = bp_loggedin_user_id();
				$previous_threads = BP_Messages_Message::get_existing_threads( $member_check, bp_loggedin_user_id() );
				$existing_thread  = 0;
				$member_thread_id = 0;

				if ( $previous_threads ) {
					foreach ( $previous_threads as $thread ) {

						$is_active_recipient = BP_Messages_Thread::is_thread_recipient( $thread->thread_id, bp_loggedin_user_id() );

						if ( $is_active_recipient ) {

							// get the thread recipients.
							$thread                     = new BP_Messages_Thread( $thread->thread_id );
							$thread_recipients          = $thread->get_recipients();
							$previous_thread_recipients = array();

							// Store thread recipients to $previous_ids array.
							foreach ( $thread_recipients as $thread_recipient ) {
								if ( $thread_recipient->user_id !== bp_loggedin_user_id() ) {
									$previous_thread_recipients[] = $thread_recipient->user_id;
								}
							}

							$current_recipients = array();
							if ( is_array( $member ) ) {
								$current_recipients = $member;
							} else {
								$current_recipients[] = $member;
							}
							$members = array();

							// Store current recipients to $members array.
							foreach ( $current_recipients as $single_recipients ) {
								$members[] = (int) $single_recipients;
							}

							$first_message = BP_Messages_Thread::get_first_message( $thread->thread_id );
							$message_user  = bp_messages_get_meta( $first_message->id, 'group_message_users', true );
							$message_type  = bp_messages_get_meta( $first_message->id, 'group_message_type', true ); // open - private.

							// check both previous and current recipients are same.
							$is_recipient_match = ( $previous_thread_recipients == $members );

							// If recipients are matched.
							if ( $is_recipient_match && 'all' !== $message_user ) {
								$existing_thread = (int) $thread->thread_id;
							} elseif ( $is_recipient_match && 'all' === $message_user && 'open' !== $message_type ) {
								$existing_thread = (int) $thread->thread_id;
							}
						}
					}

					if ( $existing_thread > 0 ) {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'reply';

						$member_thread_id = $existing_thread;
					} else {
						// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
						$_POST['message_thread_type'] = 'new';
					}
				} else {
					// This post variable will using in "bp_media_messages_save_group_data" function for storing message meta "group_message_thread_type".
					$_POST['message_thread_type'] = 'new';
				}

				/**
				 * Create Message based on the `message_thread_type` and `member_thread_id`.
				 */
				if ( isset( $_POST['message_thread_type'] ) && 'new' === $_POST['message_thread_type'] ) {
					$message = bp_groups_messages_new_message(
						array(
							'recipients'    => $member,
							'subject'       => wp_trim_words( $_POST['content'], messages_get_default_subject_length() ),
							'content'       => $_POST['content'],
							'error_type'    => 'wp_error',
							'is_hidden'     => true,
							'append_thread' => false,
						)
					);
				} elseif ( isset( $_POST['message_thread_type'] ) && 'reply' === $_POST['message_thread_type'] && ! empty( $member_thread_id ) ) {
					$message = bp_groups_messages_new_message(
						array(
							'thread_id'    => $member_thread_id,
							'subject'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
							'content'      => ! empty( $_POST['content'] ) ? $_POST['content'] : ' ',
							'date_sent'    => $date_sent = bp_core_current_time(),
							'mark_visible' => true,
							'error_type'   => 'wp_error',
						)
					);
				}
			}
		}

		if ( is_wp_error( $message ) ) {
			$response['feedback'] = $message->get_error_message();
			wp_send_json_error( $response );
		} elseif ( ! empty( $message ) ) {
			if ( 'all' !== $_POST['users'] ) {
				$response['feedback'] = __( 'Your message was sent privately to %%count%% members of this group.', 'buddyboss' );
			} else {
				$response['feedback'] = __( 'Your message was sent privately to all members of this group.', 'buddyboss' );
			}

			$response['redirect_link'] = '<a href="' . bp_loggedin_user_domain() . bp_get_messages_slug() . '"> ' . __( 'View message.', 'buddyboss' ) . '</a>';
			$response['type']          = 'success';
			wp_send_json_success( $response );
		}
	}
}

Changelog

Changelog
Version Description
BuddyBoss 1.2.9 Introduced.

Questions?

We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.