Make WordPress Core

Changeset 31179


Ignore:
Timestamp:
01/14/2015 04:50:09 PM (12 years ago)
Author:
boonebgorges
Message:

Support array values in WP_Date_Query::validate_date_values().

Introduced in [29925], validate_date_values() throws _doing_it_wrong()
notices when values passed as part of a WP_Date_Query do not reflect actual
dates. However, the validation did not account properly for the case where an
array of multiple values is passed, as when doing IN or BETWEEN queries.

Props dlh.
Fixes #31001 for trunk.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/date.php

    r31090 r31179  
    305305                // Days per year.
    306306                if ( array_key_exists( 'year', $date_query ) ) {
    307                         // If a year exists in the date query, we can use it to get the days.
    308                         $max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $date_query['year'] ) ) + 1;
     307                        /*
     308                         * If a year exists in the date query, we can use it to get the days.
     309                         * If multiple years are provided (as in a BETWEEN), use the first one.
     310                         */
     311                        if ( is_array( $date_query['year'] ) ) {
     312                                $_year = reset( $date_query['year'] );
     313                        } else {
     314                                $_year = $date_query['year'];
     315                        }
     316
     317                        $max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1;
    309318                } else {
    310319                        // otherwise we use the max of 366 (leap-year)
     
    336345
    337346                // Weeks per year.
    338                 if ( array_key_exists( 'year', $date_query ) ) {
     347                if ( isset( $_year ) ) {
    339348                        // If we have a specific year, use it to calculate number of weeks.
    340349                        $date = new DateTime();
    341                         $date->setISODate( $date_query['year'], 53 );
     350                        $date->setISODate( $_year, 53 );
    342351                        $week_count = $date->format( "W" ) === "53" ? 53 : 52;
    343352
     
    382391                        }
    383392
    384                         $is_between = $date_query[ $key ] >= $check['min'] && $date_query[ $key ] <= $check['max'];
    385 
    386                         if ( ! $is_between ) {
    387 
    388                                 $error = sprintf(
    389                                         /* translators: Date query invalid date message: 1: invalid value, 2: type of value, 3: minimum valid value, 4: maximum valid value */
    390                                         __( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ),
    391                                         '<code>' . esc_html( $date_query[ $key ] ) . '</code>',
    392                                         '<code>' . esc_html( $key ) . '</code>',
    393                                         '<code>' . esc_html( $check['min'] ) . '</code>',
    394                                         '<code>' . esc_html( $check['max'] ) . '</code>'
    395                                 );
    396 
    397                                 _doing_it_wrong( __CLASS__, $error, '4.1.0' );
    398 
    399                                 $valid = false;
     393                        // Throw a notice for each failing value.
     394                        $is_between = true;
     395                        foreach ( (array) $date_query[ $key ] as $_value ) {
     396                                $is_between = $_value >= $check['min'] && $_value <= $check['max'];
     397
     398                                if ( ! $is_between ) {
     399                                        $error = sprintf(
     400                                                /* translators: Date query invalid date message: 1: invalid value, 2: type of value, 3: minimum valid value, 4: maximum valid value */
     401                                                __( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ),
     402                                                '<code>' . esc_html( $_value ) . '</code>',
     403                                                '<code>' . esc_html( $key ) . '</code>',
     404                                                '<code>' . esc_html( $check['min'] ) . '</code>',
     405                                                '<code>' . esc_html( $check['max'] ) . '</code>'
     406                                        );
     407
     408                                        _doing_it_wrong( __CLASS__, $error, '4.1.0' );
     409
     410                                        $valid = false;
     411                                }
    400412                        }
    401413                }
  • trunk/tests/phpunit/tests/date/query.php

    r30142 r31179  
    961961        }
    962962
     963        /**
     964         * @ticket 31001
     965         */
     966        public function test_validate_date_values_should_process_array_value_for_year() {
     967                $p1 = $this->factory->post->create( array( 'post_date' => '2015-01-12' ) );
     968                $p2 = $this->factory->post->create( array( 'post_date' => '2013-01-12' ) );
     969
     970                $q = new WP_Query( array(
     971                        'date_query' => array(
     972                                array(
     973                                        'compare' => 'BETWEEN',
     974                                        'year' => array( 2012, 2014 ),
     975                                ),
     976                        ),
     977                        'fields' => 'ids',
     978                ) );
     979
     980                $this->assertEquals( array( $p2 ), $q->posts );
     981        }
     982
     983        /**
     984         * @ticket 31001
     985         */
     986        public function test_validate_date_values_should_process_array_value_for_day() {
     987                $p1 = $this->factory->post->create( array( 'post_date' => '2015-01-12' ) );
     988                $p2 = $this->factory->post->create( array( 'post_date' => '2015-01-10' ) );
     989
     990                $q = new WP_Query( array(
     991                        'date_query' => array(
     992                                array(
     993                                        'compare' => 'BETWEEN',
     994                                        'day' => array( 9, 11 ),
     995                                ),
     996                        ),
     997                        'fields' => 'ids',
     998                ) );
     999
     1000                $this->assertEquals( array( $p2 ), $q->posts );
     1001        }
     1002
     1003        /**
     1004         * @ticket 31001
     1005         * @expectedIncorrectUsage WP_Date_Query
     1006         */
     1007        public function test_validate_date_values_should_process_array_value_for_day_when_values_are_invalid() {
     1008                $p1 = $this->factory->post->create( array( 'post_date' => '2015-01-12' ) );
     1009                $p2 = $this->factory->post->create( array( 'post_date' => '2015-01-10' ) );
     1010
     1011                $q = new WP_Query( array(
     1012                        'date_query' => array(
     1013                                array(
     1014                                        'compare' => 'BETWEEN',
     1015                                        'day' => array( 9, 32 ),
     1016                                ),
     1017                        ),
     1018                        'fields' => 'ids',
     1019                ) );
     1020
     1021                // MySQL ignores the invalid clause.
     1022                $this->assertEquals( array( $p1, $p2 ), $q->posts );
     1023        }
     1024
    9631025        /** Helpers **********************************************************/
    9641026
Note: See TracChangeset for help on using the changeset viewer.