evalに代わるショートコードの使い方

evalは指定されたコードをPHPとして動作させるための関数です。任意のPHPコードを実行させるため、ユーザーから渡されるデータには適切な処理が必要となります。evalを利用する際にはまず、「;」セミコロンで終了しなければなりません。return文を実行すると呼び出し側に制御が返され、return文に値が設定されているケースではその値が戻り値となります。設定した変数は実行したコードのスコープに保存されます。

1
2
3
4
5
// 基本形です。
eval('echo "evalを使ってみる";');
// 変数に代入してeval内においてechoで表示。
$a = "elavlを使って表示";
eval('echo $a;');
実行結果:evalを使ってみるelavlを使って表示

三行目のクォートは、外側にシングルを使えば内側はダブル、外側がダブルなら内側はシングルクォートを使います。

evalをワードプレス投稿本文で使う場合

1
2
3
4
5
6
7
8
9
10
11
12
// プラグインファイルではこの1行を記述すると認識して動作します。名前は適当で動きます。
// Plugin Name: Eval
// 「functions.php」では、以下の記述のみで動きます。
function sampleFunc01($get_eval_code){
eval('ob_start();'.$get_eval_code[1].'$re=ob_get_clean();');
return $re;
}
function sampleFunc02($the_content){
$eval_code_replace=preg_replace_callback('/<eval((.|\n)*?)eval>/', 'sampleFunc01', $the_content);
return $eval_code_replace;
}
add_filter('the_content', 'sampleFunc02', 1);

2行目の「// Plugin Name: Eval」はコメントアウトされてますので、プラグインで使う場合は、「//」を取り除いて「Plugin Name: Eval」として下さい。10行目「<eval((.|\n)*?)eval>」の「eval」は、「<ev((.|\n)*?)ev>」のように「ev」などとして挟んで自由に名前をつけれます。また、関数名も変更できます。関数名を変更する場合は、sampleFunc01、sampleFunc02にそれぞれ対応するように名前を変更しなければ動作しません。「functions.php」に記述する際は、開始タグの「<?php」と終了タグの「?>」は取り除いてください。自作テーマテンプレートを初めから作成するケースではない限り、一般のテーマテンプレートでは、この開始タグと終了タグはすでに記入されています。ただ、evalは入力フォームなどで細心の注意が必要です。入力フォームがある場合は、使わないほうが無難です。

ワードプレスでevalに代わるショートコードの使い方

evalはセキュリティ上のリスクがあり、ワードプレスでは投稿記事内でPHPスクリプトを使うために、ショートコードという仕組みが用意されています。複雑な処理になるとどうしてもevalを必要とする場合もあるかも知れませんが、大抵の処理はこのショートコードとPHPを直接入力できるテーマテンプレートで何とかなります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 作成例1
function sampleFunc1() {
$a = "ショートコード";
return $a;
}
add_shortcode('short', 'sampleFunc1');
// 作成例2
function sampleFunc2($arg) {
return "取得した値は".$arg['samp']."と".$arg['test']."です";
}
add_shortcode('short', 'sampleFunc2');
// 作成例3
function sampleFunc3($arg, $content=null) {
$a = "ショートコード";
$content.=$a;
return $content;
}
add_shortcode('short', 'sampleFunc3');

ショートコードは上記のような書式をテーマファイルの「functions.php」や「プラグイン」のファイルに記入して作成します。6行目と11行目、18行目の「short」には自由な名前をつけることができます。ショートコードはこの名前を使います。

sampleFunc1関数では、「 [short] 」を記事本文のどこかに挿入することで、sampleFunc1の戻り値を取得し、記事内で表示することができます。

sampleFunc2関数では、sampleFunc1関数にはなかった「$arg」という引数が渡されており、この変数には配列が入ります。その配列は、「 [short 5 6] 」や「 [short samp=5 test=6] 」というような形でショートコードからsampleFunc2関数へと渡される引数です。前者はsampleFunc2関数内において「$arg[0]」と「$arg[1]」で左から順にショートコードから渡された値を[0]と[1]の番号で取り出すことができます。後者は「$arg['samp']」と「$arg['test']」でショートコードからの値を取得することができます。いずれも取得した値を使って関数内で処理を加えた結果が戻り値としてショートコードに返され、それが投稿記事内で表示されます。

sampleFunc3関数では「 [short]~~~・・・[/short] 」という書式で文字列を囲み、その囲まれた文字列を取得して、sampleFunc3関数内で処理したものを戻り値として返します。上の作成例3では取得した文字列に「ショートコード」という文字を後ろに追加して返しています。それが投稿記事内に表示されます。

また、関数名が変更できるように、どのsampleFunc関数でも、その引数の変数の名前は自由につけれます。作成例で言えば、「$arg」にあたります。ただし、関数内で処理するには「$arg」を「$array」などに変更した場合、「$arg」の名前を持つ他の変数にも同じ名前を使って、$array['samp']、$array['test']としなければ動作しません。これは関数名でも同じで、「呼び出し元」「呼び出し先」の両方の名前を同じにしなければ動きません。