コード例 #1
0
/**
* wpv_filter_post_date
*
* Builds the date_query argument for WP_Query based on $view_settings values
*
* @param $query (array)
* @param $view_Settings (array)
*
* @return $query (array)
*
* @since 1.8.0
*/
function wpv_filter_post_date($query, $view_settings)
{
    if (isset($view_settings['date_filter']) && is_array($view_settings['date_filter'])) {
        // @todo add a filter here for date conditions
        if (isset($view_settings['date_filter']['date_conditions']) && is_array($view_settings['date_filter']['date_conditions'])) {
            $date_query = array();
            $date_operator = array('single' => array('=', '!=', '<', '<=', '>', '>='), 'group' => array('IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'));
            $date_options = array('year', 'month', 'week', 'day', 'dayofyear', 'dayofweek', 'hour', 'minute', 'second');
            $date_columns = array('post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt');
            $date_relation = 'AND';
            if (isset($view_settings['date_filter']['date_relation']) && in_array($view_settings['date_filter']['date_relation'], array('OR', 'AND'))) {
                $date_relation = $view_settings['date_filter']['date_relation'];
            }
            $start_of_week = get_option('start_of_week');
            foreach ($view_settings['date_filter']['date_conditions'] as $date_condition) {
                if (is_array($date_condition) && isset($date_condition['date_operator'])) {
                    $date_query_instance = array();
                    if (in_array($date_condition['date_operator'], $date_operator['single'])) {
                        $are_date_opt_valid = true;
                        foreach ($date_options as $date_opt) {
                            if (isset($date_condition[$date_opt])) {
                                // Translate URL_PARAM, VIEW_PARAM and date functions into values
                                $value = $date_condition[$date_opt];
                                $resolve_attr = array('filters' => array('date_integer', 'url_parameter', 'shortcode_attribute'), 'date_integer_date_type' => $date_opt);
                                $value = apply_filters('wpv_resolve_variable_values', $value, $resolve_attr);
                                $value = explode(',', $value);
                                $value = array_map('trim', $value);
                                $value = array_filter($value, 'wpv_is_valid_non_empty_value_to_filter');
                                if (!empty($value)) {
                                    $value_real = reset($value);
                                    if (wpv_integer_date_validate($value_real, $date_opt) !== false) {
                                        if ($date_opt == 'dayofweek' && $start_of_week == 1) {
                                            /*
                                             * Based on the $start_of_week setting, $value_real is 1 ( Monday ) to 7 ( Sunday )
                                             * We must translate it to values that the date_query['dayofweek'] attribute understands
                                             * That is, 1 ( Sunday ) to 7 ( Saturday )
                                             */
                                            $value_real = $value_real % 7 + 1;
                                        }
                                        $date_query_instance[$date_opt] = $value_real;
                                    } else {
                                        $are_date_opt_valid = false;
                                    }
                                }
                            }
                        }
                        if (!empty($date_query_instance) && $are_date_opt_valid) {
                            $date_query_instance['compare'] = $date_condition['date_operator'];
                            if (isset($date_condition['date_column']) && in_array($date_condition['date_column'], $date_columns)) {
                                $date_query_instance['column'] = $date_condition['date_column'];
                            }
                            $date_query[] = $date_query_instance;
                        }
                    } else {
                        if (in_array($date_condition['date_operator'], $date_operator['group']) && isset($date_condition['date_multiple_selected']) && in_array($date_condition['date_multiple_selected'], $date_options) && isset($date_condition[$date_condition['date_multiple_selected']]) && !empty($date_condition[$date_condition['date_multiple_selected']])) {
                            $value = $date_condition[$date_condition['date_multiple_selected']];
                            // Translate URL_PARAM, VIEW_PARAM and date functions into values
                            $resolve_attr = array('filters' => array('date_integer', 'url_parameter', 'shortcode_attribute'), 'date_integer_date_type' => $date_condition['date_multiple_selected']);
                            $value = apply_filters('wpv_resolve_variable_values', $value, $resolve_attr);
                            $value = explode(',', $value);
                            $value = array_map('trim', $value);
                            $value = array_filter($value, 'wpv_is_valid_non_empty_value_to_filter');
                            $value = wpv_array_date_validate($value, $date_condition['date_multiple_selected']);
                            if (!empty($value)) {
                                $indexed_values = array_values($value);
                                if ($date_condition['date_multiple_selected'] == 'dayofweek' && $start_of_week == 1) {
                                    foreach ($indexed_values as $indexed_k => $indexed_v) {
                                        /*
                                         * Based on the $start_of_week setting, $indexed_v is 1 ( Monday ) to 7 ( Sunday )
                                         * We must translate it to values that the date_query['dayofweek'] attribute understands
                                         * That is, 1 ( Sunday ) to 7 ( Saturday )
                                         */
                                        $indexed_values[$indexed_k] = $indexed_v % 7 + 1;
                                    }
                                }
                                $date_query_instance[$date_condition['date_multiple_selected']] = $indexed_values;
                                $date_query_instance['compare'] = $date_condition['date_operator'];
                                if (isset($date_condition['date_column']) && in_array($date_condition['date_column'], $date_columns)) {
                                    $date_query_instance['column'] = $date_condition['date_column'];
                                }
                                $date_query[] = $date_query_instance;
                            }
                        }
                    }
                }
            }
            if (!empty($date_query)) {
                $date_query['relation'] = $date_relation;
                $query['date_query'] = $date_query;
            }
        }
    }
    return $query;
}
コード例 #2
0
/**
* wpv_resolve_group_date_query
*
* Generate the date_query entry for IN, NOT IN, BETWEEN and NOT BETWEEN comparisons
*
* In case of BETWEEN and NOT BETWEEN, we also need to manage the cases where one of the values is $no_parameter_found
* If so, we will transform them into the right greater-or-equal-than or lower-or-equal-than statements.
*
* @param array $value
* @param array $date_condition
*
* @return (array|boolean) The date_query instance on success, false otherwise
*
* @since 1.9.0
*/

