BP_Messages_Thread
BuddyPress Message Thread class.
Description
Source
File: bp-messages/classes/class-bp-messages-thread.php
class BP_Messages_Thread { /** * The message thread ID. * * @since BuddyPress 1.0.0 * @var int */ public $thread_id; /** * The current messages. * * @since BuddyPress 1.0.0 * @var array */ public $messages; public $total_messages; /** * The current recipients in the message thread. * * @since BuddyPress 1.0.0 * @var array */ public $recipients; /** * The user IDs of all messages in the message thread. * * @since BuddyPress 1.2.0 * @var array */ public $sender_ids; /** * The unread count for the logged-in user. * * @since BuddyPress 1.2.0 * @var int */ public $unread_count; /** * The content of the last message in this thread. * * @since BuddyPress 1.2.0 * @var string */ public $last_message_content; /** * The date of the last message in this thread. * * @since BuddyPress 1.2.0 * @var string */ public $last_message_date; /** * The ID of the last message in this thread. * * @since BuddyPress 1.2.0 * @var int */ public $last_message_id; /** * The subject of the last message in this thread. * * @since BuddyPress 1.2.0 * @var string */ public $last_message_subject; /** * The user ID of the author of the last message in this thread. * * @since BuddyPress 1.2.0 * @var int */ public $last_sender_id; /** * Sort order of the messages in this thread (ASC or DESC). * * @since BuddyPress 1.5.0 * @var string */ public $messages_order; /** * Last delete message of thread * * @since BuddyBoss 1.0.0 * @var object */ public static $last_deleted_message = null; public static $noCache = false; /** * Constructor. * * @since BuddyPress 1.0.0 * * @see BP_Messages_Thread::populate() for full description of parameters. * * @param bool $thread_id ID for the message thread. * @param string $order Order to display the messages in. * @param array $args Array of arguments for thread querying. */ public function __construct( $thread_id = false, $order = 'ASC', $args = array() ) { if ( $thread_id ) { $this->populate( $thread_id, $order, $args ); } } /** * Populate method. * * Used in constructor. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * @param string $order The order to sort the messages. Either 'ASC' or 'DESC'. * @param array $args { * Array of arguments. * @type bool $update_meta_cache Whether to pre-fetch metadata for * queried message items. Default: true. * } * @return bool False on failure. */ public function populate( $thread_id = 0, $order = 'DESC', $args = array() ) { if ( 'ASC' !== $order || 'DESC' !== $order ) { $order = 'DESC'; } $user_id = bp_displayed_user_id() ? bp_displayed_user_id() : bp_loggedin_user_id(); // Merge $args with our defaults. $r = wp_parse_args( $args, array( 'user_id' => $user_id, 'update_meta_cache' => true, 'per_page' => apply_filters('bp_messages_default_per_page', 10), 'before' => null ) ); $this->messages_order = $order; $this->messages_perpage = $r['per_page']; $this->messages_before = $r['before']; $this->thread_id = (int) $thread_id; // get the last message deleted for the thread static::get_user_last_deleted_message( $this->thread_id ); // Get messages for thread. $this->messages = self::get_messages( $this->thread_id, $this->messages_before, $this->messages_perpage, $this->messages_order ); $this->last_message = self::get_last_message( $this->thread_id ); $this->total_messages = self::get_messages_count( $this->thread_id ); if ( empty( $this->messages ) || is_wp_error( $this->messages ) ) { return false; } $this->last_message_id = $this->last_message->id; $this->last_message_date = $this->last_message->date_sent; $this->last_sender_id = $this->last_message->sender_id; $this->last_message_subject = $this->last_message->subject; $this->last_message_content = $this->last_message->message; $this->first_message_date = self::get_messages_started( $this->thread_id );; foreach ( (array) $this->messages as $key => $message ) { $this->sender_ids[ $message->sender_id ] = $message->sender_id; } // Fetch the recipients. $this->recipients = $this->get_recipients(); // Get the unread count for the logged in user. if ( isset( $this->recipients[ $r['user_id'] ] ) ) { $this->unread_count = $this->recipients[ $r['user_id'] ]->unread_count; } // Grab all message meta. if ( true === (bool) $r['update_meta_cache'] ) { bp_messages_update_meta_cache( wp_list_pluck( $this->messages, 'id' ) ); } /** * Fires after a BP_Messages_Thread object has been populated. * * @since BuddyPress 2.2.0 * * @param BP_Messages_Thread $this Message thread object. */ do_action( 'bp_messages_thread_post_populate', $this ); } /** * Mark a thread initialized in this class as read. * * @since BuddyPress 1.0.0 * * @see BP_Messages_Thread::mark_as_read() */ public function mark_read() { BP_Messages_Thread::mark_as_read( $this->thread_id ); } /** * Mark a thread initialized in this class as unread. * * @since BuddyPress 1.0.0 * * @see BP_Messages_Thread::mark_as_unread() */ public function mark_unread() { BP_Messages_Thread::mark_as_unread( $this->thread_id ); } /** * Returns recipients for a message thread. * * @since BuddyPress 1.0.0 * @since BuddyPress 2.3.0 Added $thread_id as a parameter. * * @param int $thread_id The thread ID. * @return array */ public function get_recipients( $thread_id = 0 ) { global $wpdb; if ( empty( $thread_id ) ) { $thread_id = $this->thread_id; } $thread_id = (int) $thread_id; $recipients = wp_cache_get( 'thread_recipients_' . $thread_id, 'bp_messages' ); if ( false === $recipients ) { $bp = buddypress(); $recipients = array(); $sql = $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id ); $results = $wpdb->get_results( $sql ); foreach ( (array) $results as $recipient ) { $recipients[ $recipient->user_id ] = $recipient; } wp_cache_set( 'thread_recipients_' . $thread_id, $recipients, 'bp_messages' ); } // Cast all items from the messages DB table as integers. foreach ( (array) $recipients as $key => $data ) { $recipients[ $key ] = (object) array_map( 'intval', (array) $data ); } /** * Filters the recipients of a message thread. * * @since BuddyPress 2.2.0 * * @param array $recipients Array of recipient objects. * @param int $thread_id ID of the current thread. */ return apply_filters( 'bp_messages_thread_get_recipients', $recipients, $thread_id ); } /** Static Functions ******************************************************/ /** * Check if the thread contains any deleted recipients and it's last active message * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function prepare_last_message_status( $thread_id ) { global $wpdb; $recipients = static::get_recipients_for_thread( $thread_id ); $deleted_recipients = array_filter($recipients, function( $recipient ) { return $recipient->is_deleted; }); return [ 'thread_id' => $thread_id, 'deleted_recipients' => $deleted_recipients, 'last_message' => static::get_last_message( $thread_id ) ]; } /** * Update the thread's deleted recipient and set the message deletion status * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function update_last_message_status( $data ) { extract( $data ); if ( ! $deleted_recipients ) { return; } if ( ! $last_message ) { return; } foreach ( $deleted_recipients as $recipient ) { // use add to allow multiple values bp_messages_add_meta( $last_message->id, 'deleted_by', $recipient->user_id ); } global $wpdb; $bp = buddypress(); $wpdb->query( $wpdb->prepare( " UPDATE {$bp->messages->table_name_recipients} SET is_deleted = 0 WHERE thread_id = %d AND user_id IN (%s) ", $thread_id, implode( ',', wp_list_pluck( $deleted_recipients, 'user_id' ) ) ) ); } /** * Get a thread's last message * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function get_last_message( $thread_id ) { global $wpdb; $bp = buddypress(); $messages = $wpdb->get_results( $wpdb->prepare( " SELECT * FROM {$bp->messages->table_name_messages} WHERE thread_id = %d ORDER BY date_sent DESC, id DESC LIMIT 1 ", $thread_id ) ); return $messages? (object) $messages[0] : null; } /** * Get all messages associated with a thread. * * @since BuddyPress 2.3.0 * * @param int $thread_id The message thread ID. * * @return object List of messages associated with a thread. */ public static function get_messages( $thread_id = 0, $before = null, $perpage = 10 ) { $thread_id = (int) $thread_id; $cache_key = "{$thread_id}{$before}{$perpage}"; $messages = wp_cache_get( $cache_key, 'bp_messages_threads' ); if ( false === $messages || static::$noCache ) { // if current user isn't the recpient, then return empty array if ( ! static::is_thread_recipient( $thread_id ) ) { wp_cache_set( $cache_key, [], 'bp_messages_threads' ); return []; } global $wpdb; $bp = buddypress(); $last_deleted_id = static::$last_deleted_message ? static::$last_deleted_message->id : 0; $last_deleted_timestamp = static::$last_deleted_message? static::$last_deleted_message->date_sent : '0000-00-00 00:00:00'; if ( ! $before ) { $before = bp_core_current_time(); // $before = gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS + 1 ) ) ); } // Always sort by DESC by default. $messages = $wpdb->get_results( $sql = $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_messages} WHERE thread_id = %d AND id > %d AND date_sent > %s AND date_sent <= %s ORDER BY date_sent DESC, id DESC LIMIT %d ", $thread_id, $last_deleted_id, $last_deleted_timestamp, $before, $perpage ) ); wp_cache_set( $cache_key, (array) $messages, 'bp_messages_threads' ); } // Integer casting. foreach ( $messages as $key => $data ) { $messages[ $key ]->id = (int) $messages[ $key ]->id; $messages[ $key ]->thread_id = (int) $messages[ $key ]->thread_id; $messages[ $key ]->sender_id = (int) $messages[ $key ]->sender_id; } return $messages; } /** * Count the totla message in thread * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function get_messages_count( $thread_id ) { global $wpdb; $bp = buddypress(); $thread_id = (int) $thread_id; if ( ! static::is_thread_recipient( $thread_id ) ) { return 0; } $last_deleted_timestamp = static::$last_deleted_message? static::$last_deleted_message->date_sent : '0000-00-00 00:00:00'; $results = $wpdb->get_col( $sql = $wpdb->prepare( "SELECT COUNT(*) FROM {$bp->messages->table_name_messages} WHERE thread_id = %d AND date_sent > %s ", $thread_id, $last_deleted_timestamp ) ); return intval( $results[0] ); } /** * Get the time of when the message is started, could be the first message * or the last deleted message of the current user * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function get_messages_started( $thread_id ) { global $wpdb; $bp = buddypress(); $thread_id = (int) $thread_id; $last_deleted_timestamp = static::$last_deleted_message? static::$last_deleted_message->date_sent : '0000-00-00 00:00:00'; $results = $wpdb->get_col( $sql = $wpdb->prepare( "SELECT date_sent FROM {$bp->messages->table_name_messages} WHERE thread_id = %d AND date_sent > %s ORDER BY date_sent ASC, id ASC LIMIT 1 ", $thread_id, $last_deleted_timestamp ) ); return $results[0]; } /** * Get the user's last deleted message in thread * * @since BuddyPress 1.0.0 * * @param int $thread_id */ public static function get_user_last_deleted_message( $thread_id ) { global $wpdb; $bp = buddypress(); $results = $wpdb->get_results( $wpdb->prepare( "SELECT m.* FROM {$bp->messages->table_name_messages} m LEFT JOIN {$bp->messages->table_name_meta} mm ON m.id = mm.message_id WHERE m.thread_id = %d AND ( mm.meta_key = 'deleted_by' AND mm.meta_value = %d ) ORDER BY m.date_sent DESC, m.id DESC LIMIT 1 ", $thread_id, bp_loggedin_user_id() ) ); if ( ! empty( $results ) ) { static::$last_deleted_message = (object) $results[0]; } return static::$last_deleted_message; } /** * Static method to get message recipients by thread ID. * * @since BuddyPress 2.3.0 * * @param int $thread_id The thread ID. * @return array */ public static function get_recipients_for_thread( $thread_id = 0 ) { $thread = new self( false ); return $thread->get_recipients( $thread_id ); } /** * Check if the current user is in the thread's active recipient list * * @since BuddyBoss 1.0.0 * * @param int $thread_id * @param mix $user_id */ public static function is_thread_recipient( $thread_id = 0, $user_id = null ) { if ( ! $user_id = $user_id ?: bp_loggedin_user_id() ) { return true; } $recipients = self::get_recipients_for_thread( $thread_id ); $active_recipients = array_filter( $recipients, function ( $recipient ) { return ! $recipient->is_deleted; }); return in_array( $user_id, wp_list_pluck( $active_recipients, 'user_id' )); } /** * Mark messages in a thread as deleted or delete all messages in a thread. * * Note: All messages in a thread are deleted once every recipient in a thread * has marked the thread as deleted. * * @since BuddyPress 1.0.0 * @since BuddyPress 2.7.0 The $user_id parameter was added. Previously the current user * was always assumed. * * @param int $thread_id The message thread ID. * @param int $user_id The ID of the user in the thread to mark messages as * deleted for. Defaults to the current logged-in user. * * @return bool */ public static function delete( $thread_id = 0, $user_id = 0 ) { global $wpdb; $thread_id = (int) $thread_id; $user_id = (int) $user_id; if ( empty( $user_id ) ) { $user_id = bp_loggedin_user_id(); } /** * Fires before a message thread is marked as deleted. * * @since BuddyPress 2.2.0 * @since BuddyPress 2.7.0 The $user_id parameter was added. * * @param int $thread_id ID of the thread being deleted. * @param int $user_id ID of the user that the thread is being deleted for. */ do_action( 'bp_messages_thread_before_mark_delete', $thread_id, $user_id ); $bp = buddypress(); // Mark messages as deleted $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET is_deleted = 1 WHERE thread_id = %d AND user_id = %d", $thread_id, $user_id ) ); // Get the message ids in order to pass to the action. $message_ids = $wpdb->get_col( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) ); /** * Fires before an entire message thread is deleted. * * @since BuddyPress 2.2.0 * * @param int $thread_id ID of the thread being deleted. * @param array $message_ids IDs of messages being deleted. */ do_action( 'bp_messages_thread_before_delete', $thread_id, $message_ids ); /** * Fires after a message thread is either marked as deleted or deleted. * * @since BuddyPress 2.2.0 * @since BuddyPress 2.7.0 The $user_id parameter was added. * * @param int $thread_id ID of the thread being deleted. * @param array $message_ids IDs of messages being deleted. * @param int $user_id ID of the user the threads were deleted for. */ do_action( 'bp_messages_thread_after_delete', $thread_id, $message_ids, $user_id ); return true; } /** * Get current message threads for a user. * * @since BuddyPress 1.0.0 * * @param array $args { * Array of arguments. * @type int $user_id The user ID. * @type string $box The type of mailbox to get. Either 'inbox' or 'sentbox'. * Defaults to 'inbox'. * @type string $type The type of messages to get. Either 'all' or 'unread' * or 'read'. Defaults to 'all'. * @type int $limit The number of messages to get. Defaults to null. * @type int $page The page number to get. Defaults to null. * @type string $search_terms The search term to use. Defaults to ''. * @type array $meta_query Meta query arguments. See WP_Meta_Query for more details. * } * @return array|bool Array on success. Boolean false on failure. */ public static function get_current_threads_for_user( $args = array() ) { global $wpdb; $bp = buddypress(); // Backward compatibility with old method of passing arguments. if ( ! is_array( $args ) || func_num_args() > 1 ) { _deprecated_argument( __METHOD__, '2.2.0', sprintf( __( 'Arguments passed to %1$s should be in an associative array. See the inline documentation at %2$s for more details.', 'buddyboss' ), __METHOD__, __FILE__ ) ); $old_args_keys = array( 0 => 'user_id', 1 => 'box', 2 => 'type', 3 => 'limit', 4 => 'page', 5 => 'search_terms', ); $args = bp_core_parse_args_array( $old_args_keys, func_get_args() ); } $r = bp_parse_args( $args, array( 'user_id' => false, 'box' => 'inbox', 'type' => 'all', 'limit' => null, 'page' => null, 'search_terms' => '', 'include' => false, 'meta_query' => array() ) ); $pag_sql = $type_sql = $search_sql = $user_id_sql = $sender_sql = $having_sql = ''; $current_user_participants_ids = []; $meta_query_sql = array( 'join' => '', 'where' => '' ); if ( $r['limit'] && $r['page'] ) { $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $r['page'] - 1 ) * $r['limit'] ), intval( $r['limit'] ) ); } $r['user_id'] = (int) $r['user_id']; $where_sql = '1 = 1'; if ( ! empty( $r['include'] ) ) { $user_threads_query = $r['include']; } else { $user_threads_query = $wpdb->prepare( " SELECT DISTINCT(thread_id) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0 ", $r['user_id'] ); } if ( ! empty( $r['search_terms'] ) ) { $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%'; $where_sql = $wpdb->prepare( "m.message LIKE %s", $search_terms_like ); $current_user_participants = $wpdb->get_results( $q = $wpdb->prepare( " SELECT DISTINCT(r.user_id), u.display_name FROM {$bp->messages->table_name_recipients} r LEFT JOIN {$wpdb->users} u ON r.user_id = u.ID WHERE r.thread_id IN ($user_threads_query) AND ( u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_nicename LIKE %s ) ", $search_terms_like, $search_terms_like, $search_terms_like ) ); $current_user_participants_ids = array_map( 'intval', wp_list_pluck( $current_user_participants, 'user_id' ) ); $current_user_participants_ids = array_diff( $current_user_participants_ids, [ bp_loggedin_user_id() ] ); if( $current_user_participants_ids ) { $user_ids = implode(',', array_unique($current_user_participants_ids)); $where_sql = $wpdb->prepare( " (m.message LIKE %s OR r.user_id IN ({$user_ids})) ", $search_terms_like ); } } $where_sql .= " AND r.thread_id IN ($user_threads_query)"; // Process meta query into SQL. $meta_query = self::get_meta_query_sql( $r['meta_query'] ); if ( ! empty( $meta_query['join'] ) ) { $meta_query_sql['join'] = $meta_query['join']; } if ( ! empty( $meta_query['where'] ) ) { $meta_query_sql['where'] = $meta_query['where']; } // Set up SQL array. $sql = array(); $sql['select'] = 'SELECT m.thread_id, MAX(m.date_sent) AS date_sent, GROUP_CONCAT(DISTINCT r.user_id ORDER BY r.user_id separator \',\' ) as recipient_list'; $sql['from'] = "FROM {$bp->messages->table_name_recipients} r INNER JOIN {$bp->messages->table_name_messages} m ON m.thread_id = r.thread_id {$meta_query_sql['join']}"; $sql['where'] = "WHERE {$where_sql} {$meta_query_sql['where']}"; $sql['misc'] = "GROUP BY m.thread_id {$having_sql} ORDER BY date_sent DESC {$pag_sql}"; // Get thread IDs. $thread_ids = $wpdb->get_results( $qq = implode( ' ', $sql ) ); // print_r($qq);die(); if ( empty( $thread_ids ) ) { return false; } // Adjust $sql to work for thread total. $sql['select'] = 'SELECT COUNT( DISTINCT m.thread_id )'; unset( $sql['misc'] ); $total_threads = $wpdb->get_var( implode( ' ', $sql ) ); // Sort threads by date_sent. foreach( (array) $thread_ids as $thread ) { $sorted_threads[ $thread->thread_id ] = strtotime( $thread->date_sent ); } arsort( $sorted_threads ); $threads = array(); foreach ( (array) $sorted_threads as $thread_id => $date_sent ) { $threads[] = new BP_Messages_Thread( $thread_id, 'ASC', array( 'update_meta_cache' => false ) ); } /** * Filters the results of the query for a user's message threads. * * @since BuddyPress 2.2.0 * * @param array $value { * @type array $threads Array of threads. Passed by reference. * @type int $total_threads Number of threads found by the query. * } */ return apply_filters( 'bp_messages_thread_current_threads', array( 'threads' => &$threads, 'total' => (int) $total_threads ) ); } /** * Get the SQL for the 'meta_query' param in BP_Messages_Thread::get_current_threads_for_user(). * * We use WP_Meta_Query to do the heavy lifting of parsing the meta_query array * and creating the necessary SQL clauses. * * @since BuddyPress 2.2.0 * * @param array $meta_query An array of meta_query filters. See the * documentation for WP_Meta_Query for details. * @return array $sql_array 'join' and 'where' clauses. */ public static function get_meta_query_sql( $meta_query = array() ) { global $wpdb; $sql_array = array( 'join' => '', 'where' => '', ); if ( ! empty( $meta_query ) ) { $meta_query = new WP_Meta_Query( $meta_query ); // WP_Meta_Query expects the table name at // $wpdb->messagemeta. $wpdb->messagemeta = buddypress()->messages->table_name_meta; return $meta_query->get_sql( 'message', 'm', 'id' ); } return $sql_array; } /** * Mark a thread as read. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * * @return false|int Number of threads marked as read or false on error. */ public static function mark_as_read( $thread_id = 0 ) { global $wpdb; $user_id = bp_displayed_user_id() ? bp_displayed_user_id() : bp_loggedin_user_id(); $bp = buddypress(); $retval = $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET unread_count = 0 WHERE user_id = %d AND thread_id = %d", $user_id, $thread_id ) ); wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' ); wp_cache_delete( $user_id, 'bp_messages_unread_count' ); /** * Fires when messages thread was marked as read. * * @since BuddyPress 2.8.0 * * @param int $thread_id The message thread ID. */ do_action( 'messages_thread_mark_as_read', $thread_id ); return $retval; } /** * Mark a thread as unread. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * * @return false|int Number of threads marked as unread or false on error. */ public static function mark_as_unread( $thread_id = 0 ) { global $wpdb; $user_id = bp_displayed_user_id() ? bp_displayed_user_id() : bp_loggedin_user_id(); $bp = buddypress(); $retval = $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET unread_count = 1 WHERE user_id = %d AND thread_id = %d", $user_id, $thread_id ) ); wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' ); wp_cache_delete( $user_id, 'bp_messages_unread_count' ); /** * Fires when messages thread was marked as unread. * * @since BuddyPress 2.8.0 * * @param int $thread_id The message thread ID. */ do_action( 'messages_thread_mark_as_unread', $thread_id ); return $retval; } /** * Returns the total number of message threads for a user. * * @since BuddyPress 1.0.0 * * @param int $user_id The user ID. * @param string $box The type of mailbox to get. Either 'inbox' or 'sentbox'. * Defaults to 'inbox'. * @param string $type The type of messages to get. Either 'all' or 'unread'. * or 'read'. Defaults to 'all'. * @return int $value Total thread count for the provided user. */ public static function get_total_threads_for_user( $user_id, $box = 'inbox', $type = 'all' ) { global $wpdb; $exclude_sender = $type_sql = ''; // $exclude_sender = 'AND sender_only != 1'; if ( $type === 'unread' ) { $type_sql = 'AND unread_count != 0'; } elseif ( $type === 'read' ) { $type_sql = 'AND unread_count = 0'; } $bp = buddypress(); return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(thread_id) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0 {$exclude_sender} {$type_sql}", $user_id ) ); } /** * Determine if the logged-in user is a sender of any message in a thread. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * @return bool */ public static function user_is_sender( $thread_id ) { global $wpdb; $bp = buddypress(); $sender_ids = $wpdb->get_col( $wpdb->prepare( "SELECT sender_id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) ); if ( empty( $sender_ids ) ) { return false; } return in_array( bp_loggedin_user_id(), $sender_ids ); } /** * Returns the userlink of the last sender in a message thread. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * @return string|bool The user link on success. Boolean false on failure. */ public static function get_last_sender( $thread_id ) { global $wpdb; $bp = buddypress(); if ( ! $sender_id = $wpdb->get_var( $wpdb->prepare( "SELECT sender_id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d GROUP BY sender_id ORDER BY date_sent LIMIT 1", $thread_id ) ) ) { return false; } return bp_core_get_userlink( $sender_id, true ); } /** * Gets the unread message count for a user. * * @since BuddyPress 1.0.0 * * @param int $user_id The user ID. * @return int $unread_count Total inbox unread count for user. */ public static function get_inbox_count( $user_id = 0 ) { global $wpdb; if ( empty( $user_id ) ) { $user_id = bp_loggedin_user_id(); } $unread_count = wp_cache_get( $user_id, 'bp_messages_unread_count' ); if ( false === $unread_count ) { $bp = buddypress(); // $unread_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT SUM(unread_count) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0 AND sender_only = 0", $user_id ) ); $unread_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT SUM(unread_count) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0", $user_id ) ); wp_cache_set( $user_id, $unread_count, 'bp_messages_unread_count' ); } /** * Filters a user's unread message count. * * @since BuddyPress 2.2.0 * * @param int $unread_count Unread message count. * @param int $user_id ID of the user. */ return apply_filters( 'messages_thread_get_inbox_count', (int) $unread_count, $user_id ); } /** * Checks whether a user is a part of a message thread discussion. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * @param int $user_id The user ID. * @return int|null The recorded recipient ID on success, null on failure. */ public static function check_access( $thread_id, $user_id = 0 ) { if ( empty( $user_id ) ) { $user_id = bp_loggedin_user_id(); } $recipients = self::get_recipients_for_thread( $thread_id ); if ( isset( $recipients[ $user_id ] ) && 0 == $recipients[ $user_id ]->is_deleted ) { return $recipients[ $user_id ]->id; } else { return null; } } /** * Checks whether a message thread exists. * * @since BuddyPress 1.0.0 * * @param int $thread_id The message thread ID. * @return false|int|null The message thread ID on success, null on failure. */ public static function is_valid( $thread_id = 0 ) { // Bail if no thread ID is passed. if ( empty( $thread_id ) ) { return false; } $thread = self::get_messages( $thread_id ); if ( ! empty( $thread ) ) { return $thread_id; } else { return null; } } /** * Returns a string containing all the message recipient userlinks. * * String is comma-delimited. * * If a message thread has more than four users, the returned string is simply * "X Recipients" where "X" is the number of recipients in the message thread. * * @since BuddyPress 1.0.0 * * @param array $recipients Array containing the message recipients (array of objects). * @return string $value String of message recipent userlinks. */ public static function get_recipient_links( $recipients ) { if ( count( $recipients ) >= 5 ) { return sprintf( __( '%s Recipients', 'buddyboss' ), number_format_i18n( count( $recipients ) ) ); } $recipient_links = array(); foreach ( (array) $recipients as $recipient ) { $recipient_link = bp_core_get_userlink( $recipient->user_id ); if ( empty( $recipient_link ) ) { $recipient_link = __( 'Deleted User', 'buddyboss' ); } $recipient_links[] = $recipient_link; } return implode( ', ', (array) $recipient_links ); } /** * Upgrade method for the older BP message thread DB table. * * @since BuddyPress 1.2.0 * * @todo We should remove this. No one is going to upgrade from v1.1, right? * @return bool */ public static function update_tables() { global $wpdb; $bp_prefix = bp_core_get_table_prefix(); $errors = false; $threads = $wpdb->get_results( "SELECT * FROM {$bp_prefix}bp_messages_threads" ); // Nothing to update, just return true to remove the table. if ( empty( $threads ) ) { return true; } $bp = buddypress(); foreach( (array) $threads as $thread ) { $message_ids = maybe_unserialize( $thread->message_ids ); if ( ! empty( $message_ids ) ) { $message_ids = implode( ',', $message_ids ); // Add the thread_id to the messages table. if ( ! $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_messages} SET thread_id = %d WHERE id IN ({$message_ids})", $thread->id ) ) ) { $errors = true; } } } return (bool) ! $errors; } }
Changelog
Version | Description |
---|---|
BuddyPress 1.0.0 | Introduced. |
Methods
- __construct — Constructor.
- check_access — Checks whether a user is a part of a message thread discussion.
- convert_orderby_to_order_by_term — Convert the 'orderby' param into a proper SQL term/column.
- delete — Mark messages in a thread as deleted or delete all messages in a thread.
- get — Query for recipients.
- get_current_threads_for_user — Get current message threads for a user.
- get_first_message — Get a thread first message
- get_inbox_count — Gets the unread message count for a user.
- get_last_message — Get a thread's last message
- get_last_sender — Returns the userlink of the last sender in a message thread.
- get_messages — Get all messages associated with a thread.
- get_messages_count — Count the totla message in thread
- get_messages_started — Get the time of when the message is started, could be the first message or the last deleted message of the current user
- get_meta_query_sql — Get the SQL for the 'meta_query' param in BP_Messages_Thread::get_current_threads_for_user().
- get_recipient_links — Returns a string containing all the message recipient userlinks.
- get_recipients — Returns recipients for a message thread.
- get_recipients_for_thread — Static method to get message recipients by thread ID.
- get_threads_for_user — Get message threads.
- get_total_threads_for_user — Returns the total number of message threads for a user.
- get_user_last_deleted_message — Get the user's last deleted message in thread
- is_thread_recipient — Check if the current user is in the thread's active recipient list
- is_valid — Checks whether a message thread exists.
- mark_as_read — Mark a thread as read.
- mark_as_unread — Mark a thread as unread.
- mark_read — Mark a thread initialized in this class as read.
- mark_unread — Mark a thread initialized in this class as unread.
- populate — Populate method.
- prepare_last_message_status — Check if the thread contains any deleted recipients and it's last active message
- update_last_message_status — Update the thread's deleted recipient and set the message deletion status
- update_tables — Upgrade method for the older BP message thread DB table.
- user_is_sender — Determine if the logged-in user is a sender of any message in a thread.
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.