2016-10-27 2 views
0

В WordPress есть параметры запроса badly documented, которые вы можете передать по URL-адресу.WordPress: сообщения фильтров по диапазону с использованием URL Параметры

Вы можете, например, отображение сообщений в определенной категории и от конкретного authour и размещено в определенном году:

/?category_name=CATNAME&author=AUTHOR&year=2015 

То, что я хотел бы, чтобы фильтровать по диапазону. Например, с 1 сентября 2015 года по 1 сентября 2016 года, только используя эти параметры URL (не нужно создавать шаблон страницы на PHP).

Я попытался с ?year=<2015, но это не работает ...

ответ

0

То, что вы хотите, не представляется возможным только с помощью параметров строки запроса. Однако вы можете создать функцию в своей теме или плагин, который проверяет наличие параметров start_date и end_date, например, и соответствующим образом модифицирует запрос.

Вы хотите добавить эти функции в качестве фильтра в «pre_get_posts» и проверить наличие этих двух новых параметров, которые вы создали. Что-то вроде этого, добавляется в файл functions.php вашей темы должны это сделать:

//Add in our new custom query vars first 
function add_query_vars_filter($vars){ 
     $vars[] = "end_date"; 
     $vars[] = "start_date"; 
     return $vars; 
    } 
add_filter('query_vars', 'add_query_vars_filter'); 

function parse_date_range_query_string($query){ 
    $start_date = get_query_var('start_date', 1900); 
    $end_date = get_query_var('end_date', date("Y")); 
    if (!is_admin()) { 
      $query->set('date_query', array(
       array(
        'after' => array(
          'year' => $start_date, 
          'month' => 1, 
          'day' => 1 
         ), 
        'before' => array(
          'year' => $end_date, 
          'month' => 12, 
          'day' => 31 
         ), 
        'inclusive' => true 
       ), 
      ) 
     ); 
    } 
} 

add_filter('pre_get_posts', 'parse_date_range_query_string'); 

Теперь, как гиперссылка example.com/?start_date=2014 & end_date = 2016 должны работать

UPDATE: Как бы эта работа с форматированной строкой YYYY-MM-DD? Незначительное изменение, так как параметры date_query до и после могут принимать строку timestamp вместо массива year, month, day, который я использовал выше. Вы просто смените функцию на следующее:

function parse_date_range_query_string($query){ 
     $start_date = get_query_var('start_date', '1900-01-01'); 
     $end_date = get_query_var('end_date', date("Y-m-d")); 
     if (!is_admin()) { 
       $query->set('date_query', array(
        array(
         'after' => $start_date, 
         'before' => $end_date, 
         'inclusive' => true 
        ), 
       ) 
      ); 
     } 
    } 
+0

вау, спасибо большое. Это работает с каждым временным форматом PHP (если я изменил бит даты («Y»), чтобы отразить, например, формат ГГГГ-ММ-ДД)? – MultiformeIngegno

+0

Мой пример не подходит для этого, так как вам придется разбирать год, месяц и день на отдельные переменные. Я обновлю свой ответ, чтобы показать, как он может работать с установленной датой YYYY-MM-DD –

0

Спасибо за это решение ... в целом это хорошо работает.

По какой-либо причине при выборе «конечного» года, который меньше текущего года, т.е. ... start_date = 2014 & end_date = 2015, на странице отображаются правильные сообщения, но скрывается меню навигации.

Если я изменю дату окончания до 2017 года, отобразится меню навигации.

EDIT: нашел решение для этого; на всякий случай это происходит для других. Добавление в

if (! is_admin() && $query->is_main_query()){ 

просто добавляет новый диапазон дат в главном запросе, а не каждый запрос (т.е. ... запрос меню).

Таким образом, полный код решения выше:

//Add in our new custom query vars first 
function add_query_vars_filter($vars){ 
     $vars[] = "end_date"; 
     $vars[] = "start_date"; 
     return $vars; 
    } 
add_filter('query_vars', 'add_query_vars_filter'); 

function parse_date_range_query_string($query){ 
    $start_date = get_query_var('start_date', 1900); 
    $end_date = get_query_var('end_date', date("Y")); 
    if (!is_admin() && $query->is_main_query()) { 
      $query->set('date_query', array(
       array(
        'after' => array(
          'year' => $start_date, 
          'month' => 1, 
          'day' => 1 
         ), 
        'before' => array(
          'year' => $end_date, 
          'month' => 12, 
          'day' => 31 
         ), 
        'inclusive' => true 
       ), 
      ) 
     ); 
    } 
} 

add_filter('pre_get_posts', 'parse_date_range_query_string'); 
Смежные вопросы