add_action( 'init')とadd_action( 'wp_enqueue_scripts')を使用する場合


10

私のテーマのfunctions.phpでは、jqueryが読み込まれる場所を制御するためにadd_actionを呼び出しています(テーマの他のスクリプトと共にフッターにあります)。

私が抱えている問題は、add_action( 'wp_enqueue_scripts')を使用すると、プラグインがロードされていない場合にのみ起動するように見えることです。ただし、add_action( 'init')メソッドはすべてのケースで機能します。

理由は思い出せませんが、この場合はadd_action( 'wp_enqueue_scripts')をお勧めします。それが本当である場合、どのようにしてすべての場合に機能させることができますか?

functions.php内

//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . '/functions_public.php');   
}

functions_public.php内

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);

wp_enqueue_script('jquery');

}

add_action( 'wp_enqueue_scripts')を使用する2番目のメソッドは、テーマにスクリプトの依存関係を書き込むプラグインが存在する状況では実行されないようです。


5
jqueryの独自のコピーを登録しないでください-WordPressに付属のバージョンを使用してください。そうしないと、プラグインが壊れてしまいます:)
Stephen Harris

私は同意し、実際にはjQueryに付属しているものを使用しています。HTTPリクエストを減らすために、テーマを必要とする他のjsファイルと一緒に単一の.js(mythemescripts.js)にロードしています。
N2Mystic 2012年

すべてのブラウザーで、スクリプトがサイトから一度要求されると、ローカルにキャッシュされます。最初のページのロード時にのみ、追加のHTTPリクエストが発生します。すべてのスクリプトを1つのスクリプトに結合すると、WPがjQueryの新しいバージョンで更新をリリースするたびに、これを変更する必要があります。これは==メンテナンスの悪夢です。
EAMann 2012年

2
@EAMann、テーマが最初にインストールされたとき、その後テーマオプションページが保存されるたびに、mythemescripts.jsを書き換えて、jqueryライブラリの最新のコピーをロードします。ユーザーがWPバージョンを更新すると、私のテーマオプションルーチンはそれに付属するjqueryをロードします。常に最新です。
N2Mystic 2012年

jquery呼び出しがフッターの前のドキュメントの本文に含まれている場合でも問題は発生します。どうやらjQuery(document).readyは、.jsスクリプトがフッターにロードされる前に発生します。
N2Mystic 14

回答:


26

多くのプラグイン開発者は物事を正しく行っていません。右の道はへのフックするためであるwp_enqueue_scriptsあなたがしようとしているよう。

ただし、一般的なリクエストで実行されるフックの順序は次のとおりです。

  • muplugins_loaded
  • registered_taxonomy
  • registered_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • 初期化
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_scripts
  • ... より多く

問題は、何人かの開発者が最初にinitスクリプトをエンキューするためにフックするように言われたことです。wp_enqueue_scriptフックができる前は、それが物事を行う「正しい」方法でした。また、実践を永続させるチュートリアルがインターネット上に浮かんでいて、他の優れた開発者を破壊しています。

私の推奨は、関数を2つの部分に分割することです。あなたのですかwp_deregister_script/をwp_register_scriptinitフックして使用wp_enqueue_scriptsしますが、実際のjQueryをエンキュー時にフックを。

これにより、スクリプトを「キューに入れる」ための「正しいこと」ができるようになり、jQueryを連結したバージョンとキューに追加する前にjQueryを連結したバージョンと入れ替えることで、何百人もの開発者がまだ「間違っている」ことから保護できます。 。

またinit、優先度の高いフックを追加することもできます。

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}

2
私はこれを推奨するつもりでしたが、OPが実際にはjQueryの登録を解除し、別のスクリプトを完全に登録して「jquery」と呼んでいることに気付きました。それを奨励するのは良い習慣ではないと私は思います。jQueryを完全デキューしてから、カスタムハンドルを使用してカスタムスクリプトをエンキューするほうが良い方法だと思います。
チップベネット

priorityアクションの追加について注意してください。それはすべて、優先度の見方に依存します。「最初に」実行したい場合は、数値が小さいほど、実行キューの優先順位が高くなります。ただし、関数の効果を他の関数よりも優先させる場合は、後で実行する必要があります。つまり、「効果」による優先度を高くします。そしてこの場合、それはおそらくあなたが望むより高い数です。以前のコメント投稿者が示唆しているように、RTMバージョンのjqueryを交換するメリットはほとんどありません。
ポールG.

3

ここには、相互に関連する複数の問題があります。

  1. スクリプトをエンキューするために使用する正しいアクションフックは次のとおりです。 wp_enqueue_scripts
  2. を介してフッターのスクリプトを印刷するにはwp_enqueue_script()$footerパラメーターをtrue
  3. あなたのadd_action( $hook, $callback )呼び出しは何にも包まれるべきではありません。から直接実行させるfunctions.php
  4. is_admin()条件チェックをコールバック内に置く必要があります
  5. 何らかの理由で、コアバンドルされたスクリプトをテーマから登録解除しないでください。スクリプトの連結が目的であっても、それがプラグインのテリトリーです。
  6. jqueryの登録を解除する必要がある場合wp_enqueue_scriptsは、遅すぎます。登録解除/登録コードをにフックされたコールバックに分割しますinit
  7. 他のスクリプト「jquery」を呼び出すことも、おそらくお勧めできません。jQueryデキューしてからカスタムスクリプトをロードするほうがよいでしょう。
  8. コールバックの優先度を低くして、プラグインをオーバーライドするようにしてください
  9. get_template_directory()ではなく使用TEMPLATEPATH

すべてを一緒に入れて:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

しかし、繰り返しますが、これは本当に最善の方法ではありません。あなたのより良い策は、コアjQueryを登録解除するプラグインadd_action()コールバックを削除するか、コアバンドルのjQueryを置き換えるような無謀なプラグインを使用しないことです。


OPは、WPで配布されたバージョンのjQueryと他のいくつかのスクリプトをプログラムで組み合わせて、すべてのJSファイルをロードするために彼のテーマによって1つのHTTPリクエストのみが作成されるようにします。したがって、カスタムスクリプトにはjQueryが含まれており、この方法でロードしても何も壊れません。登録された「jquery」ハンドルを上書きすることは、jQueryが2回読み込まれるのを防ぐために必要です-結合されたJSファイルで1回と、独自にjQueryをエンキューしようとするプラグインによってもう一度。
EAMann 2012年

jQueryだけ_doing_it_wrong()はないものを「jQuery」と呼ぶことは、意味的および実用的にです。また、jQuery自体は、2回読み込まれないようにするために、単にデキューすることができます。wp_dequeue_script()コールはちょうどその何も後でそれをキューに入れないことを確認するために十分な優先順位で発生する必要があります。
チップベネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.