WordPressがプラグインをロードするために最初に行うことの1つは、データベースに保存されているアクティブなプラグインを取得することです。
$active_plugins = (array) get_option( 'active_plugins', array() );
これを使用しget_option()
ているため、option_active_plugins
フィルターを使用してアクティブなプラグインのリストをオンザフライで変更できます。
function wpse_301282_disable_plugin( $active_plugins ) {
if ( defined( 'WP_CLI' ) && WP_CLI ) {
$key = array_search( 'gravityforms/gravityforms.php', $active_plugins );
if ( $key ) {
unset( $active_plugins[$key] );
}
}
return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );
gravityforms/gravityforms.php
無効にするプラグインのディレクトリとファイル名に置き換えるだけです。
ここでの問題は、プラグインのロードに影響を与えようとしているため、遅すぎるため、プラグイン内から影響を与えることができないことです。テーマも遅すぎるでしょう。
ありがたいことに、WordPressには「Must Use Plugins」があります。これらは、通常のプラグインの前に個別に読み込まれる追加可能なプラグインであり、通常のプラグインリストには表示されません。
このコードを必須のプラグインに追加するために必要なことは、wp-content/mu-plugins
ディレクトリを作成し(まだ存在しない場合)、そのコードを含むPHPファイル(何でも呼び出すことができます)を作成することです。プラグインヘッダーなどは必要ありません。
これで、WordPressが読み込まれるときに、他のすべてのプラグインの前にそのコードが読み込まれます。フィルターが設定されているため、WordPressがアクティブなプラグインのリストを取得して、無効にするプラグインをロードすると、WP-CLIがアクティブな場合、そのリストからフィルターで除外されます。
get_option()
値がトランジェント/類似で保存され、このフィルターがスキップされると、おそらく早く戻りますか?(ほとんどの場合、機能しません。実際に実行された管理プラグイン画面でのみ)