tips

bodyクラスに投稿/カテゴリの所属スラッグをすべて付与する

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によるカスタマイズがしやすくなるのではないでしょうか。もちろんカスタムタクソノミにも対応です。

CODE


/////////////////////// 投稿及びカテゴリページで所属カテゴリ・親カテゴリクラスを付与 ///////////////////////

function add_term_name_to_body_and_post_class( $classes ) {

function get_term_parent_slug_by_slug( $term_slug, $taxname ){
 $term = get_term_by( 'slug', $term_slug, $taxname );
 if ( $term->parent ){
 $parent_slug = get_term( $term->parent, $taxname )->slug;
 } else {
 $parent_slug = '';
 }
 return $parent_slug;
 }

if ( is_singular() ){ 
 global $post;
 $taxes = get_object_taxonomies( $post->post_type, 'names' );
 if ($taxes) : unset( $taxes['post_format'] );
 foreach ( $taxes as $taxname ) :
 $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' );

Your Comment

コードの記述は<pre>または<code>タグで括って下さい。自動的にエスケープされます。

 

右の文字を入力して下さい captcha