/** * 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; }
/** * 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; }