web-dev-qa-db-ja.com

モバイルデバイス専用のプラグインを無効にする

私は 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' );
4
c64girl

プラグインを無効にすると、変更はデータベースに保存されるため、その後のアクセスでは、サイトへのアクセスに使用されたデバイスに関係なく、プラグインは無効になります。

オプションのフィルタリング

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 ) );

}
3
gmazzap