私は deactivate_plugins
関数を使って、モバイルデバイス専用のプラグインを無効にしようとしました。
それはうまくいきました:私が携帯電話でサイトに入るとき、プラグインは無効にされます、しかし、私がPCにサイトに入るとき、プラグインも無効にされます。
プラグインを非アクティブ化しないで、モバイル用にのみ無効 _にする方法はありますか?
function deactivate_plugin_conditional() {
if ( wp_is_mobile() ) {
deactivate_plugins( array('/first-plugin/first.php', '/second-plugin/second.php') );
}
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );
プラグインを無効にすると、変更はデータベースに保存されるため、その後のアクセスでは、サイトへのアクセスに使用されたデバイスに関係なく、プラグインは無効になります。
WordPressのアクティブなプラグインは wp_get_active_and_valid_plugins()
functionを使って検索されます。
現在アクティブなプラグインを取得するには、オプション"active_plugins"
を使用します。 WordPressのすべてのオプションは "option_{$option}"
filterフックを使ってフィルタリングできます。この場合は"option_active_plugins"
です。
あなたはそのオプションをフィルタリングするためにプラグインを使うことを考えるかもしれませんが、あなたがプラグインが最初にロードされるのを確実にすることは決してできないので排除したいプラグインがあなたのプラグインの前にロードされる可能性があります。
解決策は MUプラグイン をスコープに使うことです。
MUプラグインはWordPressのごく初期の段階で実行されるため、"option_active_plugins"
オプションをフィルタリングすることができます。
別の問題は、関数wp_is_mobile()
を含むファイル wp-includes/vars.php
がロードされる前であっても、MUプラグインが非常に早くロードされることです。そのため、MUプラグイン内でその関数を使用すると致命的エラーが発生します。
WordPressはrequire_once
ではなくrequire
を使用してそのファイルをロードするので、「手動で」ファイルをロードするのは not オプションです。そのため、ファイルをロードするとWordPressが再度ロードするとすでに定義された関数に致命的エラーが発生します。
唯一の解決策は、againwp_is_mobile()
と書くことです。コアから対処し、別の名前を使うだけです。
PHPファイルを作成してwp-content/mu-plugins
フォルダに保存します。
まず第一に、あなたがモバイルデバイス用に無効にしたいすべてのプラグインを返す関数を書きます。
function my_non_mobile_plugins() {
return array(
// an array of all the plugins you want to exclude for mobile
'plugin-folder/plugin-file.php',
'another-plugin-folder/another-plugin-file.php',
'no-folder-plugin-file.php'
);
}
その後、clone of wp_is_mobile()
関数を別の名前で書きます。
function my_is_mobile() {
$is_mobile = false;
if ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false
) {
$is_mobile = true;
}
return $is_mobile;
}
最後に、プラグインを削除するかどうかをチェックするために、前の関数を使用して'option_active_plugins'
をフィルタリングします。
add_filter( 'option_active_plugins', 'my_disable_plugins_for_mobiles' );
function my_disable_plugins_for_mobiles( $plugins ) {
if ( ! my_is_mobile() ) {
return $plugins; // for non-mobile device do nothing
}
$not_allowed = my_non_mobile_plugins(); // get non allowed plugins
return array_values( array_diff( $plugins, $not_allowed ) );
}