Skip to:
Content

Ticket #3083: 3083.01.patch

File 3083.01.patch, 14.5 KB (added by r-a-y, 3 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.0.1 
     246                if ( $raw_db_version < 9155 ) { 
     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.0.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 = 8311; 
     304                $this->db_version = 9155; 
    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 group 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_groupmeta' 
     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 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         */ 
    131         public function populate( $thread_id, $order ) { 
     135        public function populate( $thread_id, $order = 'ASC', $args = array() ) { 
    132136                global $wpdb, $bp; 
    133137 
    134138                if( 'ASC' != $order && 'DESC' != $order ) { 
    135                         $order= 'ASC'; 
     139                        $order = 'ASC'; 
    136140                } 
    137141 
     142                // merge $args with our defaults 
     143                $r = wp_parse_args( $args, array( 
     144                        'update_meta_cache' => true 
     145                ) ); 
     146 
    138147                $this->messages_order = $order; 
    139148                $this->thread_id      = $thread_id; 
    140149 
     
    153162                if ( isset( $this->recipients[bp_loggedin_user_id()] ) ) { 
    154163                        $this->unread_count = $this->recipients[bp_loggedin_user_id()]->unread_count; 
    155164                } 
     165 
     166                // Grab all message meta 
     167                if ( true === (bool) $r['update_meta_cache'] ) { 
     168                        bp_messages_update_meta_cache( wp_list_pluck( $this->messages, 'id' ) ); 
     169                } 
    156170        } 
    157171 
    158172        /** 
     
    212226                // Mark messages as deleted 
    213227                $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() ) ); 
    214228 
    215                 // Get the message id in order to pass to the action 
    216                 $message_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) ); 
     229                // Get the message ids in order to pass to the action 
     230                $message_ids = $wpdb->get_col( $wpdb->prepare( "SELECT id FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) ); 
    217231 
    218232                // Check to see if any more recipients remain for this message 
    219233                // if not, then delete the message from the database. 
     
    223237                        // Delete all the messages 
    224238                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_messages} WHERE thread_id = %d", $thread_id ) ); 
    225239 
     240                        // Delete message meta 
     241                        foreach ( $message_ids as $message_id ) { 
     242                                bp_messages_delete_meta( $message_id ); 
     243                        } 
     244 
    226245                        // Delete all the recipients 
    227246                        $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id ) ); 
    228247                } 
    229248 
    230                 do_action( 'messages_thread_deleted_thread', $message_id ); 
     249                do_action( 'messages_thread_deleted_thread', $message_ids, $thread_id ); 
    231250 
    232251                return true; 
    233252        } 
     
    290309 
    291310                $threads = false; 
    292311                foreach ( (array) $sorted_threads as $thread_id => $date_sent ) { 
    293                         $threads[] = new BP_Messages_Thread( $thread_id ); 
     312                        $threads[] = new BP_Messages_Thread( $thread_id, 'ASC', array( 
     313                                // need some feedback here... 
     314                                // what are the chances a plugin will need the message meta during the inbox? 
     315                                'update_meta_cache' => false 
     316                        ) ); 
    294317                } 
    295318 
    296319                return array( 'threads' => &$threads, 'total' => (int) $total_threads ); 
  • 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        global $wpdb; 
     352 
     353        // Legacy - if no meta_key is passed, delete all for the item 
     354        if ( empty( $meta_key ) ) { 
     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        add_filter( 'query', 'bp_filter_metaid_column_name' ); 
     364 
     365        foreach ( $keys as $key ) { 
     366                $retval = delete_metadata( 'message', $message_id, $key, $meta_value, $delete_all ); 
     367        } 
     368 
     369        remove_filter( 'query', 'bp_filter_metaid_column_name' ); 
     370 
     371        return $retval; 
     372} 
     373 
     374/** 
     375 * Get a piece of group metadata. 
     376 * 
     377 * @since BuddyPress (2.2.0) 
     378 * 
     379 * @see get_metadata() for full documentation excluding $meta_type variable. 
     380 */ 
     381function bp_messages_get_meta( $message_id, $meta_key = '', $single = true ) { 
     382        add_filter( 'query', 'bp_filter_metaid_column_name' ); 
     383        $retval = get_metadata( 'message', $message_id, $meta_key, $single ); 
     384        remove_filter( 'query', 'bp_filter_metaid_column_name' ); 
     385 
     386        return $retval; 
     387} 
     388 
     389/** 
     390 * Update a piece of message metadata. 
     391 * 
     392 * @since BuddyPress (2.2.0) 
     393 * 
     394 * @see update_metadata() for full documentation excluding $meta_type variable. 
     395 */ 
     396function bp_messages_update_meta( $message_id, $meta_key, $meta_value, $prev_value = '' ) { 
     397        add_filter( 'query', 'bp_filter_metaid_column_name' ); 
     398        $retval = update_metadata( 'message', $message_id, $meta_key, $meta_value, $prev_value ); 
     399        remove_filter( 'query', 'bp_filter_metaid_column_name' ); 
     400 
     401        return $retval; 
     402} 
     403 
     404/** 
     405 * Add a piece of message metadata. 
     406 * 
     407 * @since BuddyPress (2.2.0) 
     408 * 
     409 * @see add_metadata() for full documentation excluding $meta_type variable. 
     410 */ 
     411function bp_message_add_meta( $message_id, $meta_key, $meta_value, $unique = false ) { 
     412        add_filter( 'query', 'bp_filter_metaid_column_name' ); 
     413        $retval = add_metadata( 'message', $message_id, $meta_key, $meta_value, $unique ); 
     414        remove_filter( 'query', 'bp_filter_metaid_column_name' ); 
     415 
     416        return $retval; 
     417} 
  • 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

     
    14051405 *           Default: if viewing a thread, the thread ID will be parsed from 
    14061406 *           the URL (bp_action_variable( 0 )). 
    14071407 *     @type string $order 'ASC' or 'DESC'. Default: 'ASC'. 
     1408 *     @type bool $update_meta_cache Whether to pre-fetch metadata for 
     1409 *           queried message items. Default: true. 
    14081410 * } 
    14091411 * @return bool True if there are messages to display, otherwise false. 
    14101412 */ 
     
    14121414        global $thread_template; 
    14131415 
    14141416        $r = bp_parse_args( $args, array( 
    1415                 'thread_id' => false, 
    1416                 'order'     => 'ASC' 
     1417                'thread_id'         => false, 
     1418                'order'             => 'ASC', 
     1419                'update_meta_cache' => true, 
    14171420        ), 'thread_has_messages' ); 
    14181421 
    14191422        if ( empty( $r['thread_id'] ) && bp_is_messages_component() && bp_is_current_action( 'view' ) ) { 
    14201423                $r['thread_id'] = (int) bp_action_variable( 0 ); 
    14211424        } 
    14221425 
    1423         $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'] ); 
     1426        // Set up extra args 
     1427        $extra_args = $r; 
     1428        unset( $extra_args['thread_id'], $extra_args['order'] ); 
     1429 
     1430        $thread_template = new BP_Messages_Thread_Template( $r['thread_id'], $r['order'], $extra_args ); 
    14241431 
    14251432        return $thread_template->has_messages(); 
    14261433} 
     
    18341841 * @todo Add Messages meta? 
    18351842 */ 
    18361843function bp_messages_embed() { 
    1837         add_filter( 'embed_post_id', 'bp_get_message_thread_id' ); 
     1844        add_filter( 'embed_post_id',         'bp_get_the_thread_message_id' ); 
     1845        add_filter( 'bp_embed_get_cache',    'bp_embed_message_cache',      10, 3 ); 
     1846        add_action( 'bp_embed_update_cache', 'bp_embed_message_save_cache', 10, 3 ); 
     1847} 
     1848add_action( 'thread_loop_start', 'bp_messages_embed' ); 
     1849 
     1850/** 
     1851 * Fetch a private message item's cached embeds. 
     1852 * 
     1853 * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}. 
     1854 * 
     1855 * @since BuddyPress (2.2.0) 
     1856 * 
     1857 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for 
     1858 *        functions like this one to filter. 
     1859 * @param int $id The ID of the activity item. 
     1860 * @param string $cachekey The cache key generated in BP_Embed::parse_oembed(). 
     1861 * @return mixed The cached embeds for this activity item. 
     1862 */ 
     1863function bp_embed_message_cache( $cache, $id, $cachekey ) { 
     1864        return bp_messages_get_meta( $id, $cachekey ); 
     1865} 
     1866 
     1867/** 
     1868 * Set a private message item's embed cache. 
     1869 * 
     1870 * Used during {@link BP_Embed::parse_oembed()} via {@link bp_messages_embed()}. 
     1871 * 
     1872 * @since BuddyPress (2.2.0) 
     1873 * 
     1874 * @param string $cache An empty string passed by BP_Embed::parse_oembed() for 
     1875 *        functions like this one to filter. 
     1876 * @param string $cachekey The cache key generated in BP_Embed::parse_oembed(). 
     1877 * @param int $id The ID of the activity item. 
     1878 * @return bool True on success, false on failure. 
     1879 */ 
     1880function bp_embed_message_save_cache( $cache, $cachekey, $id ) { 
     1881        bp_messages_update_meta( $id, $cachekey, $cache ); 
    18381882} 
    1839 add_action( 'messages_box_loop_start', 'bp_messages_embed' ); 
     1883 No newline at end of file 
  • 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 {