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="" />'
));