WordPress.org

Make WordPress Core

Ticket #25775: 25775.diff

File 25775.diff, 6.3 KB (added by wonderboymusic, 6 years ago)
  • src/wp-includes/comment.php

     
    370370                        $groupby = "{$wpdb->comments}.comment_ID";
    371371                }
    372372
     373                $post_join = false;
    373374                if ( ! empty( $date_query ) && is_array( $date_query ) ) {
    374375                        $date_query_object = new WP_Date_Query( $date_query, 'comment_date' );
    375376                        $where .= $date_query_object->get_sql();
     377                        $post_join = $date_query_object->joins_posts;
    376378                }
    377379
    378380                $pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits', 'groupby' );
     
    380382                foreach ( $pieces as $piece )
    381383                        $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
    382384
     385                if ( $post_join && ( empty( $join ) || false === strpos( $join, $wpdb->posts ) )  ) {
     386                        $join = " JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) $join ";
     387                }
     388
    383389                if ( $groupby )
    384390                        $groupby = 'GROUP BY ' . $groupby;
    385391
  • src/wp-includes/date.php

     
    4646        public $compare = '=';
    4747
    4848        /**
     49         * Whether the passed arguments should produce a join.
     50         *
     51         * @since 3.8.0
     52         * @access public
     53         * @var boolean
     54         */
     55        public $joins_posts = null;
     56
     57        /**
     58         * Whether the passed arguments should produce a join.
     59         *
     60         * @since 3.8.0
     61         * @access public
     62         * @var boolean
     63         */
     64        public $joins_comments = null;
     65        /**
    4966         * Constructor.
    5067         *
    5168         * @param array $date_query {
     
    153170        }
    154171
    155172        /**
    156          * Validates a column name parameter.
     173         * Validates a column name parameter and prepends the appropriate $wpdb table name.
    157174         *
    158175         * @since 3.7.0
    159176         * @access public
    160177         *
    161178         * @param string $column The user-supplied column name.
    162          * @return string A validated column name value.
     179         * @return string A validated column name value prepended by its $wpdb table name.
    163180         */
    164181        public function validate_column( $column ) {
     182                global $wpdb;
    165183                $valid_columns = array(
    166184                        'post_date', 'post_date_gmt', 'post_modified',
    167185                        'post_modified_gmt', 'comment_date', 'comment_date_gmt'
     
    174192                 * @param array $valid_columns An array of valid date query columns. Defaults are 'post_date', 'post_date_gmt',
    175193                 *                             'post_modified', 'post_modified_gmt', 'comment_date', 'comment_date_gmt'
    176194                 */
    177                 if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) )
     195                if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) ) {
    178196                        $column = 'post_date';
     197                        $this->joins_posts = true;
     198                } elseif ( null === $this->joins_comments && false !== strpos( $column, 'comment_' ) ) {
     199                        $this->joins_comments = true;
     200                } elseif ( null === $this->joins_posts && false !== strpos( $column, 'post_' ) ) {
     201                        $this->joins_posts = true;
     202                }
    179203
     204                // Add our table prefix depending on what column we are looking at.
     205                if ( 0 === strpos( $column, 'comment' ) )
     206                        $column = "{$wpdb->comments}.{$column}";
     207                else if ( 0 === strpos( $column, 'post' ) )
     208                        $column = "{$wpdb->posts}.{$column}";
     209
    180210                return $column;
    181211        }
    182212
  • src/wp-includes/query.php

     
    23212321                unset( $date_parameters, $date_query );
    23222322
    23232323                // Handle complex date queries
     2324                $comment_join = false;
    23242325                if ( ! empty( $q['date_query'] ) ) {
    23252326                        $this->date_query = new WP_Date_Query( $q['date_query'] );
    23262327                        $where .= $this->date_query->get_sql();
     2328                        $comment_join = $this->date_query->joins_comments;
    23272329                }
    23282330
    2329 
    23302331                // If we've got a post_type AND it's not "any" post_type.
    23312332                if ( !empty($q['post_type']) && 'any' != $q['post_type'] ) {
    23322333                        foreach ( (array)$q['post_type'] as $_post_type ) {
     
    28862887                                $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
    28872888                }
    28882889
     2890                if ( $comment_join && ( empty( $join ) || false === strpos( $join, $wpdb->comments ) ) ) {
     2891                        $join = "INNER JOIN $wpdb->comments ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) $join ";
     2892                }
     2893
    28892894                if ( ! empty($groupby) )
    28902895                        $groupby = 'GROUP BY ' . $groupby;
    28912896                if ( !empty( $orderby ) )
  • tests/phpunit/tests/comment/dateQuery.php

     
    6060                $comments = $this->_get_query_result( array(
    6161                        'date_query' => array(
    6262                                array(
     63                                        'column' => 'comment_date',
    6364                                        'year' => 2008,
    6465                                ),
    6566                        ),
  • tests/phpunit/tests/query/dateQuery.php

     
    4444                );
    4545
    4646                foreach ( $post_dates as $post_date ) {
    47                         $this->factory->post->create( array( 'post_date' => $post_date ) );
     47                        $this->factory->post->create( array(
     48                                'post_date' => $post_date,
     49                                'post_date_gmt' => $post_date
     50                        ) );
    4851                }
    4952
    5053                unset( $this->q );
     
    555558
    556559                $this->assertEquals( $expected_dates, wp_list_pluck( $posts, 'post_date' ) );
    557560        }
     561
     562        public function test_date_column_prefixing() {
     563                global $wpdb;
     564                $columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt' );
     565                foreach ( $columns as $column ) {
     566                        $this->_get_query_result( array(
     567                                'date_query' => array(
     568                                        array(
     569                                                'column' => $column,
     570                                                'after' => '2009-12-18 10:42:29',
     571                                                'inclusive' => true,
     572                                        )
     573                                ),
     574                        ) );
     575                        $this->assertRegExp( "#{$wpdb->posts}\.{$column}#", $this->q->request );
     576                        $this->assertNotRegExp( "# $column#", $this->q->request );
     577                }
     578
     579                $ccolumns = array( 'comment_date', 'comment_date_gmt' );
     580                foreach ( $ccolumns as $column ) {
     581                        $this->_get_query_result( array(
     582                                'date_query' => array(
     583                                        array(
     584                                                'column' => $column,
     585                                                'after'     => '2009-12-18 10:42:29',
     586                                                'inclusive' => true,
     587                                        ),
     588                                ),
     589                        ) );
     590                        $this->assertRegExp( "#{$wpdb->comments}\.{$column}#", $this->q->request );
     591                        $this->assertNotRegExp( "# $column#", $this->q->request );
     592                }
     593        }
    558594}
     595 No newline at end of file