テンプレートから消すとトラブルが発生するwp_head・wp_footer・the_post

WordPress個別サポート

WordPressのテンプレートをカスタマイズするときは、既存の命令を削除することもあります。どの命令を消すかは自由ですが、削除するとトラブルが起きる命令もあります。

ここでは、テンプレートから消すとトラブルが起きる3つの命令wp_head・wp_footer・the_postを紹介します。うっかり消してしまったり、自作テーマで書き忘れることがあります。注意しましょう。

wp_headを消すとデザインが崩れる!

wp_headという命令は、header.phpのheadタグの内側に記述されています。サイトで必要なCSSやJavaScriptファイルの読み込みなどを行います。

<?php wp_head(); ?>

このwp_headを削除するとテーマのスタイルシートなどが読み込まれないため、デザインがガタガタに崩れます。プラグインでも使っているので、削除すると一部のプラグインが動作しなくなります。

wp_headを削除したらデザインが崩れた
wp_headを削除するとデザインが崩れる

お試しで消すことはないと思いますが、header.phpの編集後にデザインが崩れたときはwp_headを削除していないか確認しましょう。

wp_footerを消すとアドミンバーが消える!

wp_footerという命令は、footer.phpに記述されています。bodyの終了タグあたりに書かれています。wp_headと同じようにライブラリの読み込みやフッター周辺のパーツ制御などに使われます。

<?php wp_footer();?>

削除するとアドミンバーが消えたりタップメニューが反応しなくなります。

wp_footerを削除したらアドミンバーが消えた
wp_footerを削除するとアドミンバーが消える

wp_headと同じように、あえて消すことはないと思いますが、テーマを自作するときに書き忘れることはあります。自作テーマの動作がおかしいときは、wp_headやwp_footerを書き忘れていないかチェックしましょう。

the_postを消すと表示が止まらなくなる!

投稿のsingle.phpや固定ページのpage.phpを開くと必ず書いてあるのがwhile文です。そのwhile文と必ず一緒に使われているのが「the_post」です。

<?php while ( have_posts() ) : the_post(); ?>
…略…
<?php endwhile; ?>
<?php
while ( have_posts() ) :
the_post();
?>
…略…
<?php endwhile; ?>

パターン1もパターン2も機能は同じです。「while」~「endwhile」に囲まれた部分を繰り返し行う仕組みです。WordPressでは「1件の投稿表示を10回繰り返す」のような動作を行うことでページに必要な投稿や固定ページが表示される仕組みになっています。

この「while」で重要なのは、「繰り返しを終了する」ということです。1件の表示をいつまでも繰り返していては、画面に無限の投稿が表示されてしまいます。

繰り返しを終了するには、「次の投稿を読む」ことが必要です。1件目の投稿を表示したら、その次の2件目を取り出して表示、その次の3件目を取り出して表示、という具合で10件目を取り出すと、その次は何もないので終了する仕組みです。

この「次の投稿を取り出す」のがthe_postです。つまり、the_postを消すと、1件目の投稿を表示した後、2件目を読み込まずにまた1件目の投稿を表示、その次も1件目の投稿を表示、その次も1件目、、のように延々と同じ投稿の表示が続き、終わらなくなります。

これを「無限ループ」といいます。プログラミングを学び始めたばかりの方が、うっかりミスで体験してしまう冷や汗をかく現象です。

実際はサーバーの制限で30秒などで終了する場合があります。

そのようなわけで「the_post();」は絶対に消してはいけません!

たとえば、こんな感じに。

<?php while ( have_posts() ) : ?>
…略…
<?php endwhile; ?>

見本を見せてから言うのも変ですが、絶対禁止です!

どうなるのか興味を持ったとしても決して気軽に試してはいけません。レンタルサーバーで試した場合、そのサーバーを共有する他のユーザーに迷惑をかけることになります。ご注意ください!

ローカル環境で試す場合は、set_time_limitなどを使ってwp-config.phpに時間制限を追加して、WP_DEBUG定数をtrueに設定(エラーメッセージを確認するため)してから試してみましょう。修正したwp-config.phpは次のようになります。

set_time_limit(1);
define('WP_DEBUG', true);

「set_time_limit(1)」は時間制限を1秒に設定するコードです。これで、「the_post();」を削除したテンプレート(single.phpなら投稿、page.phpなら固定ページ)を表示したとしても、制限時間(1秒)に達すると次のようなエラーメッセージが表示されて止まります。

制限時間オーバーで表示が終了する
制限時間オーバーで表示が終了する

「set_time_limit(1)」は1秒で表示を止めるという意味です。たった1秒でも、相当に長いページが表示されることを実感できるはずです。もしも時間制限なしに表示が続くとすれば、、、考えただけで怖いです。私は新入社員のころ何度かやりましたが。。。

通常のサイトに上記の時間制限を付けないように注意してください。1秒という時間制限では短すぎるケースもあります。