WordPressのプラグイン「Exec-PHP」がアカンらしいので、ショートコード+自作プラグイン化してみる

wordpress公式フラットアイコン
5年ほどの前の記事で、WordPressの記事内でPHPを実行するには「Exec-php」が良かよと書いたけど、最近はアカンらしいです。
なので、WordPressの標準機能であるショートコードおよび、自作プラグイン化で対応してみることにしてみました。



最近サーバの移設を計画している中で、年単位で放置していたサイトの見直しを行わなきゃと今更ながら思うようになりました。。
その中で、WordPressプラグインのExec-PHPは危険!?セキュリティに弱い!?という記事を知り、見直すことにしました。
※Exec-PHPの記事を書いた2013年時点で指摘されていたことに気づいてなかった点はスルーします。。

大まかには、現在使用しているテーマのfunctions.phpにショートコードを定義してあげて、記事にショートコードを記述すればいいらしいので、引用サイトを元に実行してみます。
・引用: [WordPress]ショートコードでPHPテンプレート(ファイル)を呼び出す

■/wp-content/themes/テーマ名/functions.php

//ショートコードを使ったphpファイルの呼び出し方法
function my_php_Include($params = array()) {
 extract(shortcode_atts(array('file' => 'default'), $params));
 ob_start();
 include(STYLESHEETPATH . "/$file.php");
 return ob_get_clean();
}
add_shortcode('myphp', 'my_php_Include');

上記ファイルを、FTPやSCPソフトでサーバに接続してファイルを置き換えたり、サーバにSSHでログインしてvim等のエディタで書き換えたりすればOK。

併せて、利用したいPHPファイルを作成します。
※今回は、以前の記事で紹介したグローバルIPを表示するPHPを、「remote_addr.php」として作成してみました。

■/wp-content/themes/テーマ名/remote_addr.php

<?php
echo $_SERVER['REMOTE_ADDR'];
?>

で、記事内に上記作成した「remote_addr.php」を公開したい場合、以下のように記述してあげればOK。

[myphp file='remote_addr']

※.phpの拡張子は不要です。

以上で完成!といきたいところですが、この方法では大きな?問題点があります。

  1. 「WPtouch」プラグインを利用していると、スマートフォンやタブレットではコードのまま表示されてしまう。
  2. テーマをアップデートしてしまうと、再作成が必要となる。

WPtouchは、スマートフォンやタブレットでサイト表示を最適化してくれるプラグインですが、どうやらスマートフォンやタブレットでサイトを表示すると、WPtouchプラグイン独自テーマが適用されるようです。
上記方法を用いてWPtouchプラグイン独自テーマのfunctions.phpを編集するのもありですが、この方法ではプラグインがアップデートされてしまうと、再作成が必要になるため、面倒です。
また、WPtouchだけではなく、子テーマを利用していない場合は、テーマがアップデートされてしまうと、やはり再作成が必要となります。

そのため、独自プラグインを作成し、アップデートされても大丈夫なフォルダにPHPファイルを置くように変更してみます。
・引用: WordPressのショートコードをスマホでもPCと同じように表示させる方法

まず、pluginフォルダに自作プラグインフォルダを作成し、任意の名前で以下のPHPファイルを作成します。
※今回の例では、「myphp」フォルダを作成し、「myphp.php」ファイルとしています。

■/wp-content/plugins/myphp/myphp.php

<?php
/*
Plugin Name: MyPHP
Plugin URI: https://www.keep-tryin.net
Description: ショートコードを利用してPHPファイルを呼び出す
Author: きまぐれ備忘録@IT
Version: 1.0
Author URI: https://www.keep-tryin.net
*/
?>
<?php
//ショートコードを使ったphpファイルの呼び出し方法
function my_php_Include($params = array()) {
 extract(shortcode_atts(array('file' => 'default'), $params));
 ob_start();
 include(WP_CONTENT_DIR.'/uploads/myphp'."/$file.php");
 return ob_get_clean();
}
add_shortcode('myphp', 'my_php_Include');
?>

最初のPHPタグ記述は、プラグイン情報を記述しています。
この記述はプラグイン一覧に表示される内容となります。

<?php
/*
Plugin Name: 【プラグインの名前】
Plugin URI: 【プラグインのURL】
Description: 【プラグインの説明】
Author: 【プラグイン作者】
Version: 【プラグインのバージョン】
Author URI: 【作者のURL】
*/
?>

また、WordPress本体やプラグイン、テーマがアップデートされても大丈夫なフォルダとして、「uploads」フォルダを指定してみました。
このフォルダは、サイトの画像やアップロードしたファイルが保存されている場所なので、勝手に消えることは無いはずです。
今回は、「uploads」フォルダ配下に「myphp」フォルダを作成しています。

 include(WP_CONTENT_DIR.'/uploads/myphp'."/$file.php");

先程作成した「remote_addr.php」ファイルも、上記フォルダに移動します。

■/wp-content/uploads/myphp/remote_addr.php

<?php
echo $_SERVER['REMOTE_ADDR'];
?>

これで、ほぼ準備完了のため、プラグインを有効化したいところですが、その前に「functions.php」で記述した定義は削除する必要があります。

■/wp-content/themes/テーマ名/functions.php

↓↓↓↓↓ここから削除↓↓↓↓↓
//ショートコードを使ったphpファイルの呼び出し方法
function my_php_Include($params = array()) {
 extract(shortcode_atts(array('file' => 'default'), $params));
 ob_start();
 include(STYLESHEETPATH . "/$file.php");
 return ob_get_clean();
}
add_shortcode('myphp', 'my_php_Include');
↑↑↑↑↑ここまで削除↑↑↑↑↑

あとは、myphpプラグインを有効化します。
MyPHPプラグインの有効化

有効化したら、表示されるようになります!



コメントを残す

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