概要説明
WordPress の body タグに、functions.php の body_class フィルターで class を足す方法。トップページとそれ以外で分けるコードと、カスタムフィールドで記事・固定ページごとに class を変えるコード、最初から付いている class も。
~ 目次 ~
トップページとそれ以外で class を分ける
body タグに class を足しておくと、CSS で「このページだけ見た目を変える」が簡単になります。WordPress では、テーマの header.php にある body_class() が class を出していて、functions.php から body_class フィルターで足せます。
functions.php
/*----------------------------------------------------
body タグに class を足す(トップページとそれ以外で分ける)
----------------------------------------------------*/
if ( ! function_exists( 'fs_add_body_classes' ) ) {
function fs_add_body_classes( $classes ) {
if ( is_front_page() ) {
$classes[] = 'fs-top';
} else {
$classes[] = 'fs-other';
}
return $classes;
}
add_filter( 'body_class', 'fs_add_body_classes' );
}
- テーマの header.php に
<body <?php body_class(); ?>>と書いてあることが前提です。body_class() がないテーマでは、class は出ません。 - 足す class の名前は、ほかの CSS とぶつからないように、頭に決まった文字(例:fs-)を付けるのがおすすめです。関数の名前も同じです(前に載せていた add_body_classes のような名前は、ほかのプラグインとぶつかることがあります)。
最初から付いている class
WordPress は、何もしなくても body にいろいろな class を付けています。足す前に、これで足りないか見てください。
- トップページ:home(最新の投稿を出すときは blog も)
- 記事:single、postid-99(記事の ID)、single-format-standard など
- 固定ページ:page、page-id-12、page-template-(テンプレートの名前)など
- カテゴリーの一覧:category、category-(スラッグ)など
- ログイン中:logged-in、admin-bar
記事・固定ページごとに class を変える(カスタムフィールド)
ページごとに好きな class を付けたいときは、カスタムフィールドに書いた値を class にします。
functions.php
/*----------------------------------------------------
記事・固定ページごとに、カスタムフィールド body_class の値を class に足す
----------------------------------------------------*/
if ( ! function_exists( 'fs_add_body_class_from_field' ) ) {
function fs_add_body_class_from_field( $classes ) {
if ( is_singular() ) {
$value = get_post_meta( get_queried_object_id(), 'body_class', true );
foreach ( preg_split( '/\s+/', (string) $value, -1, PREG_SPLIT_NO_EMPTY ) as $name ) {
$name = sanitize_html_class( $name ); // class に使えない文字を取り除く
if ( '' !== $name ) {
$classes[] = $name;
}
}
}
return $classes;
}
add_filter( 'body_class', 'fs_add_body_class_from_field' );
}
- 投稿の編集画面の「カスタムフィールド」で、名前を body_class、値を付けたい class(例:lp-wide)にして保存します。カスタムフィールドの欄が見えないときは、画面の右上の「表示オプション」(ブロックエディタは「設定」→「パネル」)で表示します。
- 空白で区切ると、class を 2 つ以上付けられます。
- class に使えない文字(< > など)は、sanitize_html_class() で取り除いてから足します。
style.css(例)
/* 例:トップページだけ見出しを大きく */
.fs-top h2 { font-size: 28px; }
/* 例:カスタムフィールドに lp-wide と書いたページだけ横幅を広げる */
.lp-wide .content { max-width: 1200px; }
確かめた結果
作業環境(WordPress 7.1)で、上の 2 つのコードを入れて body の class を見ました。
- トップページ:home blog … fs-top
- カスタムフィールドに「lp-wide dark<script>」と入れた記事:… fs-other lp-wide darkscript(< と > は取り除かれた)
- カスタムフィールドのない記事:… fs-other
参考
管理画面の body に class を足すときは、admin_body_class フィルターを使います(こちらは配列ではなく、空白で区切った文字列を返します)。


