WordPressカスタマイズ初心者に役立つPHPヒアドキュメントの使い方

WordPressカスタマイズ初心者に役立つPHPヒアドキュメントの使い方

WordPressは主にPHPをメインとして構築されていることもあり、投稿ページや固定ページ、ヘッダーやフッターなどのテーマファイルはPHPとHTMLが混在して記述される形となっています。

慣れるとそこまでではないのですが、やはり初めてWordpressをカスタマイズしようとしたときは非常に読みづらいなと感じた経験があります。

例えば、以下のようなソースコードがあったとします。

$title = 'タイトル';
$content = 'コンテンツ';

$html = '<div class="custom-box">';
$html .= '<h1>'.$title.'</h1>';
$html .= '<p>'.$content.'</p>';
$html .= '</div>';

echo $html;

これくらいの長さのソースコードであれば、可読性が落ちることはないのですが、もっと長いものになると構造を把握しづらくなってきます。さらに文字列をつなげる連結演算子(.)を使って変数とHTMLを結合していかないといけないので手間がかかってしまいます。

これを解決する方法として挙げられるのがPHPのヒアドキュメントです。

目次

PHPヒアドキュメントとは?

WordPressのカスタマイズを行う際、functions.phpなどで長いHTMLやJavaScriptコードを扱うことがあります。そんなときに便利なのが、先述したPHPのヒアドキュメントです。

ヒアドキュメントを使えば、複雑な文字列やテンプレートを可読性の高い形で記述できるため、WordPress初心者でも効率的にコード管理ができるようになります。

このヒアドキュメントとは、PHPで複数行の文字列を簡潔に記述するための構文です。

例えば、<<<EODのような形式で始まり、任意の識別子で閉じることで、HTMLやCSSを含む長文をそのまま出力できます。これは特に、ショートコードのテンプレート生成や管理画面のカスタム出力など、WordPressのカスタマイズで頻繁に使われる場面で重宝されています。

WordPressでのヒアドキュメント使用例

先ほどのソースコードをヒアドキュメントを使って記述するとこうなります。

$title = 'タイトル';
$content = 'コンテンツ';

$html = <<<EOD
<div class="custom-box">
  <h1>{$title}</h1>
  <p>{$content}</p>
</div>
EOD;

echo $html;

このように、<<<EODEOD;内に複数行のHTMLをそのまま書けるため非常に効率的です。特に、ショートコードのテンプレート生成や、メール本文の整形などにも応用でき、WordPressのカスタマイズ初心者でも簡単に導入可能です。

なお、<<<EODEOD;の部分は「EOM」「EOF」「EOT」「HTML」など何でもよく、開始と終端が同じであれば問題ありません

また、ヒアドキュメントは変数展開にも対応しているため、動的なコンテンツを含む出力にも適しています。

上記の例では、$title$contentをそれぞれ{}で囲うことで変数を出力することができます。こうすることで、可読性を維持しながら、WordPressのカスタマイズをより柔軟かつスマートに行えるようになります。

ショートコードのテンプレート

もう少し具体的な使用例も挙げてみようと思います。

WordPressのカスタマイズで比較的よく使用されるショートコードですが、ここでもヒアドキュメントを使えばHTMLをすっきりと記述できます。

function my_custom_box_shortcode() {
  return <<<HTML
  <div class="custom-box">
    <h3>おすすめ情報</h3>
    <p>これはPHPヒアドキュメントで生成されたショートコードです。</p>
  </div>
HTML;
}
add_shortcode('custom_box', 'my_custom_box_shortcode');

あと、このブログの記事下に表示しているカテゴリーとタグのリストもヒアドキュメントを使用して記述しています。

function cat_tag_list(){
  $cat_terms = get_the_category();
  $cat_list = '';
  if(!empty($cat_terms)){
    foreach($cat_terms as $cat_term){
      $c_name = $cat_term->name;
      $c_id = $cat_term->term_id;
      $c_link = get_category_link($c_id);
      $cat_list .= <<<EOF
  <li class="tag-list-li">
    <a href="{$c_link}">
      <div class="a-tag"><i class="fa-solid fa-folder"></i>{$c_name}</div>
    </a>
  </li>
EOF
;
    }
  }

  $tag_terms = get_the_tags();
  if(!empty($tag_terms)){
    foreach($tag_terms as $tag_term){
      $t_name = $tag_term->name;
      $t_id = $tag_term->term_id;
      $t_link = get_tag_link($t_id);
      $cat_list .= <<<EOF
  <li class="tag-list-li">
    <a href="{$t_link}">
      <div class="a-tag"><i class="fa-solid fa-tag"></i>{$t_name}</div>
    </a>
  </li>
EOF
;
    }
  }

  $output = <<<EOF
<ul class="tag-list">
  {$cat_list}
</ul>
EOF
;
  echo $output;
}

