WordPressの記事内でPHPを実行するショートコード(プラグインではなく)

WordPressでこのサイトを作りながら、ショートコードについてあれこれ試行錯誤をしつつ、時代錯誤も繰り返している今日この頃…。

そんな中「記事中で任意のPHPコードを動かすのって、ショートコードでも出来るんじゃない?(既存のプラグインを使わずとも)」と思って、やってみたら動いたのでご報告。ちょっと裏技的。
(執筆時2010.07.WordPress3.0、公開時2011.01.WordPress3.0.4で確認)

ソースコードと使い方

ソースコード。ショートコードphp_evalの定義。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 初期設定などに
define( 'SC_PHPEVAL_USERLEVEL', 5 ); // 実行を許可する、記事を書いた人の権限レベル
 
// [php_eval] のコード
function shortcode_php_eval( $atts, $content ="" ){
	$r = '';
	$user = get_userdata( get_the_author_meta('ID') );
	$user_level = (int) $user->user_level;
	$level = SC_PHPEVAL_USERLEVEL;
	$level = is_null( $level ) ? 5 : (int) $level; // 未設定はとりあえずレベル5
	if( $user_level >= $level ){
		$r = $content;
		$r = preg_replace( '/^.*<pre>/is'  , '', $r );
		$r = preg_replace( '/<\/pre>.*$/is', '', $r );
		$r = eval( html_entity_decode( $r ) );
	}
	return $r;
}
add_shortcode( 'php_eval', 'shortcode_php_eval' );

とりあえず定番な感じでテンプレートの「function.php」へ書き込めば動くはずです。
人に親切(?)なソースです。色々わかる人なら無駄なく短くできますね。(短いソースも下方に置いてみたよ!)

記事中でのショートコードの書き方は、次の通り。

[php_eval]<pre> ......php code...... </pre >[/php_eval]

※上記の</pre >は、必ず半角スペースを取って</pre>にして下さい。(このページの表示の都合)

ちょっとした思いつきですが、たったこれだけで動くのなら使いたくなる人もいるのでは??

特徴と注意点・・・

  • ショートコード内は、必ず<pre>タグで囲み、その中にPHPコードを書くこと。
  • 記事の編集は「ビジュアル」でなく「HTML」で書くこと。また投稿設定「不正にネスト化したXHTMLを自動的に修正する」のチェックを外すこと。プラグインPS Disable Auto Formattingも必要かも。
  • 記事の作成者の権限レベルで、実行するか実行しないか判別している。
  • returnで返した値は、ショートコードのあった場所に出力される。
  • ちゃんと動くかテストしてちょ。

テスト

今日の日付を表示する下記のコードを実行してみます。(※</pre >は、</pre>に)

[php_eval]
<pre>
return "<p><em>今日は「".date("Y年m月j日")."」です。動いてるね!</em></p>";
</pre >
[/php_eval]

ここで実行↓↓↓↓↓↓↓↓

今日は「2019年06月27日」です。動いてるね!

ここで実行↑↑↑↑↑↑↑↑

もちろん実行するPHPコードに注意して下さいね。うっかり$postを書き換えたりして、その後のページの表示がおかしくなるとかありがちです。

読み飛ばしてもいいかもな解説

<pre>タグで囲うのが気持ち悪いですが、これがないとPHPコード内の例えば「"」が「&quot;」になるらしくエラーが出て動きません。あとWordPressが勝手に追加する<p>や<br>タグなどを防ぐためにHTMLで編集。管理画面→設定→「投稿設定の不正にネスト化したXHTMLを自動的に修正する」のチェックも外すこと。同じ目的でプラグインPS Disable Auto Formattingも必要かも。

一応セキュリティ対策で、記事を書いた人の権限レベルによってPHPを実行出来るか決めています。権限レベルとその注意は「WordPressで記事作成者の権限レベルによって動作を変えるには?)」を参考にどうぞ。
しかし不特定多数が編集する環境でPHP実行出来ちゃうのはちょっと恐いですよね。充分に管理が行き届く範囲で使って下さいね。

ご利用は自己責任にて、充分にテストをして問題がないことを確認して使って下さい。<pre>タグで囲むなどその辺りの文字化け(?)対策が完全なのか若干心配です。問題点や解決策がわかっちゃうエキスパートでステキな人がいましたらぜひ教えて下さい!

おまけの短いソース

色々省いて、短くしたソース。

1
2
3
4
5
6
7
8
9
// [php_eval] のコード
function shortcode_php_eval( $atts, $content ="" ){
	$user = get_userdata( get_the_author_meta('ID') );
	if( (int) $user->user_level >= 5 ){ // 権限レベルの判定
		$r = eval( html_entity_decode( preg_replace( array('/^.*<pre>/is','/<\/pre>.*$/is'), '', $content ) ) );
	}
	return $r;
}
add_shortcode( 'php_eval', 'shortcode_php_eval' );

もっと短くしたソース(笑)。権限判定も省略したので誰の記事でも実行されます。自分だけで使うブログならこれもありじゃない??

1
2
3
// [php_eval] のコード
function shortcode_php_eval($atts,$content=''){return eval(html_entity_decode(preg_replace(array('/^.*<pre>/is','/<\/pre>.*$/is'),'',$content)))}
add_shortcode('php_eval','shortcode_php_eval');

ショートコード名はphp_evalじゃなくてもいいけどphpとかありがちのにすると、プラグインなど他のプログラムとぶつかるかも。


さてさて、最後までお付き合いありがとうございます。
皆様の幸せを心より願いまして、あばよっ! またねっ!


2013.2.4. 非推奨のget_the_author_IDをget_the_author_meta(‘ID’)に変えました。

One thought on “WordPressの記事内でPHPを実行するショートコード(プラグインではなく)”

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です