テーマをカスタマイズしたいけど、実装が大掛かりになりそうな時やプラグインを入れてみたけど、何か物足りないので拡張するプラグインを作成しようとした時に、一からコードを書くのは大変ですよね。
そんな時は使用中のプラグインに定義されている便利な関数やクラスを継承して使えると便利ですよ。WordPressはGPLライセンスなので利用は自由にできます。
そこでプラグインに定義されている関数やクラスを使う際、安全に使うために必ずやっておきたいことを紹介します。
テーマとプラグインとWordPressの関係
WordPressのテーマやプラグインを作成する時はWordPressに用意されているテンプレートタグや関数を使います。
このおかげで比較的簡単にテーマやプラグインを作成することができます。
もし、その関数などが使えなかったら一からコードを書いて作るのは時間もコストも技術力もかかってしまい大変です。
WordPressにあらかじめ関数が定義されていることでWordPressをまだ覚えたての方でも比較的簡単にテーマを作成することができます。
例えば、記事ページにブログの投稿記事を表示するには下記のようなコードをsingle.php
に書けば記事のタイトルとコンテンツが表示されます。この時データベースなどを意識しなくてもいいので簡単ですね。
// ~~ 省略 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); <article> <h1 class="entry-title"><?php the_title(); ?></h1> <div class="entry-content"><?php the_content(); ?></div> </article> endwhile; endif; // 省略 ~~
<article>~</article>
の外側のif
・while
の部分はWordPressのループの記述で上記のコードの内、以下の2つはWordPressのテンプレートタグです。
<?php the_title(); ?>
<?php the_content(); ?>
テンプレートタグは、テーマ上でいくつかループの中で使うなどの制限がありますが、そのまま書いて使うことができます。
そのまま書いて使えるのはテーマやプラグインがWordPress上で動作することが前提であるため、WordPressにあらかじめ関数が定義されているからです。
プラグインから関数を流用する時との違い
WordPressに定義されている関数を使うようにプラグインに定義されている関数をそのままテーマや他のプラグインのカスタマイズなどで使うとエラーや本番環境では真っ白の画面に直面する危険があります。
これはプラグインが必要不可欠なものでないからです。プラグインはいつでも追加・停止・削除が行え別のものと入れ替えたりできるためです。
例えば、下記のようなコードがプラグインに書かれていてそのコードをテーマで流用したいとします。
<?php function example_function() { echo 'Example Plugin (A) の関数 example_function です。'; }
上記のコードをWordPressに定義されているテンプレートタグのようにテーマやプラグインに使ってしまうとどのような不具合がおきるでしょうか?
下記のようにテーマのテンプレートファイルsingle.php
へコードを書いた場合を考えてみます。
<?php // ~~ 省略 example_function(); // 省略 ~~
出力結果
Example Plugin (A) の関数 example_function です。
このコードは元のプラグインに依存していますので、プラグインが有効な場合は機能します。しかし、プラグインは停止したり削除できます。他のプラグインで代替することもあるでしょう。
WordPress本体に定義されている関数はテーマやプラグインを使うにあたって必ず呼び込まれるものです。それに対して、プラグインは必ず呼び込まれるとは限りません。以下は不具合を起こすケースです。
ケース(1) プラグインを停止・削除した時
WordPress上でテーマをカスタマイズするのに依存しているプラグインが存在しないため、定義している関数が見つからず、「例3」のコードでは存在しない関数を使っていることになり、エラーになります。
記事ページを開いた時に以下のような表示が確認できると思います。
Fatal error: Call to undefined function example_function() in /home/ubuntu/wordpress/wp-content/themes/twentysixteen/single.php on line 21 // 以下省略
themes/twentysixteen/single.php
ファイルの21行目に未定義の関数example_function()
が呼ばれている致命的なエラーがあるよと教えてくれています。
ケース(2) 同じ関数が定義された代替プラグインを有効にした時
テーマをカスタマイズするのに依存しているプラグインを停止・削除をすることになるので前述したエラーが表示される可能性がまずあります。それに加えて、代替プラグインに依存していたプラグインと同じ名前が付けられた関数が定義されている可能性もあります。
すると記述した関数のコードは正常に動作しますが、その処理内容は自分の意図していたものと違う結果になってしまうかもしれません。例えば、下記のように「例2」と同じ名前の関数をもつプラグインがあったとします。
<?php function example_function() { echo 'Example Plugin (B) の関数 example_function です。'; }
この場合は「例3」のコードはエラーにならず正常に動作します。しかし、「例3」のコードの出力結果は以下のようになります。
Example Plugin (B) の関数 example_function です。
意図していたものと違う結果になってしまいますし、この場合エラーが出ないので厄介です。WordPressに慣れていない人には気づきにくいかもしれませんので、運営中のサイトで公開する前にテストを行ってください。また、代替のプラグインによっては悪意のあるコードを出力してしまう可能性もありますね。
エラーの対象方法
エラーにならないように安全に使うには以下の様な対策を行っておくと良いでしょう。
ケース(1) プラグインを停止・削除した時の対策
このケースでは関数が存在するかチェックすることで対策できます。PHPには関数やクラス、クラスのメソッドの定義を確認する関数などがありますのでそれを使うと良いでしょう。
PHP関数
変数の確認はPHP関数の型の比較表も参考にしてみてください。
上記であげたPHP関数を使って「例3」のコードを書き換えてみます。
<?php // ~~ 省略 if ( function_exists( 'example_function' ) ) { example_function(); } // 省略 ~~
このようにif文とfunction_exists
を使って関数が定義されている場合はコードを実行するようにすれば、エラーの対策ができます。
ケース(2) 同じ関数が定義された代替プラグインを有効にした時の対策
「ケース(1) プラグインを停止・削除した時の対策」では、関数は定義されているので条件をクリアしてしまいます。この場合は、どのプラグインの関数か特定できれば対策できそうです。
WordPress関数にはプラグインが有効かどうか確認するis_plugin_active()
関数が定義されているので、それを使うとよいでしょう。
- 関数リファレンス/is plugin active – WordPress Codex 日本語版
- is_plugin_active() | Function | WordPress Developer Resources
is_plugin_active()
を使って有効かどうか確認することができます。しかし、この関数は管理画面の時は使えますが、ユーザーにコンテンツを表示しているページなどでは呼び込まれていないので、そのまま使うことができません。
管理画面以外のページで使うには定義されているファイルをインクルードする必要があります。
「例3」のコードを下記のように対策したコードに書き換えることができます。
if ( ! function_exists( 'is_plugin_active' ) ) { include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); } if ( is_plugin_active( 'plugin-directory/example-plugin-a.php' ) && function_exists( 'example_function' ) ) { example_function(); }
このように書いておけば、もし同じ関数名で定義されていても依存しているプラグイン以外では実行されないように対策できます。
example-plugin-a.php
とexample-plugin-b.php
2つ有効にした場合はプラグイン同士で衝突してしまうので、どちらかを停止か削除してください。
プラグインが有効化されているかどうか調べる方法として、以下のリンク先も参考にしてみてください。
まとめ
プラグイン内の関数やクラスを使う時に覚えておくと良いこと
- GPLライセンス
- テーマとプラグインはWordPress上で動く
- プラグインは必要不可欠なものではない
- 関数・クラスなどが定義されているかどうか確認する
- プラグインが有効かどうか確認する
- 入力・出力時はデータの検証をする
最後に
プラグインを使っているけど、もうちょっとこんな機能がほしいって時は、元のプラグインを拡張するプラグインのプラグインを作ってみたりするとより使いやすくなったりします。
テーマのカスタマイズから一歩進んでプラグインのカスタマイズをしてみるのも楽しいですよ。
また、至らない点などありましたらご教授ください。