바닥 글에 핵심 jQuery를 큐에 넣습니까?


22

functions.php파일에 이것을 가지고 있으며 바닥 글에 jQuery를로드 할 수 없습니다. 그러나 includes파일은 바닥 글에 잘로드됩니다. 다른 무엇을해야합니까?

function starter_scripts() {
    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );

    wp_enqueue_script( 'jquery', '', '', '', true );

    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

성능상의 이유로이 작업을 수행하는 경우 defer대신 스크립트 태그를 추가 하는 것을 고려할 수 있습니다. matthewhorne.me/defer-async-wordpress-scripts
diachedelic

여기에 WP dev, 나는 이것을 처리하기 위해 플러그인을 만들었습니다 : wordpress.org/plugins/jquery-manager
Remzi Cavdar

답변:


23

그러기 위해서는 먼저 jQuery 스크립트를 등록 해제 한 다음 다시 등록해야합니다. jQuery를 WordPress와 함께 사용하면 다음 기능을 찾고 있습니다.

function starter_scripts() {
    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', includes_url( '/js/jquery/jquery.js' ), false, NULL, true );
    wp_enqueue_script( 'jquery' );

    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Google CDN 호스팅 버전의 jQuery를 사용하는 경우 Google CDN URL에 대해이 코드를 수정하겠습니다.


5
무슨 소리 야? 해결책은 jQuery를 바닥 글로 옮기는 것입니다.
Robert hue

2
우리는 정말 :) 우리 사이트의 프론트 엔드를 최적화하는 데 필요한 모든 후, 당신은 또한 백엔드 jQuery를 변경을 방지하기 위해 () is_admin 확인해야 할 수도 있습니다
팀 말론을

1
@TimMalone-실제로는 그렇지 않습니다- wp_enqueue_scripts백엔드 admin_enqueue_scripts에 사용되는 동안 프론트 엔드에만 사용됩니다
dev_masta

1
이 솔루션은 실제로 끔찍하다고 생각합니다. 이것으로 버전 태그가 제거 되었습니까? 이 스타터 스타일은 무엇이며 이것이 include.min.js이며 jQuery와 관련이 있습니다.
NextGenThemes

2
@redanimalwar 스타터 스타일 및 포함 파일은 질문에서 직접 제공됩니다.
tehlivi

43

등록을 해제하고 다시 등록하지 않아도되는 다른 옵션은 다음과 같습니다.

/**
 * Move jQuery to the footer. 
 */
function wpse_173601_enqueue_scripts() {
    wp_scripts()->add_data( 'jquery', 'group', 1 );
    wp_scripts()->add_data( 'jquery-core', 'group', 1 );
    wp_scripts()->add_data( 'jquery-migrate', 'group', 1 );
}
add_action( 'wp_enqueue_scripts', 'wpse_173601_enqueue_scripts' );

이 솔루션 은 을 설정하여 WordPress 핵심모방 합니다 .group11


1
흥미 롭군 그것은과 같은 wp_register_script용도 add_data( $handle, 'group', 1 )바닥 글에 스크립트를 이동합니다. core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/…- 왜 그런지 확장 할 수 있습니까? 코드를 살펴보면 '그룹'이 약간 임의적 인 것처럼 보입니다. 그러나 core.trac.wordpress.org/browser/tags/4.5/src/wp-includes / ... 에서 WP_Scripts->에서 어떻게 사용되는지 볼 수 있습니다 do_item. 어느 쪽이든, 이것은 가장 파괴적인 대답 인 것 같습니다.
jgraup

2
누군가이 세 가지 답변에 대해 더 언급 할 수 있기를 바랍니다. 모두 다르며 WP에 대한 지식이 필요합니다. Google은 이러한 스크립트가 폴더 아래에 있어야하므로 중요한 주제입니다.
ssaltman

2
최고의 답변! 참고 : WordPress 4.2.0부터 작동하며 hook 'wp_enqueue_scripts'콜백의 functions.php에서 사용합니다.
realmag777

안녕하세요 위의 방법을 시도했지만 작동하지 않았습니다. 누구든지 도울 수 있습니까?
iSaumya

1
이거 정말 좋다! 정말 고맙습니다. 그러나 주목할만한 가치는 @tehlivi 상태입니다-WP는 이전 버전의 jQuery를 사용합니다-새로운 버전을 등록 취소하고 등록하는 것을 고려하십시오.
skolind

18

더 나은 해결책 :

add_action( 'wp_default_scripts', 'move_jquery_into_footer' );

