Make WordPress Core

Ticket #56311: 56311.2.diff

File 56311.2.diff, 3.1 KB (added by domainsupport, 2 years ago)
  • class-wp.php

     
    367367                        }
    368368                }
    369369
     370                // Prevent invalid date queries.
     371
     372                // Array containing all min-max checks.
     373                $min_max_checks = array();
     374
     375                // Months per year.
     376                $min_max_checks['monthnum'] = array(
     377                        'min' => 1,
     378                        'max' => 12,
     379                );
     380
     381                // Weeks per year.
     382                if ( isset( $this->query_vars['year'] ) ) {
     383                        /*
     384                         * If we have a specific year, use it to calculate number of weeks.
     385                         * Note: the number of weeks in a year is the date in which Dec 28 appears.
     386                         */
     387                        $week_count = gmdate( 'W', mktime( 0, 0, 0, 12, 28, absint($this->query_vars['year']) ) );
     388
     389                } else {
     390                        // Otherwise set the week-count to a maximum of 53.
     391                        $week_count = 53;
     392                }
     393
     394                $min_max_checks['w'] = array(
     395                        'min' => 1,
     396                        'max' => $week_count,
     397                );
     398
     399                // Days per month.
     400                $min_max_checks['day'] = array(
     401                        'min' => 1,
     402                        'max' => 31,
     403                );
     404
     405                // Hours per day.
     406                $min_max_checks['hour'] = array(
     407                        'min' => 0,
     408                        'max' => 23,
     409                );
     410
     411                // Minutes per hour.
     412                $min_max_checks['minute'] = array(
     413                        'min' => 0,
     414                        'max' => 59,
     415                );
     416
     417                // Seconds per minute.
     418                $min_max_checks['second'] = array(
     419                        'min' => 0,
     420                        'max' => 59,
     421                );
     422
     423                // Concatenate and unset each invalid value.
     424
     425                foreach ( $min_max_checks as $key => $check ) {
     426                        if (
     427                                ! array_key_exists( $key, $this->query_vars )
     428                        ) {
     429                                continue;
     430                        }
     431
     432                        $is_between = $this->query_vars[ $key ] >= $check['min'] && $this->query_vars <= $check['max'];
     433
     434                        if ( ! is_numeric( $this->query_vars[ $key ] ) || ! $is_between ) {
     435                                unset($this->query_vars[ $key ]);
     436                        }
     437                }
     438
     439                $day_month_year_error_msg = '';
     440
     441                $day_exists   = array_key_exists( 'day', $this->query_vars ) && is_numeric( $this->query_vars['day'] );
     442                $month_exists = array_key_exists( 'monthnum', $this->query_vars ) && is_numeric( $this->query_vars['monthnum'] );
     443                $year_exists  = array_key_exists( 'year', $this->query_vars ) && is_numeric( $this->query_vars['year'] );
     444
     445                if ( $day_exists && $month_exists && $year_exists ) {
     446                        // 1. Checking day, month, year combination.
     447                        if ( ! wp_checkdate( $this->query_vars['monthnum'], $this->query_vars['day'], $this->query_vars['year'], sprintf( '%s-%s-%s', $this->query_vars['year'], $this->query_vars['monthnum'], $this->query_vars['day'] ) ) ) {
     448                                unset($this->query_vars['day']);
     449                                unset($this->query_vars['monthnum']);
     450                                unset($this->query_vars['year']);
     451                        }
     452                } elseif ( $day_exists && $month_exists ) {
     453                        /*
     454                         * 2. checking day, month combination
     455                         * We use 2012 because, as a leap year, it's the most permissive.
     456                         */
     457                        if ( ! wp_checkdate( $this->query_vars['monthnum'], $this->query_vars['day'], 2012, sprintf( '2012-%s-%s', $this->query_vars['monthnum'], $this->query_vars['day'] ) ) ) {
     458                                unset($this->query_vars['day']);
     459                                unset($this->query_vars['monthnum']);
     460                        }
     461                }
     462
    370463                // Resolve conflicts between posts with numeric slugs and date archive queries.
    371464                $this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars );
    372465