get_categories, get_tags, wp_list_categories, wp_tag_cloud, get_terms などの関数では、除外するタームを 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[$i]), $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 を使って、タームのリンクを出力する関数を作成。
//カテゴリーを表示する関数 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[$i]), $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="" />' ));