add_action ( 'init') vs 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')을 사용하는 두 번째 방법은 테마에 스크립트 종속성을 작성하는 플러그인이있는 조건에서 실행되지 않습니다.


5
자신의 jquery 사본을 등록하지 마십시오. WordPress와 함께 제공된 버전을 사용하십시오. 그렇지 않으면 플러그인이 중단 될 수 있습니다.
Stephen Harris

나는 실제로 jQuery와 함께 제공된 것을 사용한다는 것에 동의합니다. http 요청을 줄이기 위해 테마에 필요한 다른 js 파일과 함께 단일 .js (mythemescripts.js)에로드하고 있습니다.
N2Mystic 2016 년

모든 브라우저에서 사이트에서 스크립트를 한 번 요청하면 로컬로 캐시됩니다. 첫 페이지로드시 추가 HTTP 요청 만 있습니다. 모든 스크립트를 단일 스크립트로 결합하면 WP가 새 버전의 jQuery로 업데이트를 릴리스 할 때마다이를 변경해야합니다. 이 == 유지 보수 악몽.
EAMann 2016 년

2
@ EAMann, 테마가 처음 설치되고 그 후에 테마 옵션 페이지가 저장 될 때마다 mythemescripts.js를 다시 작성하여 최신 jquery 라이브러리 사본을로드합니다. 사용자가 WP 버전을 업데이트하면 테마 옵션 루틴이 함께 제공되는 jquery를로드합니다. 항상 최신 상태입니다.
N2Mystic 2016 년

바닥 글 전에 문서 본문에 jquery 호출이 포함되어 있으면 문제가 계속 발생합니다. 분명히 jQuery (document) .ready는 .js 스크립트가 바닥 글에로드되기 전에 시작됩니다.
N2Mystic

답변:


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갈고리를 갖기 전에 , 그것은 "올바른"일을하는 방법이었고, 연습을 계속하는 튜토리얼은 여전히 ​​인터넷에 떠 다니고 있습니다. 그렇지 않으면 좋은 개발자가 손상됩니다.

기능을 두 부분으로 나누는 것이 좋습니다. 당신의 수행 wp_deregister_script/를 wp_register_scriptinit후크 및 사용 wp_enqueue_scripts당신이 실제로 jQuery를 대기열 때 후크를.

이렇게하면 스크립트를 대기열에 넣을 수있는 "올바른 작업"의 세계를 유지할 수 있으며, 대기열에 추가하기 전에 jQuery를 연결된 버전으로 교체하여 여전히 "잘못된 작업을 수행하는"수백 명의 개발자로부터 사용자를 보호 할 수 있습니다. .

또한 init우선 순위가 높은 후크 를 추가하고 싶을 것입니다 .

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

2
나는 이것을 추천 할 것이지만 OP가 실제로 jQuery를 등록 취소 한 다음 다른 스크립트를 완전히 등록하고 "jquery"라고 부르는 것을 깨달았습니다 . 나는 이것이 권장하는 좋은 습관이라고 생각하지 않으며 더 나은 경로는 단순히 jQuery를 완전히 대기열에서 빼고 나서 사용자 정의 핸들을 사용하여 사용자 정의 스크립트 를 큐 에 넣는 것이라고 생각합니다 .
칩 베넷

포인트에 대한주의 priority추가 작업. 우선 순위를 보는 방법에 따라 다릅니다. "첫 번째"를 실행하려면 실행 대기열 순서에서 우선 순위가 높을수록 숫자가 낮을수록 좋습니다. 그러나 함수의 효과가 다른 함수보다 우선하려면 나중에 "효과"에 의해 더 높은 우선 순위를 갖기를 원할 것입니다. 이 경우에는 아마도 더 높은 숫자 일 것입니다. 이전 주석자가 제안한 것처럼 RTM 버전의 jquery를 바꾸는 데는 장점이 없지만.
Paul 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 파일을로드하기 위해 그의 테마로 단 하나의 HTTP 요청 만 작성합니다. 따라서 사용자 정의 스크립트에는 jQuery가 포함되어 있으며 이런 식으로로드 된 경우 아무것도 중단하지 않습니다. 등록 된 'jquery'핸들을 덮어 쓰면 jQuery가 두 번로드되는 것을 방지 할 수 있습니다. 결합 된 JS 파일에서 한 번, 그리고 다시 jQuery를 자체적으로 대기열에 넣는 모든 플러그인에 의해 발생합니다.
EAMann 2016 년

jQuery "jQuery" 이외의_doing_it_wrong() 것을 호출하는 것은 의미 상 그리고 실제로 의미 있습니다. 또한 : jQuery 자체는 두 번로드되지 않도록하기 위해 단순히 대기열 에서 제외 시킬 수 있습니다 . wp_dequeue_script()전화는 나중에 그 아무것도 대기열에에게 그것을 보장하기 위해 충분한 우선 순위로 발생해야합니다.
칩 베넷
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.