web-dev-qa-db-ja.com

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

私のテーマの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番目の方法は、テーマへのスクリプト依存関係を書き出すプラグインが存在する条件では実行されないようです。

9
N2Mystic

多くのプラグイン開発者は物事を正しいやり方でやっていません。 right の方法はあなたがやろうとしているように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つの部分に分割することです。 initフックでwp_deregister_script/wp_register_scriptを行い、実際にjQueryをエンキューするときはwp_enqueue_scriptsフックを使用してください。

これはあなたのスクリプトをエンキューするために "正しくやっている"という世界にあなたを保ち、それらをキューに追加する前にあなたの連結バージョンのjQueryを交換することによってまだ "間違ってやっている"何百人もの開発者からあなたを守るのを助けます。 。

また、あなたのinitフックを高い優先度で追加したいでしょう。

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

ここに複数の問題があります、それは相互に関連しています。

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

すべてを一緒に入れて:

<?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を置き換えるのと同じくらい無意味なことをしないプラグインを使用することです。

3
Chip Bennett