この記事は、「カテゴリーアーカイブを使った講師一覧」や「サブカテゴリーを使った講師の絞り込み」から、さらにカスタムフィールドの値を使って絞り込む方法について記したものです。

 

概要

例えば、講師の「年代(20代、30代)」のような抽出条件は、時間の経過とともに年令が増加するため「カテゴリー」での分類には向かないかもしれません。そこで、各講師の紹介記事にカスタムフィールドで「誕生日」を追加し、URLパラメータで「年代」が指定されたときだけ絞り込み条件に加えるようにします。

 

スクリーンショット

カスタムフィールド「birth(誕生日)」

カスタムフィールド「birth(誕生日)」

カテゴリーアーカイブをカスタムフィールドで絞り込む

カテゴリーアーカイブをカスタムフィールドで絞り込む

 

手順

各講師の紹介記事に、カスタムフィールド 'birth' を追加し、誕生日(例:'1990/04/20')を入力して投稿します。

カスタムフィールド「birth(誕生日)」

URLパラメータで「年代」の指定があったとき(例:20代なら 'age=20' など)は、カスタムフィールド 'birth' の日付がその年代に該当するかを 'meta_query' で条件指定します。

例 http://example.com/category/teacher/?age=20 など

下記のコードを「functions.php」に追加します。

/*
 *  「講師(teacher)」とそのサブカテゴリだけ1ページ当たりの記事数を3件にする
 *  「age(年代)」の指定があれば 'meta_query' でカスタムフィールド 'birth' も検索する
 */
add_action('pre_get_posts', 'category_teacher_per_page');
function category_teacher_per_page($wp_query){
  if(!is_admin()) {
    if($wp_query->is_main_query()){
      if($wp_query->is_category()){
        $c = get_category($wp_query->query['cat']);
        while($c->parent){
          $c = get_category($c->parent);
          if($c->slug == 'teacher'){
            break;
          }
        }
        if($c->slug == 'teacher'){
          $wp_query->set('posts_per_page', 3 );
          // 20代,30代,40代の指定があった場合
          if(isset($_GET['age']) && in_array($_GET['age'], array(20, 30, 40))) { 
            $y = date('Y');
            $m = date('m');
            $d = date('d');
            $start = date('Y/m/d', mktime(0, 0, 0, $m, $d+1, $y-$_GET['age']-10));
            $end = date('Y/m/d', mktime(0, 0, 0, $m, $d, $y-$_GET['age']));
            $meta = array(
              array(
                'key' => 'birth',
                'value' => array($start, $end),
                'compare' => 'BETWEEN',
                'type' => 'DATE',
              )
            );
            $wp_query->set('meta_query', $meta);
          }
        }
      }
    }
  }
}

 

ちなみに、下記のコードを「functions.php」に追加すると、このカスタムフィールド 'birth' の日付から講師の「年令」を計算し、講師紹介の記事中に表示することができます。

記事中に挿入するショートコードは、[olb_show_age] となります。

/** 
 *  [ショートコード]年令表示
 */
add_shortcode( 'olb_show_age', 'olb_show_age' );
function olb_show_age($atts, $content = null){
  global $post;
  $birth = get_post_meta($post->ID, 'birth', true);
  if(empty($birth)) {
    return;
  }
  $b = (int) str_replace('/', '', $birth);
  return (int) ((date('Ymd')-$b)/10000);
}

 

関連記事