Skip to:
Content

Ticket #3083: 3083.02.patch

File 3083.02.patch, 21.8 KB (added by r-a-y, 4 years ago)
  • src/bp-core/admin/bp-core-schema.php

     
    304304                                KEY is_active (is_active)
    305305                        ) {$charset_collate};";
    306306
     307        $sql[] = "CREATE TABLE {$bp_prefix}bp_messages_meta (
     308                                id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     309                                message_id bigint(20) NOT NULL,
     310                                meta_key varchar(255) DEFAULT NULL,
     311                                meta_value longtext DEFAULT NULL,
     312                                KEY message_id (message_id),
     313                                KEY meta_key (meta_key)
     314                        ) {$charset_collate};";
     315
    307316        dbDelta( $sql );
    308317}
    309318
  • src/bp-core/bp-core-update.php

     
    241241                if ( $raw_db_version < 8311 ) {
    242242                        bp_update_to_2_0_1();
    243243                }
     244
     245                // 2.2
     246                if ( $raw_db_version < 9180 ) {
     247                        bp_update_to_2_2();
     248                }
    244249        }
    245250
    246251        /** All done! *************************************************************/
     
    390395}
    391396
    392397/**
     398 * 2.2.0 update routine.
     399 *
     400 * - Add messages meta table
     401 *
     402 * @since BuddyPress (2.2.0)
     403 */
     404function bp_update_to_2_2() {
     405        if ( bp_is_active( 'messages' ) ) {
     406                bp_core_install_private_messaging();
     407        }
     408}
     409
     410/**
    393411 * Redirect user to BP's What's New page on first page load after activation.
    394412 *
    395413 * @since BuddyPress (1.7.0)
  • src/bp-loader.php

     
    301301                /** Versions **********************************************************/
    302302
    303303                $this->version    = '2.2-alpha';
    304                 $this->db_version = 9167;
     304                $this->db_version = 9180;
    305305
    306306                /** Loading ***********************************************************/
    307307
  • src/bp-messages/bp-messages-cache.php

     
    1212// Exit if accessed directly
    1313if ( !defined( 'ABSPATH' ) ) exit;
    1414
     15/**
     16 * Slurp up metadata for a set of messages.
     17 *
     18 * It grabs all message meta associated with all of the messages passed in
     19 * $message_ids and adds it to WP cache. This improves efficiency when using
     20 * message meta within a loop context.
     21 *
     22 * @since BuddyPress (2.2.0)
     23 *
     24 * @param int|str|array $message_ids Accepts a single message_id, or a
     25 *        comma-separated list or array of message ids.
     26 */
     27function bp_messages_update_meta_cache( $message_ids = false ) {
     28        bp_update_meta_cache( array(
     29                'object_ids'       => $message_ids,
     30                'object_type'      => buddypress()->messages->id,
     31                'cache_group'      => 'message_meta',
     32                'object_column'    => 'message_id',
     33                'meta_table'       => buddypress()->messages->table_name_meta,
     34                'cache_key_prefix' => 'bp_messages_meta'
     35        ) );
     36}
     37
    1538// List actions to clear super cached pages on, if super cache is installed
    1639add_action( 'messages_delete_thread',  'bp_core_clear_cache' );
    1740add_action( 'messages_send_notice',    'bp_core_clear_cache' );
  • src/bp-messages/bp-messages-classes.php

     
    109109         *
    110110         * @since BuddyPress (1.0.0)
    111111         *
    112          * @param bool|int $thread_id The message thread ID.
    113          * @param string $order The order to sort the messages. Either 'ASC' or 'DESC'.
     112         * @see BP_Messages_Thread::populate() for full description of parameters
    114113         */
    115         public function __construct( $thread_id = false, $order = 'ASC' ) {
     114        public function __construct( $thread_id = false, $order = 'ASC', $args = array() ) {
    116115                if ( $thread_id ) {
    117                         $this->populate( $thread_id, $order );
     116                        $this->populate( $thread_id, $order, $args );
    118117                }
    119118        }
    120119
     
    127126         *
    128127         * @param int $thread_id The message thread ID.
    129128         * @param string $order The order to sort the messages. Either 'ASC' or 'DESC'.
     129         * @param array $args {
     130         *     Array of arguments.
     131         *     @type bool $update_meta_cache Whether to pre-fetch metadata for
     132         *           queried message items. Default: true.
     133         * }
    130134         * @return bool False on failure.
    131135         */
    132         public function populate( $thread_id, $order ) {
     136        public function populate( $thread_id = 0, $order = 'ASC', $args = array() ) {
    133137                global $wpdb, $bp;
    134138
    135139                if( 'ASC' != $order && 'DESC' != $order ) {
    136                         $order= 'ASC';
     140                        $order = 'ASC';
    137141                }
    138142
     143                // merge $args with our defaults
     144                $r = wp_parse_args( $args, array(
     145                        'update_meta_cache' => true
     146                ) );
     147
    139148                $this->messages_order = $order;
    140149                $this->thread_id      = $thread_id;
    141150
     
    155164                        $this->unread_count = $this->recipients[bp_loggedin_user_id()]->unread_count;
    156165                }
    157166
     167                // Grab all message meta
     168                if ( true === (bool) $r['update_meta_cache'] ) {
     169                        bp_messages_update_meta_cache( wp_list_pluck( $this->messages, 'id' ) );
     170                }
     171
    158172                /**
    159173                 * Fires after a BP_Messages_Thread object has been populated.
    160174                 *
     
    218232        /** Static Functions ******************************************************/
    219233
    220234        /**
    221          * Delete a message thread.
     235         * Mark messages in a thread as deleted or delete all messages in a thread.
     236         *
     237         * Note: All messages in a thread are deleted once every recipient in a thread
     238         * has marked the thread as deleted.
    222239         *
    223240         * @since BuddyPress (1.0.0)
    224241         *
    225242         * @param int $thread_id The message thread ID
    226          * @return bool
     243         * @return bool Always true... sucks.
    227244         */
    228245        public static function delete( $thread_id ) {
    229246                global $wpdb, $bp;
    230247
    231248                /**
    232                  * Fires before a message thread is deleted.
     249                 * Fires before a message thread is marked as deleted.
    233250                 *
    234251                 * @since BuddyPress (2.2.0)
    235252                 *
    236253                 * @param int $thread_id ID of the thread being deleted.
    237254                 */
    238                 do_action( 'bp_messages_thread_before_delete', $thread_id );
     255                do_action( 'bp_messages_thread_before_mark_delete', $thread_id );
    239256
    240257                // Mark messages as deleted
     258                //
     259                // @todo the reliance on bp_loggedin_user_id() sucks for plugins
     260                //       refactor this method to accept a $user_id parameter
    241261                $wpdb->query( $wpdb->prepare( "UPDATE {$bp->messages->table_name_recipients} SET is_deleted = 1 WHERE thread_id = %d AND user_id = %d", $thread_id, bp_loggedin_user_id() ) );
    242262
    243                 // Get the message id in order to pass to the action
    244                 $message_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );
     263                // Get the message ids in order to pass to the action
     264                $message_ids = $wpdb->get_col( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );
    245265
    246266                // Check to see if any more recipients remain for this message
    247                 // if not, then delete the message from the database.
    248267                $recipients = $wpdb->get_results( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d AND is_deleted = 0", $thread_id ) );
    249268
     269                // No more recipients so delete all messages associated with the thread
    250270                if ( empty( $recipients ) ) {
     271                        /**
     272                         * Fires before an entire message thread is deleted.
     273                         *
     274                         * @since BuddyPress (2.2.0)
     275                         *
     276                         * @param int $thread_id ID of the thread being deleted.
     277                         * @param array $message_ids IDs of messages being deleted
     278                         */
     279                        do_action( 'bp_messages_thread_before_delete', $thread_id, $message_ids );
     280
    251281                        // Delete all the messages
    252282                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) );
    253283
     284                        // Do something for each message ID
     285                        foreach ( $message_ids as $message_id ) {
     286                                // Delete message meta
     287                                bp_messages_delete_meta( $message_id );
     288
     289                                /**
     290                                 * Fires after a message is deleted. This hook is poorly named.
     291                                 *
     292                                 * @since BuddyPress (1.0.0)
     293                                 *
     294                                 * @param int $message_id ID of the message
     295                                 */
     296                                do_action( 'messages_thread_deleted_thread', $message_id );
     297                        }
     298
    254299                        // Delete all the recipients
    255300                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id ) );
    256301                }
    257302
    258303                /**
    259                  * Fires after a message thread is deleted.
     304                 * Fires after a message thread is either marked as deleted or deleted
    260305                 *
    261306                 * @since BuddyPress (2.2.0)
    262307                 *
    263308                 * @param int $thread_id ID of the thread being deleted.
    264309                 */
    265                 do_action( 'bp_messages_thread_after_delete', $message_id );
     310                do_action( 'bp_messages_thread_after_delete', $thread_id, $message_ids );
    266311
    267312                return true;
    268313        }
     
    325370
    326371                $threads = false;
    327372                foreach ( (array) $sorted_threads as $thread_id => $date_sent ) {
    328                         $threads[] = new BP_Messages_Thread( $thread_id );
     373                        $threads[] = new BP_Messages_Thread( $thread_id, 'ASC', array(
     374                                // need some feedback here...
     375                                // what are the chances a plugin will need the message meta during the inbox?
     376                                'update_meta_cache' => false
     377                        ) );
    329378                }
    330379
    331380                /**
  • src/bp-messages/bp-messages-functions.php

     
    335335function messages_is_valid_thread( $thread_id ) {
    336336        return BP_Messages_Thread::is_valid( $thread_id );
    337337}
     338
     339/** Messages Meta *******************************************************/
     340
     341/**
     342 * Delete metadata for a message.
     343 *
     344 * If $meta_key is false, this will delete all meta for the message ID.
     345 *
     346 * @since BuddyPress (2.2.0)
     347 *
     348 * @see delete_metadata() for full documentation excluding $meta_type variable.
     349 */
     350function bp_messages_delete_meta( $message_id, $meta_key = false, $meta_value = false, $delete_all = false ) {
     351        // Legacy - if no meta_key is passed, delete all for the item
     352        if ( empty( $meta_key ) ) {
     353                global $wpdb;
     354
     355                $keys = $wpdb->get_col( $wpdb->prepare( "SELECT meta_key FROM {$wpdb->messagemeta} WHERE message_id = %d", $message_id ) );
     356
     357                // With no meta_key, ignore $delete_all
     358                $delete_all = false;
     359        } else {
     360                $keys = array( $meta_key );
     361        }
     362
     363        // no keys, so stop now!
     364        if ( empty( $keys ) ) {
     365                return false;
     366        }
     367
     368        add_filter( 'query', 'bp_filter_metaid_column_name' );
     369
     370        foreach ( $keys as $key ) {
     371                $retval = delete_metadata( 'message', $message_id, $key, $meta_value, $delete_all );
     372        }
     373
     374        remove_filter( 'query', 'bp_filter_metaid_column_name' );
     375
     376        return $retval;
     377}
     378
     379/**
     380 * Get a piece of message metadata.
     381 *
     382 * @since BuddyPress (2.2.0)
     383 *
     384 * @see get_metadata() for full documentation excluding $meta_type variable.
     385 */
     386function bp_messages_get_meta( $message_id, $meta_key = '', $single = true ) {
     387        add_filter( 'query', 'bp_filter_metaid_column_name' );
     388        $retval = get_metadata( 'message', $message_id, $meta_key, $single );
     389        remove_filter( 'query', 'bp_filter_metaid_column_name' );
     390
     391        return $retval;
     392}
     393
     394/**
     395 * Update a piece of message metadata.
     396 *
     397 * @since BuddyPress (2.2.0)
     398 *
     399 * @see update_metadata() for full documentation excluding $meta_type variable.
     400 */
     401function bp_messages_update_meta( $message_id, $meta_key, $meta_value, $prev_value = '' ) {
     402        add_filter( 'query', 'bp_filter_metaid_column_name' );
     403        $retval = update_metadata( 'message', $message_id, $meta_key, $meta_value, $prev_value );
     404        remove_filter( 'query', 'bp_filter_metaid_column_name' );
     405
     406        return $retval;
     407}
     408
     409/**
     410 * Add a piece of message metadata.
     411 *
     412 * @since BuddyPress (2.2.0)
     413 *
     414 * @see add_metadata() for full documentation excluding $meta_type variable.
     415 */
     416function bp_message_add_meta( $message_id, $meta_key, $meta_value, $unique = false ) {
     417        add_filter( 'query', 'bp_filter_metaid_column_name' );
     418        $retval = add_metadata( 'message', $message_id, $meta_key, $meta_value, $unique );
     419        remove_filter( 'query', 'bp_filter_metaid_column_name' );
     420
     421        return $retval;
     422}
  • src/bp-messages/bp-messages-loader.php

     
    9090                $global_tables = array(
    9191                        'table_name_notices'    => $bp->table_prefix . 'bp_messages_notices',
    9292                        'table_name_messages'   => $bp->table_prefix . 'bp_messages_messages',
    93                         'table_name_recipients' => $bp->table_prefix . 'bp_messages_recipients'
     93                        'table_name_recipients' => $bp->table_prefix . 'bp_messages_recipients',
     94                        'table_name_meta'       => $bp->table_prefix . 'bp_messages_meta',
    9495                );
    9596
     97                // Metadata tables for messaging component
     98                $meta_tables = array(
     99                        'message' => $bp->table_prefix . 'bp_messages_meta',
     100                );
     101
     102                $this->autocomplete_all = defined( 'BP_MESSAGES_AUTOCOMPLETE_ALL' );
     103
    96104                // All globals for messaging component.
    97105                // Note that global_tables is included in this array.
    98                 $globals = array(
     106                parent::setup_globals( array(
    99107                        'slug'                  => BP_MESSAGES_SLUG,
    100108                        'has_directory'         => false,
    101109                        'notification_callback' => 'messages_format_notifications',
    102110                        'search_string'         => __( 'Search Messages...', 'buddypress' ),
    103                         'global_tables'         => $global_tables
    104                 );
    105 
    106                 $this->autocomplete_all = defined( 'BP_MESSAGES_AUTOCOMPLETE_ALL' );
    107 
    108                 parent::setup_globals( $globals );
     111                        'global_tables'         => $global_tables,
     112                        'meta_tables'           => $meta_tables
     113                ) );
    109114        }
    110115
    111116        /**
  • src/bp-messages/bp-messages-template.php

     
    14671467        /**
    14681468         * Constructor method.
    14691469         *
    1470          * @param int $thread_id ID of the message thread.
    1471          * @param string $order 'ASC' or 'DESC'.
     1470         * @see BP_Messages_Thread::populate() for full parameter info
    14721471         */
    1473         public function __construct( $thread_id, $order ) {
    1474                 $this->thread        = new BP_Messages_Thread( $thread_id, $order );
     1472        public function __construct( $thread_id, $order, $args ) {
     1473                $this->thread        = new BP_Messages_Thread( $thread_id, $order, $args );
    14751474                $this->message_count = count( $this->thread->messages );
    14761475
    14771476                $last_message_index                 = $this->message_count - 1;
     
    15721571 *           Default: if viewing a thread, the thread ID will be parsed from
    15731572 *           the URL (bp_action_variable( 0 )).
    15741573 *     @type string $order 'ASC' or 'DESC'. Default: 'ASC'.
     1574 *     @type bool $update_meta_cache Whether to pre-fetch metadata for
     1575 *           queried message items. Default: true.
    15751576 * }
    15761577 * @return bool True if there are messages to display, otherwise false.
    15771578 */
     
    15791580        global $thread_template;
    15801581
    15811582        $r = bp_parse_args( $args, array(
    1582                 'thread_id' => false,
    1583                 'order'     => 'ASC'
     1583                'thread_id'         => false,
     1584                'order'             => 'ASC',
     1585                'update_meta_cache' => true,
    15841586        ), 'thread_has_messages' );
    15851587
    15861588        if ( empty( $r['thread_id'] ) && bp_is_messages_component() && bp_is_current_action( 'view' ) ) {
    15871589                $r['thread_id'] = (int) bp_action_variable( 0 );
    15881590        }
    15891591
    1590         $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'] );
     1592        // Set up extra args
     1593        $extra_args = $r;
     1594        unset( $extra_args['thread_id'], $extra_args['order'] );
     1595
     1596        $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'], $extra_args );
    15911597
    15921598        return $thread_template->has_messages();
    15931599}
     
    19921998/**
    19931999 * Enable oEmbed support for Messages.
    19942000 *
    1995  * There's no caching as BP 1.5 does not have a Messages meta API.
    1996  *
    19972001 * @since BuddyPress (1.5.0)
    19982002 *
    19992003 * @see BP_Embed
    2000  *
    2001  * @todo Add Messages meta?
    20022004 */
    20032005function bp_messages_embed() {
    2004         add_filter( 'embed_post_id', 'bp_get_message_thread_id' );
     2006        add_filter( 'embed_post_id',         'bp_get_the_thread_message_id' );
     2007        add_filter( 'bp_embed_get_cache',    'bp_embed_message_cache',      10, 3 );
     2008        add_action( 'bp_embed_update_cache', 'bp_embed_message_save_cache', 10, 3 );
     2009}
     2010add_action( 'thread_loop_start', 'bp_messages_embed' );
     2011
     2012/**
     2013 * Fetch a private message item's cached embeds.
     2014 *
     2015 * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
     2016 *
     2017 * @since BuddyPress (2.2.0)
     2018 *
     2019 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for
     2020 *        functions like this one to filter.
     2021 * @param int $id The ID of the message item.
     2022 * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
     2023 * @return mixed The cached embeds for this message item.
     2024 */
     2025function bp_embed_message_cache( $cache, $id, $cachekey ) {
     2026        return bp_messages_get_meta( $id, $cachekey );
     2027}
     2028
     2029/**
     2030 * Set a private message item's embed cache.
     2031 *
     2032 * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}.
     2033 *
     2034 * @since BuddyPress (2.2.0)
     2035 *
     2036 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for
     2037 *        functions like this one to filter.
     2038 * @param string $cachekey The cache key generated in BP_Embed::parse_oembed().
     2039 * @param int $id The ID of the message item.
     2040 * @return bool True on success, false on failure.
     2041 */
     2042function bp_embed_message_save_cache( $cache, $cachekey, $id ) {
     2043        bp_messages_update_meta( $id, $cachekey, $cache );
    20052044}
    2006 add_action( 'messages_box_loop_start', 'bp_messages_embed' );
  • src/bp-templates/bp-legacy/buddypress-functions.php

     
    12981298
    12991299                bp_thread_has_messages( array( 'thread_id' => (int) $_REQUEST['thread_id'] ) );
    13001300
     1301                bp_thread_the_message();
     1302
    13011303                if ( $thread_template->message_count % 2 == 1 ) {
    13021304                        $class = 'odd';
    13031305                } else {
  • new file tests/phpunit/testcases/messages/cache.php

    new file mode 100644
    - +  
     1<?php
     2
     3/**
     4 * @group messages
     5 * @group cache
     6 */
     7class BP_Tests_Message_Cache extends BP_UnitTestCase {
     8        /**
     9         * @group bp_messages_update_meta_cache
     10         */
     11        public function test_bp_messages_update_meta_cache() {
     12                $u1 = $this->factory->user->create();
     13                $u2 = $this->factory->user->create();
     14
     15                // create the thread
     16                $t1 = $this->factory->message->create( array(
     17                        'sender_id'  => $u1,
     18                        'recipients' => array( $u2 ),
     19                        'subject'    => 'This is a knive',
     20                ) );
     21
     22                // create a reply
     23                $this->factory->message->create( array(
     24                        'thread_id'  => $t1,
     25                        'sender_id'  => $u2,
     26                        'recipients' => array( $u1 ),
     27                        'content'    => "That's a spoon",
     28                ) );
     29
     30                // grab the message ids as individual variables
     31                list( $m1, $m2 ) = $this->get_message_ids( $t1 );
     32
     33                // add cache for each message
     34                bp_messages_update_meta( $m1, 'utensil',  'knive' );
     35                bp_messages_update_meta( $m1, 'is_knive', 'yes' );
     36
     37                bp_messages_update_meta( $m2, 'utensil',  'spoon' );
     38                bp_messages_update_meta( $m2, 'is_knive', 'no' );
     39                bp_messages_update_meta( $m2, 'is_spoon', 'yes' );
     40
     41                // prime cache
     42                bp_messages_get_meta( $m1, 'utensil' );
     43
     44                // Ensure an empty cache for second message
     45                wp_cache_delete( $m2, 'message_meta' );
     46
     47                // update message meta cache
     48                bp_messages_update_meta_cache( array( $m1, $m2 ) );
     49
     50                $expected = array(
     51                        $m1 => array(
     52                                'utensil' => array(
     53                                        'knive',
     54                                ),
     55                                'is_knive' => array(
     56                                        'yes',
     57                                ),
     58                        ),
     59                        $m2 => array(
     60                                'utensil' => array(
     61                                        'spoon',
     62                                ),
     63                                'is_knive' => array(
     64                                        'no',
     65                                ),
     66                                'is_spoon' => array(
     67                                        'yes',
     68                                ),
     69                        ),
     70                );
     71
     72                $found = array(
     73                        $m1 => wp_cache_get( $m1, 'message_meta' ),
     74                        $m2 => wp_cache_get( $m2, 'message_meta' ),
     75                );
     76
     77                $this->assertEquals( $expected, $found );
     78        }
     79
     80        /**
     81         * @group bp_messages_update_meta_cache
     82         * @group bp_thread_has_messages
     83         */
     84        public function test_bp_messages_metadata_cache_in_message_loop() {
     85                $u1 = $this->factory->user->create();
     86                $u2 = $this->factory->user->create();
     87
     88                // create the thread
     89                $t1 = $this->factory->message->create( array(
     90                        'sender_id'  => $u1,
     91                        'recipients' => array( $u2 ),
     92                        'subject'    => 'Oy',
     93                ) );
     94
     95                // add message cache
     96                list( $m1 ) = $this->get_message_ids( $t1 );
     97                bp_messages_update_meta( $m1, 'yolo', 'gah' );
     98
     99                // prime meta cache in message loop
     100                bp_thread_has_messages( array(
     101                        'thread_id' => $t1,
     102                        'update_meta_cache' => true
     103                ) );
     104
     105                $this->assertNotEmpty( wp_cache_get( $m1, 'message_meta' ) );
     106        }
     107
     108        /**
     109         * @group bp_messages_delete_meta
     110         * @group messages_delete_thread
     111         */
     112        public function test_bp_messages_delete_metadata_cache_on_thread_delete() {
     113                $this->old_current_user = get_current_user_id();
     114
     115                $u1 = $this->factory->user->create();
     116                $u2 = $this->factory->user->create();
     117
     118                // create the thread
     119                $t1 = $this->factory->message->create( array(
     120                        'sender_id'  => $u1,
     121                        'recipients' => array( $u2 ),
     122                        'subject'    => 'Oy',
     123                ) );
     124
     125                // create a reply
     126                $this->factory->message->create( array(
     127                        'thread_id'  => $t1,
     128                        'sender_id'  => $u2,
     129                        'recipients' => array( $u1 ),
     130                        'content'    => 'Yo',
     131                ) );
     132
     133                // add message meta
     134                list( $m1, $m2 ) = $this->get_message_ids( $t1 );
     135                bp_messages_update_meta( $m1, 'yolo', 'gah' );
     136                bp_messages_update_meta( $m2, 'yolo', 'bah' );
     137
     138                // prime message meta cache
     139                bp_messages_get_meta( $m1, 'yolo' );
     140                bp_messages_get_meta( $m2, 'yolo' );
     141
     142                // delete thread
     143                // to outright delete a thread, both recipients must delete it
     144                $this->set_current_user( $u1 );
     145                messages_delete_thread( $t1 );
     146                $this->set_current_user( $u2 );
     147                messages_delete_thread( $t1 );
     148
     149                // assert empty meta cache
     150                $this->assertEmpty( wp_cache_get( $m1, 'message_meta' ) );
     151                $this->assertEmpty( wp_cache_get( $m2, 'message_meta' ) );
     152
     153                // cleanup
     154                $this->set_current_user( $this->old_current_user );
     155        }
     156
     157        /**
     158         * Helper method to grab the message IDs from a message thread.
     159         *
     160         * @param int $thread_id The message thread ID
     161         * @return array
     162         */
     163        protected function get_message_ids( $thread_id = 0 ) {
     164                $thread = new BP_Messages_Thread( $thread_id );
     165                return wp_list_pluck( $thread->messages, 'id' );
     166        }
     167}