WordPressブロックエディタの見出しに自動でクラスを追加する方法

WordPressブロックエディタの見出しに自動でクラスを追加する方法

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);
```

コードの仕組み

処理は以下の流れで実行されます:

  1. ブロックの種類を判定
    ・見出しブロック(core/heading)の場合のみ処理を続行
    ・他のブロック(段落、画像など)はスキップ
  2. 見出しレベルを取得
    ・ブロックの属性から見出しレベル(2, 3, 4など)を取得
    ・設定がない場合はh2として扱う
  3. H2の処理(c-title02を追加)
    ・見出しレベルが2の場合に実行
    ・既存のclass属性の有無をチェック
    ・class属性がある場合:既存のクラスに「c-title02」を追加
    ・class属性がない場合:新しくclass属性を作成
  4. H3の処理(c-title03を追加)
    ・見出しレベルが3の場合に実行
    ・H2と同様の処理で「c-title03」を追加
  5. 更新された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での実装は、手作業でのクラス追加が不要になり、命名規則などの独自のクラス設計を維持できるため、テーマ開発の柔軟性が向上します。一度設定すれば自動適用されるため、効率的なコンテンツ制作が可能になります。