WordPress の body タグに class を足す(トップページだけ・ページごとに変える方法)

広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress の body タグに、functions.php の body_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' );
}
  1. 投稿の編集画面の「カスタムフィールド」で、名前を body_class、値を付けたい class(例:lp-wide)にして保存します。カスタムフィールドの欄が見えないときは、画面の右上の「表示オプション」(ブロックエディタは「設定」→「パネル」)で表示します。
  2. 空白で区切ると、class を 2 つ以上付けられます。
  3. 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 フィルターを使います(こちらは配列ではなく、空白で区切った文字列を返します)。

関連機能

  1. 長い記事の本文をファイルから読んで、REST API で下書きにする:コンソールに貼らない方法

  2. WordPress でページキャッシュが効いていても閲覧数(PV)を数える:Ajax で数えて管理画面の一覧に出す

  3. WordPressページ表示までの処理時間を管理者にだけ表示させる

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP