web-dev-qa-db-ja.com

特定のプラグインがアクティブ化されていないときにテーマのアクティブ化を停止することは可能ですか

だから私はプラグインに依存するテーマを計画しています(例えば 材木 または Themosis )。だから、もちろんそれが依存しているプラ​​グインを使うことができなければテーマは壊れてしまうでしょう。そのため、特定のプラグインが必要なテーマをアクティブにして、代わりに必要なプラグインを含むわかりやすいエラーメッセージを表示することをユーザーにやめさせる方法を望みます。

これまでのところ、プラグインがインストールされているかどうかをチェックする方法( link )を調べましたが、可能であればテーマがアクティブにならないようにする方法を見つけました。すべて?

私はswitch_themeafter_switch_themeの動作についても知りました。

だから今私が見逃しているのは実際のアクティベーションを止める方法です。これは可能ですか?

編集:管理者への通知/警告を表示するための this を見つけました。

1
Ilyes512

after_switch_themeを使用するとテーマがアクティブになります(新しいテーマのコンテキスト内でチェックを実行したいのでこれで問題ありません)。

依存関係が満たされていない場合($missing_dependencies = true;)、即座に以前に使用したテーマ(after_switch_themeおよび$oldthemeを介して渡される)に戻ります。

add_action( 'after_switch_theme', 'check_theme_dependencies', 10, 2 );
function check_theme_dependencies( $oldtheme_name, $oldtheme ) {
  if ( $missing_dependencies ) :

    // Update default admin notice: Theme not activated.
    add_filter( 'gettext', 'update_activation_admin_notice', 10, 3 );

    // Custom styling for default admin notice.
    add_action( 'admin_head', 'error_activation_admin_notice' );

    // Switch back to previous theme.
    switch_theme( $oldtheme->stylesheet );
      return false;

  endif;
}

function update_activation_admin_notice( $translated, $original, $domain ) {
    // Strings to translate.
    $strings = array(
        'New theme activated.' => 'Theme not activated.'
    );

    if ( isset( $strings[$original] ) ) {
        // Translate but without running all the filters again.
        $translations = get_translations_for_domain( $domain );
        $translated = $translations->translate( $strings[$original] );
    }

    return $translated;
}

function error_activation_admin_notice() {
  echo '<style>#message2{border-left-color:#dc3232;}</style>';
}

functions.php内で上記のスニペットを使用できますが、必要な依存関係の前にafter_switch_themeが呼び出されるようにしてください。

更新:管理通知がswitch_theme関数を介してトリガーされるのを防ぐ簡単な方法はないようです。 gettextフィルタを介してメッセージを上書きすることは良い回避策のようです。

WordPress Coreで文字列を上書きする方法を教えてくれた @ alpipego に感謝します:)

さらに読む: コアWordPress文字列を変更する

6
Sven

テーマの切り替えを防ぐ方法はわかりませんが(方法はあるかもしれませんが)、回避策を考えることができます。

after_switch_themeは、古いテーマ名 を次のように渡します。

do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );

...そのため、そのアクションでプラグインをチェックしてから、プラグインがアクティブでない場合は古いテーマにリセットすることができるはずです。 switch_theme() 関数を使用すると、プログラムでテーマを切り替えることができます。スタイルシートスラッグを渡すだけです。私はちょうど 関連した質問 に答えました。それはおそらくこの問題にも役立つでしょう。

1
s_ha_dum

誰かがテーマをアクティブにすることを妨げるとは思わないが、ここにテーマ(または他のプラグイン)にプラグインの依存関係をつけるためのクラスがある: https://github.com/thomasgriffin/TGM - プラグインアクティベーション

少なくとも、管理者が何かを見逃していることを管理者が認識できるように、すべてのUIの通知とナグを追加します。足りない依存関係をインストールするためのリンクも追加されています。かなりクール。

0
MathSmath

開発中のものであれば、単にプラグインをテーマに含めることはできませんか。このアプローチの欠点は、プラグインを個別に更新しないことですが、テーマが特定のプラグインの特定のバージョンに依存している場合は、必要なプラグインにパッチを適用すれば問題なく動作することがあります。

0
user51165