wp/wp-includes/date.php
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
permissions -rw-r--r--
first import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * WP_Date_Query will generate a MySQL WHERE clause for the specified date-based parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Initialize the class by passing an array of arrays of parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * @link http://codex.wordpress.org/Function_Reference/WP_Query Codex page.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
class WP_Date_Query {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
	 * List of date queries.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
	public $queries = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
	 * The relation between the queries. Can be either 'AND' or 'OR' and can be changed via the query arguments.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
	public $relation = 'AND';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
	 * The column to query against. Can be changed via the query arguments.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
	 * @var string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
	public $column = 'post_date';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
	 * The value comparison operator. Can be changed via the query arguments.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
	 * @var array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
	public $compare = '=';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
	 * Constructor.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
	 * @param array $date_query {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
	 *     One or more associative arrays of date query parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
	 *     @type array {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
	 *         @type string $column   Optional. The column to query against. If undefined, inherits the value of
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
	 *                                the $default_column parameter. Default 'post_date'. Accepts 'post_date',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
	 *                                'post_date_gmt', 'post_modified','post_modified_gmt', 'comment_date',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
	 *                                'comment_date_gmt'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
	 *         @type string $compare  Optional. The comparison operator.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
	 *                                Default '='. Accepts '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
	 *                                'BETWEEN', 'NOT BETWEEN'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
	 *         @type string $relation Optional. The boolean relationship between the date queryies.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
	 *                                Default 'OR'. Accepts 'OR', 'AND'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
	 *         @type array {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
	 *             @type string|array $before Optional. Date to retrieve posts before. Accepts strtotime()-compatible
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
	 *                                        string, or array of 'year', 'month', 'day' values. {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
	 *                 @type string $year  The four-digit year. Default empty. Accepts any four-digit year.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
	 *                 @type string $month Optional when passing array.The month of the year.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
	 *                                     Default (string:empty)|(array:1). Accepts numbers 1-12.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
	 *                 @type string $day   Optional when passing array.The day of the month.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
	 *                                     Default (string:empty)|(array:1). Accepts numbers 1-31.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
	 *             }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
	 *             @type string|array $after Optional. Date to retrieve posts before. Accepts strtotime()-compatible
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
	 *                                       string, or array of 'year', 'month', 'day' values. {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
	 *                 @type string $year  The four-digit year. Default empty. Accepts any four-digit year.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
	 *                 @type string $month Optional when passing array.The month of the year.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
	 *                                     Default (string:empty)|(array:12). Accepts numbers 1-12.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
	 *                 @type string $day   Optional when passing array.The day of the month.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
	 *                                     Default (string:empty)|(array:last day of month). Accepts numbers 1-31.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
	 *             }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
	 *             @type string       $column    Optional. Used to add a clause comparing a column other than the column
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
	 *                                           specified in the top-level $column paramater.  Default is the value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
	 *                                           of top-level $column. Accepts 'post_date', 'post_date_gmt',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
	 *                                           'post_modified', 'post_modified_gmt', 'comment_date', 'comment_date_gmt'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
	 *             @type string       $compare   Optional. The comparison operator. Default '='. Accepts '=', '!=',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
	 *                                           '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
	 *             @type bool         $inclusive Optional. Include results from dates specified in 'before' or 'after'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
	 *                                           Default. Accepts.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
	 *             @type int          $year      Optional. The four-digit near number. Default empty. Accepts any
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
	 *                                           four-digit year.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
	 *             @type int          $month     Optional. The two-digit month number. Default empty. Accepts numbers 1-12.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
	 *             @type int          $week      Optional. The week number of the year. Default empty. Accepts numbers 0-53.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
	 *             @type int          $day       Optional. The day of the month. Default empty. Accepts numbers 1-31.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
	 *             @type int          $hour      Optional. The hour of the day. Default empty. Accepts numbers 0-23.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
	 *             @type int          $minute    Optional. The minute of the hour. Default empty. Accepts numbers 0-60.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
	 *             @type int          $second    Optional. The second of the minute. Default empty. Accepts numbers 0-60.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
	 *         }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
	 *     }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
	 * }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
	 * @param array $default_column Optional. Default column to query against. Default 'post_date'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
	 *                              Accepts 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
	 *                              'comment_date', 'comment_date_gmt'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
	function __construct( $date_query, $default_column = 'post_date' ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
		if ( empty( $date_query ) || ! is_array( $date_query ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
			return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
		if ( isset( $date_query['relation'] ) && strtoupper( $date_query['relation'] ) == 'OR' )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
			$this->relation = 'OR';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			$this->relation = 'AND';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
		if ( ! empty( $date_query['column'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
			$this->column = esc_sql( $date_query['column'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
			$this->column = esc_sql( $default_column );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
		$this->column = $this->validate_column( $this->column );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
		$this->compare = $this->get_compare( $date_query );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
		// If an array of arrays wasn't passed, fix it
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
		if ( ! isset( $date_query[0] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
			$date_query = array( $date_query );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
		$this->queries = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
		foreach ( $date_query as $key => $query ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
			if ( ! is_array( $query ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
				continue;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
			$this->queries[$key] = $query;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
	 * Determines and validates what comparison operator to use.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
	 * @param array $query A date query or a date subquery
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
	 * @return string The comparison operator
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
	public function get_compare( $query ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
		if ( ! empty( $query['compare'] ) && in_array( $query['compare'], array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
			return strtoupper( $query['compare'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
		return $this->compare;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
	 * Validates a column name parameter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
	 * @param string $column The user-supplied column name.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
	 * @return string A validated column name value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
	public function validate_column( $column ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
		$valid_columns = array(
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
			'post_date', 'post_date_gmt', 'post_modified',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
			'post_modified_gmt', 'comment_date', 'comment_date_gmt'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
		);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
		/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
		 * Filter the list of valid date query columns.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
		 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
		 * @param array $valid_columns An array of valid date query columns. Defaults are 'post_date', 'post_date_gmt',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
		 *                             'post_modified', 'post_modified_gmt', 'comment_date', 'comment_date_gmt'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
		 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
		if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
			$column = 'post_date';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
		return $column;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
	 * Turns an array of date query parameters into a MySQL string.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
	 * @return string MySQL WHERE parameters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
	public function get_sql() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
		// The parts of the final query
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
		$where = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
		foreach ( $this->queries as $key => $query ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			$where_parts = $this->get_sql_for_subquery( $query );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
			if ( $where_parts ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
				// Combine the parts of this subquery into a single string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
				$where[ $key ] = '( ' . implode( ' AND ', $where_parts ) . ' )';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		// Combine the subquery strings into a single string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
		if ( $where )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
			$where = ' AND ( ' . implode( " {$this->relation} ", $where ) . ' )';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
			$where = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
		/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		 * Filter the date query WHERE clause.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
		 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
		 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
		 * @param string        $where WHERE clause of the date query.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
		 * @param WP_Date_Query $this  The WP_Date_Query instance.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
		 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
		return apply_filters( 'get_date_sql', $where, $this );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
	 * Turns a single date subquery into pieces for a WHERE clause.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
	 * return array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
	protected function get_sql_for_subquery( $query ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
		// The sub-parts of a $where part
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
		$where_parts = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
		$column = ( ! empty( $query['column'] ) ) ? esc_sql( $query['column'] ) : $this->column;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
		$column = $this->validate_column( $column );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		$compare = $this->get_compare( $query );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
		$lt = '<';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
		$gt = '>';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
		if ( ! empty( $query['inclusive'] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
			$lt .= '=';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
			$gt .= '=';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
		// Range queries
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
		if ( ! empty( $query['after'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
			$where_parts[] = $wpdb->prepare( "$column $gt %s", $this->build_mysql_datetime( $query['after'], true ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
		if ( ! empty( $query['before'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
			$where_parts[] = $wpdb->prepare( "$column $lt %s", $this->build_mysql_datetime( $query['before'], false ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
		// Specific value queries
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
		if ( isset( $query['year'] ) && $value = $this->build_value( $compare, $query['year'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
			$where_parts[] = "YEAR( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
		if ( isset( $query['month'] ) && $value = $this->build_value( $compare, $query['month'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
			$where_parts[] = "MONTH( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
		// Legacy
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
		if ( isset( $query['monthnum'] ) && $value = $this->build_value( $compare, $query['monthnum'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
			$where_parts[] = "MONTH( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
		if ( isset( $query['week'] ) && false !== ( $value = $this->build_value( $compare, $query['week'] ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
			$where_parts[] = _wp_mysql_week( $column ) . " $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
		// Legacy
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
		if ( isset( $query['w'] ) && false !== ( $value = $this->build_value( $compare, $query['w'] ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
			$where_parts[] = _wp_mysql_week( $column ) . " $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
		if ( isset( $query['dayofyear'] ) && $value = $this->build_value( $compare, $query['dayofyear'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
			$where_parts[] = "DAYOFYEAR( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
		if ( isset( $query['day'] ) && $value = $this->build_value( $compare, $query['day'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
			$where_parts[] = "DAYOFMONTH( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
		if ( isset( $query['dayofweek'] ) && $value = $this->build_value( $compare, $query['dayofweek'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
			$where_parts[] = "DAYOFWEEK( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
		if ( isset( $query['hour'] ) || isset( $query['minute'] ) || isset( $query['second'] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
			// Avoid notices
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
			foreach ( array( 'hour', 'minute', 'second' ) as $unit ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
				if ( ! isset( $query[$unit] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
					$query[$unit] = null;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
				}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
			if ( $time_query = $this->build_time_query( $column, $compare, $query['hour'], $query['minute'], $query['second'] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
				$where_parts[] = $time_query;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
		return $where_parts;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
	 * Builds and validates a value string based on the comparison operator.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
	 * @param string $compare The compare operator to use
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
	 * @param string|array $value The value
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
	 * @return string|int|false The value to be used in SQL or false on error.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
	public function build_value( $compare, $value ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
		if ( ! isset( $value ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
		switch ( $compare ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
			case 'IN':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
			case 'NOT IN':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
				return '(' . implode( ',', array_map( 'intval', (array) $value ) ) . ')';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
			case 'BETWEEN':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
			case 'NOT BETWEEN':
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
				if ( ! is_array( $value ) || 2 != count( $value ) || ! isset( $value[0] ) || ! isset( $value[1] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
					$value = array( $value, $value );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
				$value = array_map( 'intval', $value );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
				return $value[0] . ' AND ' . $value[1];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
			default;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
				return (int) $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
	 * Builds a MySQL format date/time based on some query parameters.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
	 * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
	 * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
	 * pass a string that that will be run through strtotime().
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
	 * @param string|array $datetime An array of parameters or a strotime() string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
	 * @param string $default_to Controls what values default to if they are missing from $datetime. Pass "min" or "max".
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
	 * @return string|false A MySQL format date/time or false on failure
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
	public function build_mysql_datetime( $datetime, $default_to_max = false ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
		$now = current_time( 'timestamp' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
		if ( ! is_array( $datetime ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
			// @todo Timezone issues here possibly
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
			return gmdate( 'Y-m-d H:i:s', strtotime( $datetime, $now ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
		$datetime = array_map( 'absint', $datetime );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
		if ( ! isset( $datetime['year'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			$datetime['year'] = gmdate( 'Y', $now );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
		if ( ! isset( $datetime['month'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
			$datetime['month'] = ( $default_to_max ) ? 12 : 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
		if ( ! isset( $datetime['day'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
			$datetime['day'] = ( $default_to_max ) ? (int) date( 't', mktime( 0, 0, 0, $datetime['month'], 1, $datetime['year'] ) ) : 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
		if ( ! isset( $datetime['hour'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
			$datetime['hour'] = ( $default_to_max ) ? 23 : 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
		if ( ! isset( $datetime['minute'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
			$datetime['minute'] = ( $default_to_max ) ? 59 : 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
		if ( ! isset( $datetime['second'] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
			$datetime['second'] = ( $default_to_max ) ? 59 : 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
		return sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
	/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
	 * Builds a query string for comparing time values (hour, minute, second).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
	 * If just hour, minute, or second is set than a normal comparison will be done.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
	 * However if multiple values are passed, a pseudo-decimal time will be created
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
	 * in order to be able to accurately compare against.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
	 * @since 3.7.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
	 * @access public
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
	 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
	 * @param string $column The column to query against. Needs to be pre-validated!
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
	 * @param string $compare The comparison operator. Needs to be pre-validated!
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
	 * @param int|null $hour Optional. An hour value (0-23).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
	 * @param int|null $minute Optional. A minute value (0-59).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
	 * @param int|null $second Optional. A second value (0-59).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
	 * @return string|false A query part or false on failure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
	 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
	public function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
		global $wpdb;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
		// Have to have at least one
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
		if ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
		// Complex combined queries aren't supported for multi-value queries
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		if ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
			$return = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
			if ( isset( $hour ) && false !== ( $value = $this->build_value( $compare, $hour ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
				$return[] = "HOUR( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
			if ( isset( $minute ) && false !== ( $value = $this->build_value( $compare, $minute ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
				$return[] = "MINUTE( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
			if ( isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
				$return[] = "SECOND( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
			return implode( ' AND ', $return );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
		// Cases where just one unit is set
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
		if ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $hour ) ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
			return "HOUR( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
		} elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $minute ) ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
			return "MINUTE( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
		} elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
			return "SECOND( $column ) $compare $value";
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
		// Single units were already handled. Since hour & second isn't allowed, minute must to be set.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
		if ( ! isset( $minute ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
			return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
		$format = $time = '';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
		// Hour
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
		if ( $hour ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
			$format .= '%H.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
			$time   .= sprintf( '%02d', $hour ) . '.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
			$format .= '0.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
			$time   .= '0.';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
		// Minute
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
		$format .= '%i';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
		$time   .= sprintf( '%02d', $minute );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
		if ( isset( $second ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
			$format .= '%s';
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
			$time   .= sprintf( '%02d', $second );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
		return $wpdb->prepare( "DATE_FORMAT( $column, %s ) $compare %f", $format, $time );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
}