WordPressのブロックエディタ(Gutenberg)で記事を書く際、見出し(h2、h3)にスタイルを統一して適用したい場合、毎回手動でクラスを追加するのは手間がかかります。
この記事では、functions.phpを使って見出しに自動的にクラスを追加し、テーマ独自のスタイルを適用する方法を解説します。一度設定すれば、すべての投稿で統一されたデザインが自動適用されます。
見出しスタイルの課題
WordPressのブロックエディタでは、見出しブロックを追加すると標準のHTMLタグ(h2、h3など)が出力されます。テーマに合わせたデザインを指定するために、毎回手動でクラス名を追加するのは次のような問題があります。
デフォルトの出力
- 記事ごとに手作業が必要
- 入力ミスの可能性
- 後から変更が大変
- 複数のライターがいる場合、統一が困難
CSSでタグセレクタを使う
.entry-content h2 {
/* スタイル */
}
- 詳細度の管理が難しい
- 他のプラグインのCSSと競合しやすい
- ページごとに異なるスタイルを適用しにくい
自動クラス追加のメリット
- すべての投稿で自動適用
- 手作業不要(入力ミスなし)
- 命名規則など、独自のクラス設計を維持
- スタイルを一元管理できる
- 後からのデザイン変更も簡単
実装方法
以下のコードをテーマのfunctions.phpに追加します。
functions.phpのコード
/**
* 見出しに自動的にクラスを追加
*
* @param string $block_content ブロックのHTML
* @param array $block ブロックの情報
* @return string クラス追加後のHTML
*/
function add_custom_heading_class($block_content, $block) {
// 見出しブロック以外は処理をスキップ
if ($block['blockName'] === 'core/heading') {
// levelが設定されていない場合はデフォルトでh2として扱う
$level = isset($block['attrs']['level']) ? $block['attrs']['level'] : 2;
// H2にc-title02クラスを追加
if ($level === 2) {
// 既存のclass属性がある場合は、そこにクラスを追加
if (preg_match('/<h2[^>]*class="([^"]*)"/', $block_content)) {
// 既存のclass="..."に追加
$block_content = preg_replace('/<h2([^>]*)class="([^"]*)"/', '<h2$1class="$2 c-title02"', $block_content);
} else {
// class属性がない場合は新規作成
$block_content = preg_replace('/<h2/', '<h2 class="c-title02"', $block_content, 1);
}
}
// H3にc-title03クラスを追加
if ($level === 3) {
// H2と同様の処理
if (preg_match('/<h3[^>]*class="([^"]*)"/', $block_content)) {
$block_content = preg_replace('/<h3([^>]*)class="([^"]*)"/', '<h3$1class="$2 c-title03"', $block_content);
} else {
$block_content = preg_replace('/<h3/', '<h3 class="c-title03"', $block_content, 1);
}
}
}
// クラスを追加(または元のまま)のHTMLを返す
return $block_content;
}
// render_blockフィルターにフック(各ブロックがレンダリングされる直前に実行)
add_filter('render_block', 'add_custom_heading_class', 10, 2);
```コードの仕組み
処理は以下の流れで実行されます:
- ブロックの種類を判定
・見出しブロック(core/heading)の場合のみ処理を続行
・他のブロック(段落、画像など)はスキップ - 見出しレベルを取得
・ブロックの属性から見出しレベル(2, 3, 4など)を取得
・設定がない場合はh2として扱う - H2の処理(c-title02を追加)
・見出しレベルが2の場合に実行
・既存のclass属性の有無をチェック
・class属性がある場合:既存のクラスに「c-title02」を追加
・class属性がない場合:新しくclass属性を作成 - H3の処理(c-title03を追加)
・見出しレベルが3の場合に実行
・H2と同様の処理で「c-title03」を追加 - 更新されたHTMLを返す
・クラスが追加された見出しHTMLを返す
・WordPressがこれを画面に出力
実際に出力されるHTML
既存のクラスを保持しながら、自動でクラスが追加されます。
<h2 class="custom-style c-title02">はじめに</h2>CSSでのスタイリング
次に、追加されたクラスに対してスタイルを定義します。
以下のコードはこのサイトで実際に使っているものです。
// 投稿コンテンツ内のスタイル
.p-article__content {
// ==========================================================================
// 見出しスタイル(h2, h3, h4)
// ==========================================================================
// h2見出しスタイル(下線)
h2 {
font-size: myrem(20);
font-weight: bold;
margin-top: myrem(40);
margin-bottom: myrem(16);
padding-bottom: myrem(8);
color: #333;
// 最初のh2は上マージンなし
&:first-child {
margin-top: 0;
}
}
// h3見出しスタイル(シンプル)
h3 {
font-size: myrem(18);
font-weight: bold;
margin-top: myrem(30);
margin-bottom: myrem(12);
color: #333;
}
// h4見出しスタイル(上下線)
h4 {
font-size: myrem(16);
font-weight: bold;
margin: myrem(30) 0 myrem(12);
padding: myrem(6) myrem(16);
border-top: 1px solid #333;
border-bottom: 1px solid #333;
color: #333;
}
// リンクのホバースタイル
a {
&:hover {
color: #06c;
}
}
// インラインコード
code {
background-color: #f5f5f5;
padding: myrem(2) myrem(6);
border-radius: myrem(3);
font-family: "Courier New", monospace;
font-size: 0.9em;
}
// コードブロック
pre {
background-color: #f5f5f5;
padding: myrem(20);
border-radius: myrem(4);
overflow-x: auto;
margin: myrem(20) 0;
// pre内のcodeは背景なし
code {
background: none;
padding: 0;
}
}
}まとめ
WordPressブロックエディタの見出しに自動でクラスを追加することで、すべての投稿で統一されたデザインが適用され、スタイル管理が容易になります。functions.phpでの実装は、手作業でのクラス追加が不要になり、命名規則などの独自のクラス設計を維持できるため、テーマ開発の柔軟性が向上します。一度設定すれば自動適用されるため、効率的なコンテンツ制作が可能になります。