Skip to:
Content

BuddyPress.org

Ticket #6063: 6063.meta-query.patch

File 6063.meta-query.patch, 10.0 KB (added by r-a-y, 10 years ago)
  • src/bp-messages/bp-messages-classes.php

    diff --git a/src/bp-messages/bp-messages-classes.php b/src/bp-messages/bp-messages-classes.php
    index 22eb564..67cc716 100644
    a b class BP_Messages_Thread { 
    359359                        'type'         => 'all',
    360360                        'limit'        => null,
    361361                        'page'         => null,
    362                         'search_terms' => ''
     362                        'search_terms' => '',
     363                        'meta_query'   => array()
    363364                );
    364365                $r = wp_parse_args( $args, $defaults );
    365366
    366367                $user_id_sql = $pag_sql = $type_sql = $search_sql = '';
     368                $meta_query_sql = array(
     369                        'join'  => '',
     370                        'where' => ''
     371                );
    367372
    368373                if ( $r['limit'] && $r['page'] ) {
    369374                        $pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $r['page'] - 1 ) * $r['limit'] ), intval( $r['limit'] ) );
    class BP_Messages_Thread { 
    390395                        }
    391396                }
    392397
     398                // Process meta query into SQL
     399                $meta_query = self::get_meta_query_sql( $r['meta_query'] );
     400                if ( ! empty( $meta_query['join'] ) ) {
     401                        $meta_query_sql['join'] = $meta_query['join'];
     402                }
     403                if ( ! empty( $meta_query['where'] ) ) {
     404                        $meta_query_sql['where'] = $meta_query['where'];
     405                }
     406
    393407                // set up SQL array
    394408                $sql = array();
    395409                $sql['select'] = 'SELECT m.thread_id, MAX(m.date_sent) AS date_sent';
    396                 $sql['from']   = "FROM {$bp->messages->table_name_recipients} r INNER JOIN {$bp->messages->table_name_messages} m";
    397                 $sql['where']  = "WHERE m.thread_id = r.thread_id {$user_id_sql} AND r.is_deleted = 0 {$type_sql} {$search_sql}";
     410                $sql['from']   = "FROM {$bp->messages->table_name_recipients} r INNER JOIN {$bp->messages->table_name_messages} m {$meta_query_sql['join']}";
     411                $sql['where']  = "WHERE m.thread_id = r.thread_id {$user_id_sql} AND r.is_deleted = 0 {$type_sql} {$search_sql} {$meta_query_sql['where']}";
    398412                $sql['misc']   = "GROUP BY m.thread_id ORDER BY date_sent DESC {$pag_sql}";
    399413
    400414                // get thread IDs
    class BP_Messages_Thread { 
    436450        }
    437451
    438452        /**
     453         * Get the SQL for the 'meta_query' param in BP_Messages_Thread::get_current_threads_for_user().
     454         *
     455         * We use WP_Meta_Query to do the heavy lifting of parsing the meta_query array
     456         * and creating the necessary SQL clauses.
     457         *
     458         * @since BuddyPress (2.2.0)
     459         *
     460         * @param array $meta_query An array of meta_query filters. See the
     461         *   documentation for WP_Meta_Query for details.
     462         * @return array $sql_array 'join' and 'where' clauses.
     463         */
     464        public static function get_meta_query_sql( $meta_query = array() ) {
     465                global $wpdb;
     466
     467                $sql_array = array(
     468                        'join'  => '',
     469                        'where' => '',
     470                );
     471
     472                if ( ! empty( $meta_query ) ) {
     473                        $meta_query = new WP_Meta_Query( $meta_query );
     474
     475                        // WP_Meta_Query expects the table name at
     476                        // $wpdb->messagemeta
     477                        $wpdb->messagemeta = buddypress()->messages->table_name_meta;
     478
     479                        return $meta_query->get_sql( 'message', 'm', 'id' );
     480                }
     481
     482                return $sql_array;
     483        }
     484
     485        /**
    439486         * Mark a thread as read.
    440487         *
    441488         * @since BuddyPress (1.0.0)
  • src/bp-messages/bp-messages-template.php

    diff --git a/src/bp-messages/bp-messages-template.php b/src/bp-messages/bp-messages-template.php
    index 6d25c0e..5b01f5b 100644
    a b class BP_Messages_Box_Template { 
    381381 *           the value of $_REQUEST['s'].
    382382 *     @type string $page_arg URL argument used for the pagination param.
    383383 *           Default: 'mpage'.
     384 *     @type array $meta_query Meta query arguments. Only applicable if $box is
     385 *           not 'notices'. See WP_Meta_Query more details.
    384386 * }
    385387 * @return bool True if there are threads to display, otherwise false.
    386388 */
    function bp_has_message_threads( $args = '' ) { 
    405407                'type'         => 'all',
    406408                'search_terms' => isset( $_REQUEST['s'] ) ? stripslashes( $_REQUEST['s'] ) : '',
    407409                'page_arg'     => 'mpage', // See https://buddypress.trac.wordpress.org/ticket/3679
     410                'meta_query'   => array()
    408411        ), 'has_message_threads' );
    409412
    410413        // If trying to access notices without capabilities, redirect to root domain
  • tests/phpunit/testcases/messages/template.php

    diff --git a/tests/phpunit/testcases/messages/template.php b/tests/phpunit/testcases/messages/template.php
    index ae2bd16..2e596a0 100644
    a b class BP_Tests_Messages_Template extends BP_UnitTestCase { 
    6868                $this->assertEquals( 1, $messages_template->thread_count );
    6969                $this->assertSame( array( $t1 ), wp_list_pluck( $messages_template->threads, 'thread_id' ) );
    7070        }
     71
     72        /**
     73         * @group bp_has_message_threads
     74         * @group meta_query
     75         */
     76        public function test_thread_has_messages_meta_query() {
     77                $u1 = $this->factory->user->create();
     78                $u2 = $this->factory->user->create();
     79
     80                // create some threads
     81                $t1 = $this->factory->message->create( array(
     82                        'sender_id'  => $u1,
     83                        'recipients' => array( $u2 ),
     84                        'subject'    => 'This is a knive',
     85                ) );
     86                $t2 = $this->factory->message->create( array(
     87                        'sender_id'  => $u1,
     88                        'recipients' => array( $u2 ),
     89                        'subject'    => 'Oy',
     90                ) );
     91
     92                // misc threads
     93                $this->factory->message->create_many( 3, array(
     94                        'sender_id'  => $u1,
     95                        'recipients' => array( $u2 ),
     96                ) );
     97
     98                // create some replies for thread 1
     99                $this->factory->message->create( array(
     100                        'thread_id'  => $t1,
     101                        'sender_id'  => $u2,
     102                        'recipients' => array( $u1 ),
     103                        'content'    => "That's a spoon",
     104                ) );
     105                $this->factory->message->create( array(
     106                        'thread_id'  => $t1,
     107                        'sender_id'  => $u1,
     108                        'recipients' => array( $u2 ),
     109                        'content'    => "I see you've played knivey-spooney before.",
     110                ) );
     111                $this->factory->message->create( array(
     112                        'thread_id'  => $t1,
     113                        'sender_id'  => $u2,
     114                        'recipients' => array( $u1 ),
     115                        'content'    => '*crickets*',
     116                ) );
     117
     118                // create some replies for thread 2
     119                $this->factory->message->create( array(
     120                        'thread_id'  => $t2,
     121                        'sender_id'  => $u2,
     122                        'recipients' => array( $u1 ),
     123                        'content'    => "Oy yourself.",
     124                ) );
     125
     126                // grab the message ids as individual variables for thread 1
     127                $thread = new BP_Messages_Thread( $t1 );
     128                $mids = wp_list_pluck( $thread->messages, 'id' );
     129                list( $m1, $m2, $m3, $m4 ) = $mids;
     130
     131                // grab the message ids as individual variables for thread 2
     132                $thread = new BP_Messages_Thread( $t2 );
     133                $mids = wp_list_pluck( $thread->messages, 'id' );
     134                list( $m5, $m6 ) = $mids;
     135
     136                // add meta for some of the messages
     137                bp_messages_update_meta( $m1, 'utensil',  'knive' );
     138                bp_messages_update_meta( $m1, 'is_knive', 'yes' );
     139                bp_messages_update_meta( $m1, "starred_by_user_{$u2}", true );
     140
     141                bp_messages_update_meta( $m2, 'utensil',  'spoon' );
     142                bp_messages_update_meta( $m2, 'is_knive', 'no' );
     143                bp_messages_update_meta( $m2, 'is_spoon', 'yes' );
     144
     145                bp_messages_update_meta( $m3, "starred_by_user_{$u2}", true );
     146
     147                bp_messages_update_meta( $m5, "starred_by_user_{$u2}", true );
     148
     149                // now, do the message thread loop query
     150                global $messages_template;
     151                bp_has_message_threads( array(
     152                        'user_id' => $u2,
     153                        'meta_query' => array(
     154                                array(
     155                                        'key' => "starred_by_user_{$u2}"
     156                                ),
     157                        )
     158                ) );
     159
     160                $this->assertEquals( 2, $messages_template->thread_count );
     161                $this->assertEqualSets( array( $t1, $t2 ), wp_list_pluck( $messages_template->threads, 'thread_id' ) );
     162        }
     163
     164        /**
     165         * @group bp_has_message_threads
     166         * @group meta_query
     167         */
     168        public function test_thread_has_messages_meta_query_multiple_clauses_relation_and() {
     169                $u1 = $this->factory->user->create();
     170                $u2 = $this->factory->user->create();
     171
     172                // create some threads
     173                $t1 = $this->factory->message->create( array(
     174                        'sender_id'  => $u1,
     175                        'recipients' => array( $u2 ),
     176                        'subject'    => 'This is a knive',
     177                ) );
     178                $t2 = $this->factory->message->create( array(
     179                        'sender_id'  => $u1,
     180                        'recipients' => array( $u2 ),
     181                        'subject'    => 'Oy',
     182                ) );
     183
     184                // misc threads
     185                $this->factory->message->create_many( 3, array(
     186                        'sender_id'  => $u1,
     187                        'recipients' => array( $u2 ),
     188                ) );
     189
     190                // create some replies for thread 1
     191                $this->factory->message->create( array(
     192                        'thread_id'  => $t1,
     193                        'sender_id'  => $u2,
     194                        'recipients' => array( $u1 ),
     195                        'content'    => "That's a spoon",
     196                ) );
     197                $this->factory->message->create( array(
     198                        'thread_id'  => $t1,
     199                        'sender_id'  => $u1,
     200                        'recipients' => array( $u2 ),
     201                        'content'    => "I see you've played knivey-spooney before.",
     202                ) );
     203                $this->factory->message->create( array(
     204                        'thread_id'  => $t1,
     205                        'sender_id'  => $u2,
     206                        'recipients' => array( $u1 ),
     207                        'content'    => '*crickets*',
     208                ) );
     209
     210                // create some replies for thread 2
     211                $this->factory->message->create( array(
     212                        'thread_id'  => $t2,
     213                        'sender_id'  => $u2,
     214                        'recipients' => array( $u1 ),
     215                        'content'    => "Oy yourself.",
     216                ) );
     217
     218                // grab the message ids as individual variables for thread 1
     219                $thread = new BP_Messages_Thread( $t1 );
     220                $mids = wp_list_pluck( $thread->messages, 'id' );
     221                list( $m1, $m2, $m3, $m4 ) = $mids;
     222
     223                // grab the message ids as individual variables for thread 2
     224                $thread = new BP_Messages_Thread( $t2 );
     225                $mids = wp_list_pluck( $thread->messages, 'id' );
     226                list( $m5, $m6 ) = $mids;
     227
     228                // add meta for some of the messages
     229                bp_messages_update_meta( $m1, 'utensil',  'knive' );
     230                bp_messages_update_meta( $m1, 'is_knive', 'yes' );
     231                bp_messages_update_meta( $m1, "starred_by_user_{$u2}", true );
     232
     233                bp_messages_update_meta( $m2, 'utensil',  'spoon' );
     234                bp_messages_update_meta( $m2, 'is_knive', 'no' );
     235                bp_messages_update_meta( $m2, 'is_spoon', 'yes' );
     236
     237                bp_messages_update_meta( $m3, "starred_by_user_{$u2}", true );
     238
     239                bp_messages_update_meta( $m5, "starred_by_user_{$u2}", true );
     240
     241                // now, do the message thread loop query
     242                global $messages_template;
     243                bp_has_message_threads( array(
     244                        'user_id' => $u2,
     245                        'meta_query' => array(
     246                                'relation' => 'AND',
     247                                array(
     248                                        'key' => "starred_by_user_{$u2}"
     249                                ),
     250                                array(
     251                                        'key' => 'utensil',
     252                                        'value' => 'knive',
     253                                ),
     254                        )
     255                ) );
     256
     257                $this->assertEquals( 1, $messages_template->thread_count );
     258                $this->assertEqualSets( array( $t1 ), wp_list_pluck( $messages_template->threads, 'thread_id' ) );
     259        }
    71260}
     261 No newline at end of file