Deprecated: get_the_author_ID の使用はバージョン 2.8.0 から非推奨になっています ! 代わりに get_the_author_meta('ID') を使ってください。 in /home/ohaya/wave-sight.net/public_html/haya.wave-sight.net/cms-wp/wp-includes/functions.php on line 5213
Notice: Undefined index: _shortcode_php_user_level in /home/ohaya/wave-sight.net/public_html/haya.wave-sight.net/cms-wp/wp-content/plugins/haya_x-system/haya_x-system.php(105) : eval()'d code on line 1
Notice: Undefined variable: post in /home/ohaya/wave-sight.net/public_html/haya.wave-sight.net/cms-wp/wp-content/plugins/haya_x-system/haya_x-system.php on line 2826
Deprecated: gmmktime(): You should be using the time() function instead in /home/ohaya/wave-sight.net/public_html/haya.wave-sight.net/cms-wp/wp-content/plugins/haya_x-system/haya_x-system.php(2829) : eval()'d code on line 2
WordPressでこのサイトを作りながら、ショートコードについてあれこれ試行錯誤をしつつ、時代錯誤も繰り返している今日この頃…。
そんな中「記事中で任意のPHPコードを動かすのって、ショートコードでも出来るんじゃない?(既存のプラグインを使わずとも)」と思って、やってみたら動いたのでご報告。ちょっと裏技的。
(執筆時2010.07.WordPress3.0、公開時2011.01.WordPress3.0.4で確認)
ソースコードと使い方
ソースコード。ショートコードphp_evalの定義。
// 初期設定などに
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( '/^.*/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] ......php code......
[/php_eval]
※上記の</pre >は、必ず半角スペースを取って</pre>にして下さい。(このページの表示の都合)
ちょっとした思いつきですが、たったこれだけで動くのなら使いたくなる人もいるのでは??
特徴と注意点・・・
- ショートコード内は、必ず<pre>タグで囲み、その中にPHPコードを書くこと。
- 記事の編集は「ビジュアル」でなく「HTML」で書くこと。また投稿設定「不正にネスト化したXHTMLを自動的に修正する」のチェックを外すこと。プラグインPS Disable Auto Formattingも必要かも。
- 記事の作成者の権限レベルで、実行するか実行しないか判別している。
- returnで返した値は、ショートコードのあった場所に出力される。
- ちゃんと動くかテストしてちょ。
テスト
今日の日付を表示する下記のコードを実行してみます。(※</pre >は、</pre>に)
[php_eval]
return "今日は「".date("Y年m月j日")."」です。動いてるね!
";
[/php_eval]
ここで実行↓↓↓↓↓↓↓↓
今日は「2024年11月22日」です。動いてるね!
ここで実行↑↑↑↑↑↑↑↑
もちろん実行するPHPコードに注意して下さいね。うっかり$postを書き換えたりして、その後のページの表示がおかしくなるとかありがちです。
読み飛ばしてもいいかもな解説
<pre>タグで囲うのが気持ち悪いですが、これがないとPHPコード内の例えば「"」が「"」になるらしくエラーが出て動きません。あとWordPressが勝手に追加する<p>や<br>タグなどを防ぐためにHTMLで編集。管理画面→設定→「投稿設定の不正にネスト化したXHTMLを自動的に修正する」のチェックも外すこと。同じ目的でプラグインPS Disable Auto Formattingも必要かも。
一応セキュリティ対策で、記事を書いた人の権限レベルによってPHPを実行出来るか決めています。権限レベルとその注意は「WordPressで記事作成者の権限レベルによって動作を変えるには?)」を参考にどうぞ。
しかし不特定多数が編集する環境でPHP実行出来ちゃうのはちょっと恐いですよね。充分に管理が行き届く範囲で使って下さいね。
ご利用は自己責任にて、充分にテストをして問題がないことを確認して使って下さい。<pre>タグで囲むなどその辺りの文字化け(?)対策が完全なのか若干心配です。問題点や解決策がわかっちゃうエキスパートでステキな人がいましたらぜひ教えて下さい!
おまけの短いソース
色々省いて、短くしたソース。
// [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('/^.*/is','/<\/pre>.*$/is'), '', $content ) ) );
}
return $r;
}
add_shortcode( 'php_eval', 'shortcode_php_eval' );
もっと短くしたソース(笑)。権限判定も省略したので誰の記事でも実行されます。自分だけで使うブログならこれもありじゃない??
// [php_eval] のコード
function shortcode_php_eval($atts,$content=''){return eval(html_entity_decode(preg_replace(array('/^.*/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')に変えました。