function move_jquery_into_footer( $wp_scripts ) {

    if( is_admin() ) {
        return;
    }

    $wp_scripts->add_data( 'jquery', 'group', 1 );
    $wp_scripts->add_data( 'jquery-core', 'group', 1 );
    $wp_scripts->add_data( 'jquery-migrate', 'group', 1 );
}

허용되는 답변보다 나은 이유

  1. 다른 것들이 이미 엉망이 된 후기 단계가 아닌 핵심에서 변경합니다.
  2. 제자리에 유지되고 제거되지 않은 버전 문자열!
  3. 스크립트를 등록 취소하고 다시 등록하지는 않지만 스크립트를 등록 할 때와 본질적으로 동일한 그룹 값만 설정합니다 $footer = true.

관리자에게이 작업을 수행하지 않음

플러그인이 wp_head에 인라인 jquery를 추가하면 해당 시점에서 jquery가로드되지 않으면 실패하므로 사이트를 수백만 번 편집하여 관리자의 성능을 최적화하려고 할 때까지 피하는 것이 좋습니다. 이는 프론트 엔드에서도 마찬가지이므로 인라인 jQuery 코드를 사용하여 헤드에서 jQuery를 가정하는 잘못된 코드 테마 또는 플러그인을 조심해야합니다. WP와 플러그인은 jquery를 사용하여 다른 스크립트를 관리자 헤드에 등록하므로 어쨌든 작동하지 않습니다.

작동하지 않습니다

의존성에 jQuery가있는 헤드에 다른 스크립트가로드되면 jQuery가 헤드 바로 앞에로드됩니다. 그리고 이것은 wp_enqueue 시스템이 존재하는 이유가 좋고 좋습니다. 즉, 플러그인 중 하나를 사용하면 jquery가 머리에 필요하다는 플러그인을 곧 배울 수 있습니다. 슬프게도 대기열에 넣은 스크립트의 기본값입니다.

과격한 해결책

jquery를 가정하는 인라인 JS를 제동 할 것이라고 생각하지만 드 물어야합니다. 이렇게하면 대기열에 들어가는 방법에 관계없이 모든 스크립트 를 바닥 글로 강제 합니다 .

add_action( 'wp_enqueue_scripts', 'js_to_footer' );

function js_to_footer() {
  remove_action( 'wp_head', 'wp_print_scripts' );
  remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
  remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
}

2
이것은 질문에 대답 할 수 있지만 대답에 너무 많은 소음 (fluff?)이 있는지 씹을만한 좋은 점이 있지만 약간의 코드 개선으로 이전에 게시 된 답변과 매우 유사합니다. 더 많은 정보를 제공하는 버전으로 편집하고 축소하면 더 잘 수신 될 수 있습니다. 또한 특정 사용자 나 답변을 부를 필요가 없습니다 (향후 어떤 이유로 든 존재하지 않을 수 있음).
Howdy_McGee

당신은 완전히 언급되지 않았고 아마도 다른 대답에서 언급 된 것보다 "더 작은 코드 개선"이라고 부릅니다. 그건 사실이 아닙니다. 또한 나는 누군가를 "소집"하지 않았으며, 코딩 스타일을 개선하고 독자들에게 더 나은 코드를 작성하도록 교육시키는 사실을 언급했습니다. 진지하게 나는 여기까지 최고의 답변을 쓰는 ​​데 시간이 많이 걸렸으며 이것이 내가 얻는 것입니다.
NextGenThemes

4
다른 답변은 jQuery를 머리에 강요하는 다른 스크립트에 대해서는 언급하지 않습니다. 사실 답변은 왜 작동하지 않는지를 모르는 사람들로부터 혼란을 없애줍니다. 다른
응답자

이 코드 (위의 답변 코드)에서 500 오류가 발생했습니다. 워드 프레스 4.9.9가 있습니다
Marco Panichi

이 코드로 인해 500이 발생했다고 생각하기 어려우면 코드에서이 코드를 구현하는 데 실수를 한 것 같습니다. 이것은 실제로 물어 볼만한 곳이 아니며 오래된 WP 버전은 정보가 충분하지 않습니다.
NextGenThemes

2

이 특정 문제에 대한 플러그인을 개발했습니다. 이 플러그인은 프론트 엔드에만로드되므로 WordPress jQuery와 혼동되지 않습니다. 참조 : WordPress 용 jQuery 관리자

왜 또 다른 jQuery 업데이터 / 관리자 / 개발자 / 디버깅 도구?

개발자 도구 중 어느 것도 특정 버전의 jQuery 및 / 또는 jQuery Migrate를 선택할 수 없기 때문입니다. 압축 축소 / 제작 및 비 압축 / 개발 버전을 모두 제공합니다. 아래 기능을 참조하십시오!

