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. Merges [31179] to the 4.1 branch. Fixes #31001. Built from https://develop.svn.wordpress.org/branches/4.1@31396 git-svn-id: http://core.svn.wordpress.org/branches/4.1@31377 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
a496c6b42f
commit
73ce260784
|
@ -305,8 +305,17 @@ class WP_Date_Query {
|
|||
|
||||
// Days per year.
|
||||
if ( array_key_exists( 'year', $date_query ) ) {
|
||||
// If a year exists in the date query, we can use it to get the days.
|
||||
$max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $date_query['year'] ) ) + 1;
|
||||
/*
|
||||
* If a year exists in the date query, we can use it to get the days.
|
||||
* If multiple years are provided (as in a BETWEEN), use the first one.
|
||||
*/
|
||||
if ( is_array( $date_query['year'] ) ) {
|
||||
$_year = reset( $date_query['year'] );
|
||||
} else {
|
||||
$_year = $date_query['year'];
|
||||
}
|
||||
|
||||
$max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1;
|
||||
} else {
|
||||
// otherwise we use the max of 366 (leap-year)
|
||||
$max_days_of_year = 366;
|
||||
|
@ -336,10 +345,10 @@ class WP_Date_Query {
|
|||
);
|
||||
|
||||
// Weeks per year.
|
||||
if ( array_key_exists( 'year', $date_query ) ) {
|
||||
if ( isset( $_year ) ) {
|
||||
// If we have a specific year, use it to calculate number of weeks.
|
||||
$date = new DateTime();
|
||||
$date->setISODate( $date_query['year'], 53 );
|
||||
$date->setISODate( $_year, 53 );
|
||||
$week_count = $date->format( "W" ) === "53" ? 53 : 52;
|
||||
|
||||
} else {
|
||||
|
@ -382,14 +391,16 @@ class WP_Date_Query {
|
|||
continue;
|
||||
}
|
||||
|
||||
$is_between = $date_query[ $key ] >= $check['min'] && $date_query[ $key ] <= $check['max'];
|
||||
|
||||
if ( ! is_numeric( $date_query[ $key ] ) || ! $is_between ) {
|
||||
// Throw a notice for each failing value.
|
||||
$is_between = true;
|
||||
foreach ( (array) $date_query[ $key ] as $_value ) {
|
||||
$is_between = $_value >= $check['min'] && $_value <= $check['max'];
|
||||
|
||||
if ( ! is_numeric( $_value ) || ! $is_between ) {
|
||||
$error = sprintf(
|
||||
/* translators: Date query invalid date message: 1: invalid value, 2: type of value, 3: minimum valid value, 4: maximum valid value */
|
||||
__( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ),
|
||||
'<code>' . esc_html( $date_query[ $key ] ) . '</code>',
|
||||
'<code>' . esc_html( $_value ) . '</code>',
|
||||
'<code>' . esc_html( $key ) . '</code>',
|
||||
'<code>' . esc_html( $check['min'] ) . '</code>',
|
||||
'<code>' . esc_html( $check['max'] ) . '</code>'
|
||||
|
@ -400,6 +411,7 @@ class WP_Date_Query {
|
|||
$valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we already have invalid date messages, don't bother running through checkdate().
|
||||
if ( ! $valid ) {
|
||||
|
|
Loading…
Reference in New Issue