WordPress.org

Make WordPress Core

Changeset 31179


Ignore:
Timestamp:
01/14/2015 04:50:09 PM (5 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.