✅ 프런트 엔드에서만 실행되며 WordPress 관리자 / 백엔드 및 WP 사용자 정의 프로그램을 방해하지 않습니다 (호환성 이유로 https://core.trac.wordpress.org/ticket/45130https : // core 참조). trac.wordpress.org/ticket/37110

✅ jQuery 및 / 또는 jQuery Migrate 켜기 / 끄기

특정 버전 의 jQuery 및 / 또는 jQuery Migrate 활성화

그리고 훨씬 더! 코드는 오픈 소스이므로 학습하고 배우고 기여할 수 있습니다.


거의 모든 사람이 잘못된 핸들을 사용합니다

WordPress는 실제로 jquery가 아닌 jquery-core 핸들을 사용합니다.

https://github.com/WordPress/WordPress/blob/f84ab5e19f0038a3abec71821c9b8f47a4272942/wp-includes/script-loader.php#L1017

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4-wp' );
$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

JQuery와 핸들 부하 단지의 별칭입니다 JQuery와 코어JQuery와 - 마이그레이션

별칭에 대한 자세한 정보를 참조하십시오 : wp_register_script 여러 식별자를?

올바른 방법

아래 예에서 https://code.jquery.com 의 공식 jQuery CDN을 사용하고 일부 CDN 속성을 추가 할 수 있도록 script_loader_tag 도 사용 합니다.
다음 코드를 사용할 수 있습니다.

// Front-end not excuted in the wp admin and the wp customizer (for compatibility reasons)
// See: https://core.trac.wordpress.org/ticket/45130 and https://core.trac.wordpress.org/ticket/37110
function wp_jquery_manager_plugin_front_end_scripts() {
    $wp_admin = is_admin();
    $wp_customizer = is_customize_preview();

    // jQuery
    if ( $wp_admin || $wp_customizer ) {
        // echo 'We are in the WP Admin or in the WP Customizer';
        return;
    }
    else {
        // Deregister WP core jQuery, see https://github.com/Remzi1993/wp-jquery-manager/issues/2 and https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // the jquery handle is just an alias to load jquery-core with jquery-migrate
        // Deregister WP jQuery
        wp_deregister_script( 'jquery-core' );
        // Deregister WP jQuery Migrate
        wp_deregister_script( 'jquery-migrate' );

        // Register jQuery in the head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Register jquery using jquery-core as a dependency, so other scripts could use the jquery handle
         * see /wordpress/283828/wp-register-script-multiple-identifiers
         * We first register the script and afther that we enqueue it, see why:
         * /wordpress/82490/when-should-i-use-wp-register-script-with-wp-enqueue-script-vs-just-wp-enque
         * /programming/39653993/what-is-diffrence-between-wp-enqueue-script-and-wp-register-script
         */
        wp_register_script( 'jquery', false, array( 'jquery-core' ), null, false );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_jquery_manager_plugin_front_end_scripts' );


function add_jquery_attributes( $tag, $handle ) {
    if ( 'jquery-core' === $handle ) {
        return str_replace( "type='text/javascript'", "type='text/javascript' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_jquery_attributes', 10, 2 );

0
add_action("wp_enqueue_scripts", "myscripts");

function myscripts() { 
   wp_enqueue_script( 'jquery' , '', array(), true); //true for footer
   wp_enqueue_script( 'someScript-js', 'https://domain.com/someScript.js' , '', '', true );
}

-3

이처럼 코드 만 변경하십시오

function starter_scripts() {
        wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
        wp_enqueue_script('jquery');
        wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', array( 'jquery' ) );
    }
    add_action( 'wp_enqueue_scripts', 'starter_scripts' );

나는 잘 작동하는 것 같아

이 줄을 functions.php 파일에 추가하십시오

remove_action('wp_head', 'wp_enqueue_scripts', 1);
add_action('wp_footer', 'wp_enqueue_scripts', 5);

그런 다음 바닥 글에 스크립트를 추가합니다


이것은 jQuery를 머리에 넣습니다. 바닥 글에 필요합니다.
Desi

Hey Desi 편집 한 답변을 확인해주세요. 도움이 될 것 같습니다
Amit Mishra

6
나는 확신이 끔찍한 생각 해요 - 당신은 효과적으로 방지 한 것도 헤더뿐만 아니라 jQuery를에 로딩 스크립트에서을 두 번 대기열에 스크립트 수 있습니다 (깊이 것을 보았다하지 않은 경우). 실제로, 이런 식으로 할 경우 remove_action/ add_action부분 만 필요할 것입니다.
drzaus

1
참으로 끔찍한 생각, 이러지 마!
NextGenThemes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.