WordPressのマルチサイトでサイトに応じたclassを出力する

フォーラムの「WordPress ヘッダータイトル文字を画像に変える」に回答したネタ。

マルチサイトで、サイト毎にちょっとだけデザインを変えたいときなんかに、bodyのclassにサイトに応じたクラス名を追加してくれます。
使い途あるといいな。。

クラス出力例

<body class="home blog logged-in admin-bar single-author site-child two-column right-sidebar">

CODE 1

function add_multisite_class( $classes ) {
	global $current_blog, $current_site;
	if ( is_multisite() ) {
		if ( is_main_site() ) {
			$classes[] = 'main-site';
		} else {
			if ( is_subdomain_install() ) {
				$slug = substr( $current_blog->domain, 0, strpos( $current_blog->domain, '.' ) );
			} else {
				$slug = trim( $current_blog->path, '/' );
			}
			$classes[] = 'site-' . $slug;
		}
	}

	return $classes;
}
add_filter( 'body_class', 'add_multisite_class' );

WordPressのbody_classに固定ページのルートのスラッグを追加する

body_classで出力されるclassに最上位のルートのページのスラッグを含むclass名が追加されるようになります。子ページ全部で同じcssを利用できるので、特定のツリーだけ配色を変更したいときなど便利にですよね。さらに、汎用化しているので固定ページだけじゃなくて、階層サポートしたのカスタム投稿タイプでも利用できます。

class名は、{投稿タイプスラッグ}-category-{ページのスラッグ}という命名規則にしてますが、このあたりはお好みで。

 $post_type . '-category-' . $post->post_name

の部分を変えてくださいな。

function add_page_root_body_class( $classes ) {
	if ( is_singular() ) {
		$post_type = get_query_var( 'post_type' );
		if ( is_page() ) {
			$post_type = 'page';
		}
		if ( $post_type && is_post_type_hierarchical( $post_type ) ) {
			global $post;
			if ( $post->ancestors ) {
				$root = $post->ancestors[count($post->ancestors) - 1];
				$root_post = get_post( $root );
				$classes[] = esc_attr( $post_type . '-category-' . $root_post->post_name );
			} else {
				$classes[] = esc_attr( $post_type . '-category-' . $post->post_name );
			}
		}
	}
	return $classes;
}
add_filter( 'body_class', 'add_page_root_body_class' );