function wpv_resolve_group_date_query( $value, $date_condition ) {
	global $no_parameter_found;
	$start_of_week = get_option( 'start_of_week' );
	$date_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt' );
	$date_condition_operator = $date_condition['date_operator'];
	$adjust_start_of_week = false;
	if ( 
		$date_condition['date_multiple_selected'] == 'dayofweek' 
		&& $start_of_week == 1
	) {
		/*
		* Based on the $start_of_week setting, $indexed_v is 1 ( Monday ) to 7 ( Sunday )
		* We must translate it to values that the date_query['dayofweek'] attribute understands
		* That is, 1 ( Sunday ) to 7 ( Saturday )
		*/
		$adjust_start_of_week = true;
	}
	$date_query_instance = array();
	if (
		isset( $date_condition['date_column'] )
		&& in_array( $date_condition['date_column'], $date_columns )
	) {
		$date_query_instance['column'] = $date_condition['date_column'];
	}
	if (
		in_array( $no_parameter_found, $value ) 
		&& (
			'BETWEEN' == $date_condition_operator 
			|| 'NOT BETWEEN' == $date_condition_operator 
		)
	) {
		// Clean from empty values, the ones we care about are $no_parameter_found instead
		$value = array_filter( $value );
		$value_count = count( $value );
		if ( 0 == $value_count ) {
			return false;
		} else if ( 1 == $value_count ) {
			if ( $value[0] == $no_parameter_found ) {
				return false;
			} else {
				if ( $date_condition_operator == 'BETWEEN' ) {
					$date_condition_operator = '>=';
				} else {
					$date_condition_operator = '<=';
				}
				$single_value = $value[0];
				$is_valid_value = wpv_integer_date_validate( $single_value, $date_condition['date_multiple_selected'] );
				if ( $is_valid_value !== false ) {
					if ( $adjust_start_of_week ) {
						$single_value = ( $single_value % 7 ) + 1;
					}
					$date_query_instance[$date_condition['date_multiple_selected']] = $single_value;
					$date_query_instance['compare'] = $date_condition_operator;
					return $date_query_instance;
				}
			}
		} else {
			if (
				$value[0] == $no_parameter_found 
				&& $value[1] == $no_parameter_found
			) {
				return false;
			}
			if ( $value[0] == $no_parameter_found ) {
				if ( $date_condition_operator == 'BETWEEN' ) {
					$date_condition_operator = '<=';
				} else {
					$date_condition_operator = '>=';
				}
				$single_value = $value[1];
				$is_valid_value = wpv_integer_date_validate( $single_value, $date_condition['date_multiple_selected'] );
				if ( $is_valid_value !== false ) {
					if ( $adjust_start_of_week ) {
						$single_value = ( $single_value % 7 ) + 1;
					}
					$date_query_instance[$date_condition['date_multiple_selected']] = $single_value;
					$date_query_instance['compare'] = $date_condition_operator;
					return $date_query_instance;
				}
			} elseif ( $value[1] == $no_parameter_found ) {
				if ( $date_condition_operator == 'BETWEEN' ) {
					$date_condition_operator = '>=';
				} else {
					$date_condition_operator = '<=';
				}
				$single_value = $value[0];
				$is_valid_value = wpv_integer_date_validate( $single_value, $date_condition['date_multiple_selected'] );
				if ( $is_valid_value !== false ) {
					if ( $adjust_start_of_week ) {
						$single_value = ( $single_value % 7 ) + 1;
					}
					$date_query_instance[$date_condition['date_multiple_selected']] = $single_value;
					$date_query_instance['compare'] = $date_condition_operator;
					return $date_query_instance;
				}
			} else {
				$value = array_filter( $value, 'wpv_is_valid_non_empty_value_to_filter' );
				$value = wpv_array_date_validate( $value, $date_condition['date_multiple_selected'] );
				if ( ! empty( $value ) ) {
					$indexed_values = array_values( $value );
					if ( $adjust_start_of_week ) {
						foreach ( $indexed_values as $indexed_k => $indexed_v ) {
							$indexed_values[$indexed_k] = ( $indexed_v % 7 ) + 1;
						}
					}
					$date_query_instance[$date_condition['date_multiple_selected']] = $indexed_values;
					$date_query_instance['compare'] = $date_condition_operator;
					return $date_query_instance;
				}
			}
		}
	} else {
		$value = array_filter( $value, 'wpv_is_valid_non_empty_value_to_filter' );
		$value = wpv_array_date_validate( $value, $date_condition['date_multiple_selected'] );
		if ( ! empty( $value ) ) {
			$indexed_values = array_values( $value );
			if ( $adjust_start_of_week ) {
				foreach ( $indexed_values as $indexed_k => $indexed_v ) {
					$indexed_values[$indexed_k] = ( $indexed_v % 7 ) + 1;
				}
			}
			$date_query_instance[$date_condition['date_multiple_selected']] = $indexed_values;
			$date_query_instance['compare'] = $date_condition_operator;
			return $date_query_instance;
		}
	}
	return false;
}