2016-10-27 4 views
0

WordPressにURLに渡すことができるクエリパラメータはbadly documentedです。WordPress:URLを使用して範囲別に投稿をフィルタリングするパラメータ

あなたがすることができ、特定のカテゴリ内の特定authourから表示例の記事のために、特定の年に掲示:

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

私は大好きです何が範囲でフィルタリングすることです。たとえば、2015年9月1日から2016年9月1日まで、これらのURLパラメータのみを使用します(PHPカスタムページテンプレートを作成する必要はありません)。何をしたい

私は?year=<2015と試みたが、それは動作しません...

答えて

0

はONLYクエリ文字列パラメータを使用しては不可能です。ただし、たとえば、start_dateおよびend_dateパラメータの存在をチェックし、クエリを適切に変更するプラグインやテーマで関数を作成することができます。

これらの関数を 'pre_get_posts'のフィルタとして追加し、作成する2つの新しいパラメータが存在するかどうかを確認します。このような何か、それを行う必要があり、あなたのテーマのの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のbeforeとafterパラメータは、私が上記で使用した年、月、日の配列の代わりにタイムスタンプ文字列を取ることができるので、わずかな変更です。次のような機能に変更するだけです:

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の時刻形式で動作しますか(たとえば、YYYY-MM-DD形式を反映するように日付(「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'); 
関連する問題