[wordpress] テーマ内で新しい関数を使う場合は、function_existsを使おう

wordpressで新しくプラグインをインストールして、テーマ内で新しく関数が使えるようになったとするじゃないですか。まぁ、はじめの頃はいいんですよね。その機能が使いたくて追加したわけですから。

ただ、時間がたち、wordpressにその機能が追加されたり、入れてみたけど使い勝手が悪かったり、急に重くなったりして、やっぱりこのプラグインいらねーな、ってなることもあると思うんですよ。そして、「えいっ」ってプラグインを停止する日が来るかもしれません。

しかし、そのとき、エラー出ちゃうんですよね、そのプラグインのおかげで使えていた関数がテーマ内にある場合には。「Fatal error: Call to undefined function wp_xxx()」みたいなエラーがね。そりゃあそうですよね、プラグインの中に関数の情報が入っているわけですから、wordpressも「こんな関数しらねーぞ」って話になるわけです。

プラグインを停止した時に、対応する関数をテーマからとってしまえば解決します。ただ、プラグインを無効化するのとテーマをいじるのとでは、手間が違うじゃないですか。それに、もしサイト管理者がphpをあまり触ったことのない場合は、エラーがでただけで「なんか末恐ろしいことが起きてるんじゃないか」と感じてしまうかもしれません。また、サイトへの訪問客にもいい印象は与えません。

そこでおススメしたいのが、phpの関数である「function_exists」です。これは、指定した関数が定義されているかどうかをチェックできる関数です。

例えば、あるプラグインをインストールして、「wp_xxx」という関数をテーマ内で使えるようになったとしましょう。ここで舞い上がって「wp_xxx();」などとテーマ内に書いてはいけません。このプラグインを停止した時に、この関数を使っている部分でエラーが出るからです。さきほど紹介したの「function_exists」を使って、次のように書きましょう。

if (function_exists('wp_xxx')) { wp_xxx(); }

このように書くと、「wp_xxx」という関数が定義されていたら「wp_xxx();」を実行するし、この関数がなければ無視されます。プラグインをアンインストールしても、「関数が定義されてないよ」というエラーが出ないんですね。すばらしいです。

また、関数の返り値をdivなどで囲っていて、もし関数がない場合はdivごと表示したくない、ということもあるでしょう。つまり、下のような場合ですね。

<div id="xxx">
  <?php if (function_exists('wp_xxx')) { wp_xxx(); } ?>
</div>

上のような場合に、関数がなければ、それをかこっているdivも表示しないようにしたい。そういうときは、ifの順番を変えて、次のように書きます。

<?php if( function_exists('wp_xxx') ){ ?>
  <div id="xxx">
    <?php wp_xxx(); ?>
  </div>
<?php } ?>

最初の行と最後の行がif文の最初と最後にそれぞれ対応しています。「wp_xxx」という関数があれば、if文の中が全部実行されるので、divの表示と「wp_xxx();」の実行が行われます。関数がなければ、この部分が丸々無視されます。こうしておけば、プラグインがなくなっても、エラーが出ることはありません。

なお、プラグインだけでなく、functions.phpに新しく関数を追加し、それをテーマ内で使うときも、「function_exists」を使った方がいいでしょう。

前の記事:
[jQuery] ajaxで複数回の処理を順番に実行するよ
次の記事:
PVにも質ってあると思うんだ