web-dev-qa-db-ja.com

after_setup_themeは常に実行されます

私は一部の教職員のために子テーマを設定しています、そしてテーマの一部として、テーマがアクティブになったときにアクティブにされるプラグインのほんの一握りがほしいと思います。だから、当然のことながら、私はafter_setup_themeアクションを使い、私のsetup関数を呼び出しました。それはすべての要求(管理者とそうでなければ)で実行されることを除いて、それは素晴らしい作品。これをセットアップ関数の最後に追加することで証明しました。

echo '<script type="text/javascript">alert("This action was run")</script>';

そしてその結果、すべての管理者要求とすべてのフロントエンド要求に対してJavaScriptアラートが表示されます(私はネットワーク設定をしているので、このテーマがアクティブでないサイトでは明らかに、それは機能を実行しません)

問題は、これはバグですか?私はどういうわけか悪いことをしていますか?これが私が使っている完全なコードです:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

任意の洞察力は大歓迎です!

11
Aaron Wagner

解決策:after_switch_themeは、ここで意図したとおりに動作します。テーマがあなたのテーマに切り替えられた後に発生します。下記の解決策の1つはswitch_themeを使用します。テーマから切り替えたときにのみ発生するため、これでは望ましい結果が得られません。

これは私が参考として見つけた記事です: http://core.trac.wordpress.org/ticket/7795#comment:29

これが私の修正したコードです。

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}
8
Aaron Wagner

after_setup_themeアクションは、WordPressをロードするたびに起動する 目的 です。 WordPressがテンプレートシステムを起動し、テーマのさまざまな設定パラメータを決定してから、表示する正しいテンプレートを決定するなどの後続の処理を続行するプロセスの一部に過ぎません。

言い換えれば、after_setup_theme WordPress が現在のテーマを設定するポイントを表し、not administrator がアクティブになるポイントおよび/またはを設定するポイントを表します。現在のテーマ.

あなたが探しているのはTheme activation hookで、これは現在利用できませんが、 は検討中です/ development

5
Chip Bennett

残念ながら、テーマ起動フックはありません。しかし、 この質問 はそのための回避策を提供します。

プラグインを有効にするには、単に「テーマ有効化フック」を使用してください。

より良い解決策は、同じ意味で これです 。どちらも基本的にswitch_themeフックを使用しています。


OPのコメントと リンクされたtracチケット - after_switch_themeは必須のフックです。

これは古いテーマの名前を引数として渡します。しかし、これがあなたのfunctions.php(これは...であるべきです)にある場合、コールバックは あなたのテーマがアクティブにされているときにのみ発生します

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

同様にswitch_themeにコールバックを追加することはあなたのテーマが非アクティブ化された時にだけ呼ばれるでしょう。

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}
4
Stephen Harris

あなたの最善の解決策はswitch_themeフックを使用して、渡された '$ theme'引数をフィルタリングして現在のものかどうかを確認し、そうでない場合はそれを返すことです。

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
0
numediaweb

もっと良い解決法は Thomas Griffinのプラグインアクティベーションスクリプト を使うことです。テーマが使用されているとき、これはあなたの選択のプラグインをインストールするようにユーザーに促します。私はこれがテーマからプラグインを分離し、それでもそれを利用するための素晴らしい方法だと思います。

あなたのテーマの中で、その機能を使う前にプラグインがアクティブであるかどうか確認してください。これにより、ユーザーはより多くの選択と制御が可能になります。

起動スクリプトは Knapsack で簡単に設定できます。

0
Jeff Sebring