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'] = ' ';
}
// 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
| 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.