WordPressのウィジェットなどでPHPプログラムを表示する際にプラグインを使用してきましたが、セキュリティの問題などもありプラグインの使用をやめることにしてショートコードを使ってPHPを展開することにしました。
PHPプラグインに使われるeval関数は危険
2018年現在最新のWordpressプラグインにPHP Everywhereというのがありますが、このプラグインにはEval関数が使われています。
Eval関数とは指定された文字列をスクリプトとして実行する関数で、セキュリティ問題としてこの関数に対し不正なコードを引き渡すというものがあります。
システムに対する攻撃が可能ということなので、このプログラムは極力使用しないほうが良いでしょう。
WordPressにはショートコードを使ってあらかじめ用意しておいたプログラムのテンプレートを簡単に呼び出す方法が存在します。
これを使って投稿ページや固定ページ、そしてサイドバーなどのウィジェットでPHPを展開することが可能になります。
PHPファイルをショートコードで呼び出す準備
まず、functions.phpのバックアップを取り以下のコードを追記します。
//phpをshotecodeで呼び出す
/*
*include内記述の
*子テーマは STYLESHEETPATH
*親テーマは get_theme_root() . '/' . get_template()
*/
function short_php($params = array()) {
extract(shortcode_atts(array('file' => 'default'), $params));
ob_start();
include(STYLESHEETPATH . "/code/$file.php");
return ob_get_clean();
}
add_shortcode('phpcode', 'short_php');
子テーマでは10行目のinclude内がSTYLESHEETPATHとなり、
親テーマの場合はget_theme_root() . ‘/’ . get_template()となります。
また、作成した各phpファイルをディレクトリ内に管理するので当サイトはcodeというディレクトリを作成し、10行目のPHPファイルを呼び出す部分にディレクトリ名”/code”を追記しています。
function名はshort_php、呼び出し名はphpcodeとしています。この名前は各自わかりやすい名称にしてください。
7行目と最終行内の引数2番目にfunction名を、最終行の引数1番目に呼び出し名を追記します。
続いてphpファイルを展開したい場所に以下のショートコードを追記します。
[phpcode file='test']
サンプルではcode内にtest.phpというファイルを用意して以下の内容を表示させますのでショートコードのファイル名には拡張子を除くファイル名のみ記述します。
<?php print "halo!"; ?>
ウィジェットのテキストにショートコードを記述して表示してみましょう。
指定した場所にphpファイルの内容が表示されていれば成功です。
多くのWordpressテーマにはサイドバーでもショートコードが通常表示されるようになっています。もしサイドバーにショートコードが展開されない場合はfunctions.phpに以下のコードを追記する必要があります。
//ウィジェットにshotecodeを適用
add_filter('widget_text', 'do_shortcode');
このテクニックを使えばプラグインなしでウィジェット内などのお好きな場所でPHPコードを展開することができるようになります。