これに関しては、可読性という点ではそれほどメリットを感じませんが、個人的にはメンテナンスがしやすいということでヒアドキュメントでの記述を採用しています。

ヒアドキュメントのよくあるエラーと対処法

PHPヒアドキュメントは便利な構文ですが、ちょっとした記述ミスでエラーが出やすいのも事実です。ここでは、WordPressのカスタマイズ初心者がつまずきやすいポイントを例とともに紹介し、正しい書き方と対処法を解説します。

セミコロンの付け忘れ

ヒアドキュメントの終端の識別子(ここではHTML)の後には必ずセミコロン;)が必要となり、もし付いていない場合はエラーになります。

【間違った例】

echo <<<HTML
<p>こんにちは!</p>
HTML

【正しい例】

echo <<<HTML
<p>こんにちは!</p>
HTML;

このセミコロンですが、先ほど使用例で挙げた「カテゴリーとタグのリスト」では以下のような形で記述しています。

$cat_list .= <<<EOF
  <li class="tag-list-li">
    <a href="{$c_link}">
      <div class="a-tag"><i class="fa-solid fa-folder"></i>{$c_name}</div>
    </a>
  </li>
EOF
;

終了識別子のすぐあとにセミコロンを記述しているのではなく、改行してからセミコロンを記述しています

なぜ、このような形で記述しているかというと、ヒアドキュメントを使いだした当時(おそらくPHP6あたりだったと記憶しています)、終了識別子のすぐあとにセミコロンを記述していると、なぜかエラーが発生してしまいました。

どのサイトやブログでも、終了識別子のすぐあとにセミコロンが記述されている使用例しか載っておらず、ヒアドキュメントの使用をあきらめかけたのですが、とあるブログに同じようなエラーが発生するときの対処法が載っている記事を見つけました。

その記事によると、終了識別子のあと改行してセミコロンを記述するようにするとエラーが表示されなくなったという内容でした。(この内容が記載されている記事を探してみたのですが、残念ながら見つけることができませんでした…)

半信半疑で終了識別子のあと改行してセミコロンを記述するとエラーが表示されず、意図したとおりにヒアドキュメントでの出力が出来るようになりました。

その名残りもあって、自分自身がカスタマイズしているものに関しては、終了識別子のあとは改行してセミコロンを記述するようにしています。もし、使用例と同じようにしたのにエラーが出てしまうという場合は、上記の方法も試してみてください。

開始・終了識別子の後に文字列等が入っている

開始識別子・終了識別子の後に空白を含む文字列が入っているとエラー構文として処理されてしまいます。

【間違った例】

echo <<<EOD // 開始
<p>識別子の後ろに文字列あり</p>
EOD; // 終了

【正しい例】

echo <<<EOD
<p>識別子の後ろに文字列なし</p>
EOD;

ただし、先述のとおり終了識別子(上記の例ではEOD)の後にはセミコロン;は必ず必要ですので、この点はご注意ください。

また、PHP7.2以前は終了識別子の前にタブやスペースなどのインデントがあるとエラーが出ていたのですが、PHP7.3以降は終了識別子のインデント位置を計算してドキュメント内のインデントが形成される形になっています。

しかし、ドキュメント内の文字列等が最終識別子のインデントよりも少ない行があった場合は、その文字分だけ削られてしまいます。

初めてヒアドキュメントを使う場合であれば、終了識別子のインデントは考えずに行頭(左端)に寄せて書いた方が手っ取り早いかと思います。

以上がWordpressのカスタマイズ初心者でも役立つPHPヒアドキュメントの使い方となります。ヒアドキュメントは慣れると非常に役立つツールです。

特に、Wordpressのfunctions.phpでHTML出力をするようなカスタマイズをするときには重宝するのではと思いますので、ヒアドキュメントを活用してみてください。

Related posts