2016-10-27 76 views
0

在WordPress中,有badly documented查詢參數可以在URL中傳遞。WordPress:根據URL使用範圍過濾帖子參數

您可以在一個特定的類別,並從一個特定的authour並張貼在某一年例子顯示帖子:

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

我很想是由一系列過濾。例如,從2015年9月1日至2016年9月1日,僅使用這些URL參數(不必創建PHP自定義頁面模板)。你想要什麼

我試着用?year=<2015但它不工作...

回答

0

僅使用查詢字符串參數是不可能的。但是,您可以在您的主題或插件中創建一個函數,以檢查是否存在start_dateend_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年URL應該工作

UPDATE:如何將這項工作與YYYY-MM-DD格式化的字符串?由於參數前後的date_query可以採用時間戳字符串,而不是上面使用的年,月,日數組,因此稍作更改。您只需更改功能,如下所示:

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」)以反映YYYY-MM-DD格式)? – MultiformeIngegno

+0

我的確切例子不適用於此,因爲您必須將年,月和日解析爲單獨的變量。我會更新我的答案,以顯示它如何與YYYY-MM-DD格式的日期一起使用 –

0

感謝您的解決方案...通常它運作良好。

無論出於何種原因,當選擇小於當年的「結束」年份時 - 即... start_date = 2014 & end_date = 2015,頁面顯示正確的帖子,但隱藏導航菜單。

如果將結束日期更改爲2017,則會顯示導航菜單。

編輯:找到了解決辦法,以防萬一這是其他人發生的情況。 在

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');