記事の中でphpコードを実行するrunPHPプラグインを使うも問題が...

公開日| 2012年9月23日   更新日| 2012年9月23日   コメントはありません。

Wordpressでは、記事の中でphpのコードを実行してくれる便利で有名なプランイン runPHP があります。
例えば、記事の中で、以下のようなコードを埋め込むと、

<?php echo bloginfo(); ?>

実行結果が、以下のように表示されます。

Wordpressをインストールしてみた

非常に便利で使い勝手も良いのですが、問題もあります。
今回は、runPHPのインストールから、問題とその対処について簡単に解説してみたいと思います。

runPHP をインストール

インストールは、通常のプラグインと同様で、ZIPファイルをダウンロードし、Wordpressインストール先/wp-content/plugins/ フォルダへ解凍、アップロードするだけです。
最新版(といっても2010 ?? 年には、更新が止まったままのようです)は、以下のダウンロード先から 2.3.1 がダウンロードできます。
ダウンロード先:http://nosq.com/2006/01/runphp-plugin-for-wordpress/

  1. アップロードが完了したら、プラグインの有効化をクリックして 有効 にします。

    管理画面の [ プラグイン ] – [ インストール済みプラグイン ] をクリックし、プラグイン一覧の中から runPHP を見つけます。
    runPHPプラグイン無効状態
    有効化をクリック
    runPHPプラグイン有効状態


  2. runPHPのオプションを確認しておきます。

    管理画面の [ 設定 ] – [ runPHP ] をクリックします。
    runPHPプラグインオプション
    ここの設定は、runPHPの設定を行うことができるユーザ種別を選択することができます。デフォルト Administrayor のみになっているはずです。セキュリティ上、そのままが良いので、そのままにしておきます。


  3. 適当な記事でrunPHPを適用にし、phpコードを実行してみます。

    管理画面の [ 投稿 ] – [ 新規追加 ] をクリックします。

    編集画面下にrunPHPのチェックボックスがあるので、そこにチェックを入れるとrunPHPが有効になります。つまり、その記事内でphpコードが実行されることになります。
    試しに適当なphpコードを記述してみてください。プレビューで見ると、先に記述したphpコードが実行されることが確認できると思います。


runPHPの問題

runPHPを実行していくつかの問題点にぶつかります。問題としても使い方が悪いだけなんですけどね。
ここで取り上げる問題というのは、通常のphpコードと全く同じというわけにはいかないという意味での問題です。

色々調べてみる結局1つの大きな問題があるだけのようです。

PHPの 命令の分離 に対応していない

要は、<?php ?> 括られたphpコードが同一記事の中であっても複数分離されたコードが存在すれば、その分離されたコード間で変数、関数は共有化されない・・ということです。

  • 通常の変数は、グローバルと認識されない。
    <p>...前の文章...</p>
    <?php 
      $test = 'ほげほげ';
    ?>
    <p>...後の文章...</p>
    <?php 
      echo $test;
    ?>

    出力結果

    …前の文章…

    …後の文章…

    このように ‘ほげほげ’ の文字列は出力されません。

    この一つの対策方法は、以下のように行うことができます。

    対策

    <p>...前の文章...</p>
    <?php 
      $GLOBALS['test'] = 'ほげほげ';
    ?>
    <p>...後の文章...</p>
    <?php 
      echo $GLOBALS['test'];
    ?>

    出力結果

    …前の文章…

    ほげほげ

    と、$GLOBALSを使って明示的にグローバル変数として宣言してあげるうまくいきます。


  • 通常の関数は、ちゃんと認識される。
    <p>...前の文章...</p>
    <?php 
      function testFunc($val){
        echo $val;
      }
    ?>
    <p>...後の文章...</p>
    <?php 
      testFunc('ほげほげ');
    ?>

    出力結果

    …前の文章…

    …後の文章…

    ほげほげ

    このように ‘ほげほげ’ の文字列がちゃんと出力されました。


  • if文などの判定は、分離できない。
    <p>...前の文章...</p>
    <?php 
      $val = rand(0,1);
      echo $val."<br />\n";
      if($val==1) :
    ?>
    <p>...1の文章...</p>
    <?php 
      else
    ?>
    <p>...2の文章...</p>
    <?php 
      endif;
    ?>

    出力結果

    …前の文章…

    …後1の文章…

    …後2の文章…

    また、PHPのエラーコードが出力されます。

    [23-Sep-2012 09:38:26 UTC] PHP Parse error:  syntax error, unexpected $end in /.../wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 5
    [23-Sep-2012 09:38:26 UTC] PHP Parse error:  syntax error, unexpected T_ELSE in /.../wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 2
    [23-Sep-2012 09:38:26 UTC] PHP Parse error:  syntax error, unexpected T_ENDIF in /.../wordpress/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 2

    つまり、全く対応できていないんですね。

    この簡単な対策の一つは、分離しないこと・・・です。これじゃ対策になっていないような・・・。

    対策

    <p>...前の文章...</p>
    <?php 
      $val = rand(0,1);
      echo $val."<br />\n";
      if($val==1) {
        echo '<p>...後1の文章...</p>';
      } else {
        echo '<p>...後2の文章...</p>';
      }
    ?>

    出力結果

    …前の文章…

    1

    …後1の文章…

    と、当然、できるわけですが、これは、ローカルな関数なりオブジェクト(オブジェクトをグロバール変数にしてしまえばOKのはず)などを作成して、それを使うのがよりスマートかもしれません。
    ただ、そこまでやるかなぁ・・・と思わなくもないです。


runPHPは、セキュリティ的に問題があると作者が記しているとおり、 もし、万が一にもWordpressのセキュリティホールから侵入された場合、被害が拡大するといわれています。あらかじめご注意の上、ご利用されることをおすすめします。


コメント

口コミ・評判を投稿 :

ブラウザの JavaScriptが無効となっている場合、コメントの投稿はできません。
コメントを投稿するには、JavaScriptを有効にしてください

お名前 *

メールアドレス *
(口コミ・評判欄には、表示されませんが入力が必要です。)

サイトアドレス



  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