web-dev-qa-db-ja.com

特定のユーザーグループのプラグインを無効にする

特定のユーザーのプラグインを無効にしたいのですが。 wp-content/plugin-muプラグインファイル内で次のコードを使用しています。

add_filter( 'option_active_plugins', 'bo_disable_apm_plugin' );


    function bo_disable_apm_plugin( $plugins ) {

    global $current_user;

    // Not use advanced page manager for media manager
    if ( is_admin() && in_array( 'media_manager', $current_user->roles ) ) {
      $key = array_search( 'advanced-page-manager/advanced_page_manager.php' , $plugins );
      if ( false !== $key ) {
        unset( $plugins[$key] );
      }
    }
    return $plugins;
}

もちろん、うまくいきません。 option_active_pluginsのやり方がわかりません。データをダンプすることで、コードが7回実行されていることがわかりました。

最初のループでは、ユーザーは知らないので、条件は満たされません。プラグインはまだアクティブ化されています。

私は3つの条件付きでもっと複雑なコードを追加しました:ユーザが設定されていないならプラグインの設定を解除します、それでプラグインは最初のループで毎回無効になります。ユーザーが設定されている場合(次のループ)、それに応じてプラグインを設定または設定解除するために彼を確認してください。どちらも働いていませんでした。

私は正しい式を見つけることができなかったので、多分私はどこかが間違っていてそれをすることができません。毎回、プラグインはすべてのユーザーに対して有効化または無効化されます。最初の繰り返しが重要なもののようです。

特定のユーザー/グループのプラグインを無効にする方法はありますか?

7
Simon

私はこの{ テーマによるプラグイン/プラグインアクションの無効化 に対する答えが、コードからプラグインを無効にする方法についての基本的な知識に役立つと思います。

あなたのニーズにその知識を適応させることはこれで私たちを残します:

add_action('admin_init', 'my_filter_the_plugins');    
function my_filter_the_plugins()
{
    global $current_user;
    if (in_array('media_manager', $current_user->roles)) {
        deactivate_plugins( // deactivate for media_manager
            array(
                '/advanced-page-manager/advanced_page_manager.php'
            ),
            true, // silent mode (no deactivation hooks fired)
            false // network wide
        );
    } else { // activate for those than can use it
        activate_plugins(
            array(
                '/advanced-page-manager/advanced_page_manager.php'
            ),
            '', // redirect url, does not matter (default is '')
            false, // network wise
            true // silent mode (no activation hooks fired)
        );
    }
}

基本的にこれは起こります:

media_managerユーザーグループの場合、my_filter_the_pluginsadvanced-page-managerプラグインを無効にします( 静かに )。それからmedia_managerユーザーグループに属していないもののためにプラグインを再びアクティブにする必要があります( 黙って )。

5
aifrim

あなたは基本的にあなたがwordpressの "ブート"時に持っている情報に基づいてプラグイン全体を無効にすることができます、それは基本的にURLとクッキーです。それよりも複雑なチェックは、おそらく起動が完了するまで待たなければならず、その時点でプラグインはすでにロードされていて「無効化」するには遅すぎます。

0
Mark Kaplun