web-dev-qa-db-ja.com

テーマスイッチでプラグインを無効にする

私はプラグインを開発しています。それをDahPluginと呼びましょう。これは私が開発した無料テーマのための追加カスタマイザオプションを提供します。このテーマをDahThemeと呼びましょう(ここでは、どちらも恥知らずに接続したくありません)。

そこで私が達成しようとしているのは、ユーザーがテーマを変更したときにDahPluginが自動的に非アクティブになるようにすることです。 DahTheme

私はここでこのコードスニペットを見つけました: 特定のテーマのためにアクティブなプラグインを無効にします 、特定のテーマがアクティブならプラグインを無効にしたい場合、これはとてもうまくいきます。

それで、私は賢くてそれを私のテーマの中で利用し、そして論理を切り替えることにしました。そこで、比較演算子を==equal)から!=等しくない)に変更しました。 "DahTheme"と同じで、 "DahPlugin"を無効にすると、次のようになります。

if ( ! function_exists('disable_plugins')) :
    function disable_plugins(){
        include_once(ABSPATH.'wp-admin/includes/plugin.php');
        $current_theme = wp_get_theme();
        $current_theme_name = $current_theme->Name;

        if($current_theme_name == 'DahTheme'){
            if ( is_plugin_active('dahplugin/dahplugin.php') ) {
                deactivate_plugins('dahplugin/dahplugin.php');                          
            }
        }
    }
    add_action('after_switch_theme','disable_plugins');
endif;

Aaaaaaそしてそれはうまくいきません…笑!もちろん私が賢いと思うときはいつでもこれは起こります。

だから私は自分の頭脳を悩ませていて、何が原因で何が原因で機能していないのかを見つけようとしています。

なぜそれがうまくいかないのか、そして私の考え方が間違っているのを私に見せることはできますか。それは大歓迎です。

ご協力ありがとうございます。

1
tsquez

私はこれをテストしていないので、それは正しく動作しないかもしれませんが、あなたがやろうとしていることの本質はafter_switch_themeフックにフックして、$old_nameがDahThemeであるかどうかを見ることです。もしそうなら、それは現在のテーマがDahThemeではないことを意味するので、あなたはプラグインを無効にしたいです。

function wpse_after_switch_theme( $old_name, $old_theme ) {
  if( 'DahTheme' === $old_name ) {
    //* You may or may not need to include wp-admin/includes/plugin.php here
    deactivate_plugins( 'dahplugin/dahplugin.php' );
  }
}
add_action( 'after_switch_theme', 'wpse_after_switch_theme', 10, 2 );
1
Nathan Johnson

このアプローチ全体は逆です。問題はテーマの切り替え時に無効にならないことですが、それが構築されたテーマが有効でない限りプラグインが利用できないことを確認してください。

だから、チェックはテーマではなく、プラグインにあるべきです

それで、どのテーマがアクティブであるかを理解することから始めましょう。ここで文書化されているwp_get_themeを通してこれを行うことができます

それからadmin_initのプラグインにフックを登録します。

add_action( 'admin_init', function() {
    $theme = wp_get_theme();
} );

次に、テーマが意図したテーマではない場合は、無効にします。

if ( $theme->headers['name'] !== 'DahTheme' ) {
    deactivate_plugins( plugin_basename( __FILE__ ) );
}

Deactivate_pluginsは複数形であり、絶対パスが必要です。 __FILE__を使用しているため、このチェックはメインプラグインファイルになければなりません。


ただし、プラグインが非アクティブになったときに 'DahTheme'に切り替えると、処理が複雑になるため、チェックを実行してから早めに返すほうがよいため、プラグインは非アクティブ化よりも何もしません。このようにして、互換性のないテーマのカスタマイザオプションは表示されず、ユーザーがテーマをプレビューしたり戻ったりしても問題は発生しません。

1
Tom J Nowell

私は基本的にis_plugin_activeを使用してこの問題を解決しました-プラグインで追加のパネルとセクションを読み込む前に、誰かが別のテーマを選択したとき、プラグインによって作成されたcustomize registerはまだそこにあり、彼らが行ったとき新しいテーマカスタマイザーに致命的なエラーが生成されました。

これにより問題が修正されました。

0
tsquez