BP_Messages_Thread::get_threads_for_user( array $args = array() )
Get message threads.
Description
Parameters
- $args
-
(Optional) Array of arguments
Default value: array()
Return
(array|bool) Array on success. Boolean false on failure.
Source
File: bp-messages/classes/class-bp-messages-thread.php
public static function get_threads_for_user( $args = array() ) { global $wpdb; $bp = buddypress(); $function_args = func_get_args(); // Backward compatibility with old method of passing arguments. if ( ! is_array( $args ) || count( $function_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, $function_args ); } $r = bp_parse_args( $args, array( 'user_id' => false, 'box' => 'inbox', 'type' => 'all', 'limit' => null, 'page' => null, 'search_terms' => '', 'include' => false, 'is_hidden' => false, 'meta_query' => array(), 'fields' => 'all', 'having_sql' => false, ) ); $pag_sql = $user_threads_query = $having_sql = ''; $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']; } elseif ( ! empty( $r['user_id'] ) ) { $user_threads_sql = "SELECT DISTINCT(thread_id) FROM {$bp->messages->table_name_recipients} WHERE user_id = %d AND is_deleted = 0"; if ( false === $r['is_hidden'] && empty( $r['search_terms'] ) ) { $user_threads_sql .= " AND is_hidden = 0"; } $user_threads_query = $wpdb->prepare( $user_threads_sql, $r['user_id'] ); } $group_thread_in = array(); if ( ! empty( $r['search_terms'] ) ) { // Search in xprofile field. $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%'; $where_sql = $wpdb->prepare( 'm.message LIKE %s', $search_terms_like ); $participants_sql = array(); $participants_sql['select'] = "SELECT DISTINCT(r.user_id), u.display_name"; $participants_sql['from'] = "FROM {$bp->messages->table_name_recipients} r LEFT JOIN {$wpdb->users} u ON r.user_id = u.ID"; $participants_sql['where'] = "WHERE 1=1"; if ( ! empty( $user_threads_query ) ) { $participants_sql['where'] .= " AND r.thread_id IN ($user_threads_query)"; } $participants_sql['where_like'] = "u.display_name LIKE %s OR u.user_login LIKE %s OR u.user_nicename LIKE %s"; $participants_args = array( $search_terms_like, $search_terms_like, $search_terms_like ); // Search in xprofile field if ( bp_is_active( 'xprofile' ) ) { // Explode the value if there is a space in search term. $split_name = explode( ' ', $r['search_terms'] ); $participants_sql['from'] .= " LEFT JOIN {$bp->profile->table_name_data} spd ON r.user_id = spd.user_id"; if ( isset( $split_name ) && isset( $split_name[0] ) && isset( $split_name[1] ) && ! empty( $split_name ) && ! empty( trim( $split_name[0] ) ) && ! empty( trim( $split_name[1] ) ) ) { $participants_sql['where_like'] .= ' OR spd.value LIKE %s OR spd.value LIKE %s'; $participants_args[] = $split_name[0]; $participants_args[] = $split_name[1]; } else { $participants_sql['where_like'] .= ' OR spd.value LIKE %s'; $participants_args[] = $search_terms_like; } } $participants_sql['where'] .= " AND ( {$participants_sql['where_like']} )"; $participants_sql = "{$participants_sql['select']} {$participants_sql['from']} {$participants_sql['where']}"; $current_user_participants = $wpdb->get_results( $wpdb->prepare( $participants_sql, $participants_args ) ); $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, array( bp_loggedin_user_id() ) ); // Search Group Thread via Group Name via search_terms $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%'; $groups = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->groups->table_name} g WHERE g.name LIKE %s", $search_terms_like ) ); $group_creator_ids = array_map( 'intval', wp_list_pluck( $groups, 'creator_id' ) ); // If Group Found if ( ! empty( $group_creator_ids ) ) { if ( is_array( $current_user_participants_ids ) ) { $current_user_participants_ids = array_merge( $current_user_participants_ids, $group_creator_ids ); } else { $current_user_participants_ids = $group_creator_ids; } } // Search for deleted Group OR Deleted Users. Todo: Need refactor code $value = "(deleted)|(group)|(Deleted)|(group)|(user)|(User)|(del)|(Del)|(dele)|(Dele)|(dele)|(Dele)|(delet)|(Delet)|(use)|(Use)"; if ( preg_match_all( '/\b' . $value . '\b/i', $r['search_terms'], $dest ) ) { // For deleted users. $current_user_participants_query = self::get( array( 'exclude_active_users' => true, 'per_page' => - 1, ) ); $current_user_participants = ( ! empty( $current_user_participants_query['recipients'] ) ) ? array_unique( array_map( 'intval', wp_list_pluck( $current_user_participants_query['recipients'], 'user_id' ) ) ) : array(); if ( ! empty( $current_user_participants ) ) { $deleted_user_ids = $current_user_participants; if ( is_array( $current_user_participants_ids ) ) { $current_user_participants_ids = array_merge( $current_user_participants_ids, $deleted_user_ids ); } else { $current_user_participants_ids = $deleted_user_ids; } } // For deleted groups fetch all thread first. $threads = self::get( array( 'per_page' => - 1, ) ); $thread_ids = ( ! empty( $threads['recipients'] ) ) ? array_map( 'intval', wp_list_pluck( $threads['recipients'], 'thread_id' ) ) : array(); // If Group Found if ( ! empty( $thread_ids ) ) { foreach ( $thread_ids as $thread ) { // Get the group id from the first message $first_message = BP_Messages_Thread::get_first_message( $thread ); $message_group_id = (int) bp_messages_get_meta( $first_message->id, 'group_id', true ); // group id if ( $message_group_id ) { if ( bp_is_active( 'groups' ) ) { $group_name = bp_get_group_name( groups_get_group( $message_group_id ) ); } else { $group_name = $wpdb->get_var( "SELECT name FROM {$groups_table} WHERE id = '{$message_group_id}';" ); // db call ok; no-cache ok; } if ( empty( $group_name ) ) { $group_thread_in[] = $thread; } } } } } 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 ); if ( ! empty( $group_thread_in ) ) { $thread_in = implode( ',', $group_thread_in ); $where_sql .= " OR r.thread_id IN ({$thread_in})"; } $where_sql .= ' )'; } } if ( ! empty( $user_threads_query ) ) { $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']; } if ( ! empty( $r['having_sql'] ) ) { $having_sql = $r['having_sql']; } // 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}"; /** * Filters the Where SQL statement. * * @since BuddyBoss 1.5.4 * * @param array $r Array of parsed arguments for the get method. * @param array $where_conditions Where conditions SQL statement. */ $sql['where'] = apply_filters( 'bp_messages_recipient_get_where_conditions', $sql['where'], $r ); /** * Filters the From SQL statement. * * @since BuddyBoss 1.5.4 * * @param array $r Array of parsed arguments for the get method. * @param string $sql From SQL statement. */ $sql['from'] = apply_filters( 'bp_messages_recipient_get_join_sql', $sql['from'], $r ); // 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(); if ( 'ids' === $r['fields'] ) { $threads = array_keys( $sorted_threads ); } elseif ( 'select' === $r['fields'] ) { $threads = $thread_ids; } else { 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, ) ); }
Changelog
Version | Description |
---|---|
BuddyPress 1.0.0 | 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.