wordpress タームの名前(スラッグ)から ID を取得

2013年5月24日

get_categories, get_tags, wp_list_categories, wp_tag_cloud, get_terms などの関数では、除外するタームを ID で指定するようになっているが、名前またはスラッグで指定したほうが簡単なので(個人的に)、タームの名前またはスラッグから ID を取得する関数を作成するメモ。

  • タームの名前またはスラッグをカンマで区切った文字列を受け取り、それらをカンマで区切った ID の文字列に変換して返す。
  • ID への変換は「get_term_by」を利用して、タームのオブジェクトを取得する。
  • その際に、名前かスラッグか($field)とタクソノミー($taxonomy)を指定する。
  • 取得したオブジェクトのプロパティ(term_id)から ID を取得する。
  • それらをカンマで連結して返す。
function return_tax_term_id($args = array()) {
  $defaults = array(
    'names' => '', //タームの名前またはスラッグをカンマで区切って指定。
    'field' => 'name', //名前またはスラッグの指定。デフォルトは「name」、スラッグの場合は「slug」と指定。
    'taxonomy' => 'category', //タクソノミーの指定。デフォルトはカテゴリー
  );
  $args = wp_parse_args( $args, $defaults ); //パラメータを解析し、省略されたパレメータにはデフォルト値をセット
  extract( $args, EXTR_SKIP ); //キーを変数名、値を変数の値として処理
    
  if($names == '') return ''; //名前またはスラッグが指定されていなければ空文字を返す。
  $strings = explode(',', $names); //分割した文字列の配列
  $ids = ''; //タームIDのリストを入れる変数(カンマ区切りの文字列)
  $count = count($strings); //分割した文字列の配列の総数
  if($count) {
    for($i=0; $i < $count; $i++) { //個々の文字列(タームの名前かスラッグ)からそれらのタームIDを取得
       //文字列の前後に空白がある可能性があるので取り除いてパラメータに渡す
      $term = get_term_by( $field, trim($strings&#91;$i&#93;), $taxonomy);
      if($term) $ids .= $term->term_id; //オブジェクトが取得できればそれから ID を取得
      if($i != $count-1) {
        $ids .= ','; //最後の要素以外はカンマで区切る
      }
    }
  }
  return $ids; //カンマで区切った ID の文字列を返す。
}

以下は wp_list_categories での使用例。
カスタム投稿タイプ「news_cat」の「スポーツ」カテゴリを除外して表示。

wp_list_categories(array('exclude' => return_tax_term_id('taxonomy=news_cat&names=スポーツ'), 'taxonomy' => 'news_cat'));

以下は名前ではなく、スラッグを使う場合の例。

wp_list_categories(array(
    'exclude' => return_tax_term_id(array(
        'taxonomy' => 'news_cat',
        'field' => 'slug',
        'names' => 'sport, culture'
    )),
     'taxonomy' => 'news_cat'
  ));

上記で作成した関数と、get_terms、 get_term_link を使って、タームのリンクを出力する関数を作成。

  • パラメータを指定せずに実行すると wp_list_categories とほぼ同じ結果になる。
  • パラメータには、get_terms で指定できるものを受け取る。(全部ではないが)
  • リストの前に画像も挿入可能。
//カテゴリーを表示する関数
function list_my_taxonomy($args = array()) {
  //デフォルト値
  $defaults = array(
    'parent' => '',  //出力する親タクソノミーのIDまたは名前(0 を指定すると最上位の全てのカテゴリーを読み込む)
    'include' => '',    //出力するタクソノミーのターム名をカンマで区切って指定。
    'exclude' => '',    //除外するタクソノミーのターム名をカンマで区切って指定。
    'hide_empty' => 0,    //記事(投稿)のないタクソノミーのタームも読み込むかどうか
    'show_counts' => false,     //記事(投稿)の件数を表示するかどうか
    'child_of' => '', //タクソノミーのIDまたは名前を指定(そのIDのタクソノミーの子孫がすべて対象となる)
    'orderby' => 'name',  //並べ替えのキー id, slug, name, count
    'order' => 'ASC',  //並べ替えの順序 'ASC'または'DESC'
    'image_html' => '',  //挿入する画像のHTML
    'taxonomy' => 'category',   //タクソノミーの指定
    'field' => 'name',  //名前またはスラッグの指定。デフォルトは「名前」、スラッグの場合は「slug」と指定。
    'search' => '',  //取得したいタクソノミーの名前(その一部)を指定
    'name__like' => '',  //取得したいタクソノミーの名前の先頭部分を指定
  );
  $args = wp_parse_args( $args, $defaults );    //パラメータを解析し、省略されたパレメータにはデフォルト値をセット
  extract( $args, EXTR_SKIP );    //キーを変数名、値を変数の値として処理
  
  if(!is_numeric($parent)) {  //親タクソノミーはIDでも名前でも指定可能なため、数値以外はIDに変換
    $term = get_term_by( $field, trim($parent), $taxonomy);
    if($term) $parent = $term->term_id; 
  }
  
  if(!is_numeric($child_of)) {  //子タクソノミーもIDでも名前でも指定可能なため、数値以外はIDに変換
    $term = get_term_by( $field, trim($child_of), $taxonomy);
    if($term) $child_of = $term->term_id; 
  }
  
  $include_ids = return_tax_term_id(array('names'=> $include,'field' => $field, 'taxonomy' => $taxonomy));
  $exclude_ids = return_tax_term_id(array('names'=> $exclude,'field' => $field, 'taxonomy' => $taxonomy));
  
  $terms = get_terms( $taxonomy, array(  //以下のパラメータで指定したカテゴリーオブジェクトの配列を変数に代入
    'parent' => $parent,  //親カテゴリーのIDの指定
    'hide_empty' => $hide_empty,  //記事(投稿)のないカテゴリーも読み込むかどうか
    'include' => $include_ids,  //インクルードするカテゴリーIDのリスト
    'exclude' => $exclude_ids,  //除外するカテゴリーIDのリスト
    'child_of' => $child_of,
    'orderby' => $orderby,  //並べ替えのキー
    'order' => $order,  //並べ替えの順序
    'search' => $search,  //取得したいタクソノミーの名前(その一部)を指定
    'name__like' => $name__like    //取得したいタクソノミーの名前の先頭部分を指定
  ));
  
  if(count($terms)) {  //カテゴリーがある時だけ、以降の処理を行う
    echo "<ul>\n";
    foreach($terms as $term) {
      echo '<li>';
      if($image_html != '') echo $image_html;  //画像の指定があれば挿入
      echo '<a href=" ' . get_term_link($term, $term->taxonomy) . ' ">' . $term->name . '';  //カテゴリーのリンクと名前を出力
      echo $show_counts  ? '<span>(' . $term->count . ")</span></a>\n" :  "</a>\n";  //$show_countsが真の場合は件数を出力
      echo "</li>\n";
    }
    echo "</ul>\n";
  }
}

function return_tax_term_id($args = array()) {  //前述の関数
  $defaults = array(
    'names' => '', //出力するタクソノミー名をカンマで区切って指定。
    'field' => 'name', //除外するタクソノミー名をカンマで区切って指定。
    'taxonomy' => 'category', //タクソノミーの指定。デフォルトはカテゴリー
  );
  $args = wp_parse_args( $args, $defaults ); //パラメータを解析し、省略されたパレメータにはデフォルト値をセット
  extract( $args, EXTR_SKIP ); //キーを変数名、値を変数の値として処理
    
  if($names == '') return '';
  $strings = explode(',', $names);
  $ids = ''; //タームIDのリスト(カンマ区切りの文字列)
  $count = count($strings);
  if($count) {
    for($i=0; $i < $count; $i++) { //タクソノミーの個々の名前(ターム)からそれらのタームIDを取得
       //タクソノミーの個々の名前(ターム)の前後に空白がある可能性があるので取り除く
      $term = get_term_by( $field, trim($strings&#91;$i&#93;), $taxonomy);
      if($term) $ids .= $term->term_id;
      if($i != $count-1) {
        $ids .= ','; //最後の要素以外はカンマで区切る
      }
    }
  }
  return $ids;  
}

以下は使用例。

//カスタムタクソノミー「news_cat」のリンクを出力
list_my_taxonomy(array('taxonomy' => 'news_cat'));

//カスタムタクソノミー「news_tag」の「a」から始まるリンクを出力し、その前に画像を挿入
list_my_taxonomy(array(
    'taxonomy' => 'news_tag', 
    'name__like' => 'a', 
    'image_html' => '<img src="'.get_template_directory_uri() . '/images/arrow_right_gray-trans.png" width="9" height="15" alt="" />'
  ));