bodyとpostクラスに所属カテゴリのスラッグを付与したい。
だいぶ前に「投稿が所属するカテゴリの先祖や子孫を取得するあれこれ。」という記事を書きましたがそこそこアクセスがあったので、実用レベルでよく使うアレンジも紹介しておきます。functions.phpに入れるだけで動きます。正確には、使用テーマのテンプレートでbody_classとpost_classを使用していれば動きます。
実際の出力例は以下のような感じです。
アーカイブページを表示中の場合
<body class=”archive category category-child category-99 logged-in admin-bar no-customize-support category-ancestor category-parent“>
投稿ページを表示中の場合
<body class=”single single-post postid-999 single-format-standard logged-in admin-bar no-customize-support category-child category-ancestor category-parent taxonomy-term“>
category-childが表示中のカテゴリだとすると、category-ancestor(先祖カテゴリ)やcategory-parent(親カテゴリ)も付与してくれるのがミソです。すべてのタクソノミに対応するようにしています。cssによるカスタマイズがしやすくなるのではないでしょうか。もちろんカスタムタクソノミにも対応です。
※ちなみに以下の関数はpage slugにも対応していますが、不要な場合は削除してください。すでに同じ機能の関数を設置している場合はそっちを削除するか、こっちに変更を加えてください。
CODE
/////////////////////// 投稿及びカテゴリページで所属カテゴリ・親カテゴリクラスを付与 ///////////////////////
function add_term_name_to_body_and_post_class( $classes ) {
if ( is_admin() ) return $classes; //管理画面を除く
if ( is_singular() ){ //シングル投稿タイプ
global $post;
$capability = get_post_type_object( $post->post_type )->capability_type;
if ( $capability == 'page' ){ // 固定ページ及びカスタム固定ページ // ページスラッグ付与が不要なら以下の分岐を削除
$classes[] = $post->post_type.'-' . $post->post_name;
if ($post->post_parent) $classes[] = $post->post_type.'-' . get_page_uri($post->post_parent) . '-child';
} elseif ( $capability == 'post' ){ // 投稿及びカスタム投稿タイプ
$taxes = get_object_taxonomies( $post->post_type, 'names' );
if ($taxes) : unset( $taxes['post_format'] );
foreach ( $taxes as $taxname ) :
$tax = get_taxonomy( $taxname );
if ( !$tax || !$tax->hierarchical ) continue;
$terms = get_the_terms( $post->ID, $taxname );
if ( $terms ): foreach ( $terms as $term ) :
$classes[] = $taxname. '-' .$term->slug;
$parent = get_term_parent_slug_by_slug( $term->slug, $taxname );
while( $parent ){ //loop
$classes[] = $taxname. '-' .$parent;
$parent = get_term_parent_slug_by_slug( $parent, $taxname );
}
endforeach; endif;
endforeach; endif;
}
} elseif ( is_archive() ) {
$term_slug = $taxname = '';
if ( get_query_var( 'category_name' ) ){
$term_slug = get_query_var( 'category_name' );
$taxname = 'category';
} elseif ( get_query_var( 'taxonomy' ) && get_query_var( 'term' ) ) {
$term_slug = get_query_var( 'term' );
$taxname = get_query_var( 'taxonomy' );
}
if ( $term_slug && $taxname ){
$parent = get_term_parent_slug_by_slug( $term_slug, $taxname );
while( $parent ){ //loop
$classes[] = $taxname. '-' .$parent;
$parent = get_term_parent_slug_by_slug( $parent, $taxname );
}
}
}
return $classes;
}
add_filter( 'post_class', 'add_term_name_to_body_and_post_class' );
add_filter( 'body_class', 'add_term_name_to_body_and_post_class' );