この記事は最後に更新してから1年以上経過しています。
説明
稼働中のサーバーにてバックグラウンドで何か処理しようとコマンドラインのプログラムを作る際、効率化や誤動作のリスクを考えると不要なプラグインはロードしないようにしたい。そんなわけで設定内容(データベース)は変更せず、特定のプラグインをロードしないようにできないか考えてみた。
wp-config.phpよりもwp-load.php
WordPressのデータにアクセスするコマンドライン向けのプログラムを作る際、諸設定などは最低限にしたい。そこで今回は(おそらく)一番シンプルであろうwp-load.phpを読み込むことにした。プログラム(以降、mytool.php)をWordPressがインストールされたディレクトリに配置するなら、冒頭部分は次のようになる。
<?php
require_once __DIR__ . '/wp-load.php';
// 以降に処理内容を記述.
データベースの設定情報が記述されているwp-config.phpでもよさそうだが、その場合は別途ABSPATHを定義しておく必要がある。またここでwp-load.phpを読み込むなら、wp-config.phpがWordPressがインストールされたディレクトリだけでなく、直上に配置されている場合にも対応できる。
ロードするプラグインの制御
WordPressのプラグインはWebリクエスト・レスポンスに関連するものがあり、コマンドラインのプログラムではそのようなプラグインは不要なケースがある。サイトを公開しつつ、そのバックグラウンドでプログラムを動かす場合はプラグインの設定を変更しづらく、プログラム側の実行時のみ任意のプラグインをロードしない方法を考えた。
標準的な(シングル)サイトの場合、wp-content/pluginsディレクトリのアクティブなプラグインをロードする前に「MU(must-use)プラグイン」をロードする仕組みになっている。MUプラグインは、WPMU_PLUGIN_DIRで定義されたディレクトリに配置されたプラグイン(PHPファイル)であり、一部のキャッシュプラグインなどがこの仕組みを利用している。このMUプラグインを利用すれば、通常のプラグインのロードを制御できそうだ。
次はアクティブなプラグインを取得になる。プライベート関数のwp_get_active_and_valid_plugins関数によると、アクティブなプラグインは get_option関数で取得している。
$active_plugins = (array) get_option( 'active_plugins', array() );
取得できる内容はwp-content/pluginsディレクトリの相対パス名の配列となっており、プラグインディレクトリ内のmycacheディレクトリのindex.phpであれば、"mycache/index.php"が格納されている。
array(2) {
[0]=>
string(19) "akismet/akismet.php"
[1]=>
string(17) "mycache/index.php"
}
get_option関数には取得した内容を返す前に実行するフィルターが用意されており、このフィルターを使用することでロードするアクティブなプラグインを制御できる。'mycache/index.php'をロードしないようにするなら、プラグイン(以降、mytool_plugin.php)は次のような感じになった。
<?php
function temporarily_disable_active_plugins( $value, $option ) {
$key = array_search( 'mycache/index.php', (array)$value );
if ( false !== $key ) {
unset( $value[$ey] );
}
return $value;
}
add_filter( 'option_active_plugins', 'temporarily_disable_active_plugins', 10, 2 );
プラグインを作った経験がある方はオヤっと思われる方がいるかもしれないが、MUプラグイン向けプラグインは、一般的なプラグインと異なりコメントでプラグイン情報を記載する必要ない。
mytool_plugin.phpをMUプラグインとして読み込むため、mytool.phpにWPMU_PLUGIN_DIRの定義を追加する。ここではMUプラグインのディレクトリを直下の'mymu_plugins'とした。
<?php
define( 'WPMU_PLUGIN_DIR', __DIR__ . '/mymu_plugins' );
require_once __DIR__ . '/wp-load.php';
// 以降に処理内容を記述.
ここでの注意点は、そのサイトですでにMUプラグインを使用しているケース。その場合はdefined関数を使ってエラーにならないようにしておく。
今回、稼働中のサイトのバックグラウンドでタームのメンテナンスすることを考えその準備を進めた。このようにすることで、直接データベースを更新するのではなく、WordPress標準の関数が使用できるのはうれしい限りだ。
最終更新 : 2023年06月02日 16:59
関連
お勧め
add_shortcode(2018年5月27日 更新)
get_user_setting(2022年1月31日 更新)
have_posts(2018年5月27日 更新)
in_category(2018年5月27日 更新)
add_feed(2024年6月24日 更新)