จัดทำคอร์ 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' );

หากคุณใช้ jQuery เวอร์ชันที่โฮสต์โดย Google CDN โปรดแจ้งให้เราทราบว่าฉันจะแก้ไขรหัสนี้สำหรับ URL ของ Google CDN


5
คุณหมายถึงอะไร วิธีแก้ปัญหาเกี่ยวกับการย้าย jQuery ไปยังส่วนท้าย
Robert hue

2
นอกจากนี้คุณอาจจำเป็นต้องตรวจสอบ is_admin () เพื่อหลีกเลี่ยงการเปลี่ยนแปลงที่จะแบ็กเอนด์ jQuery หลังจากทั้งหมดเราต้องการจริงๆที่จะเพิ่มประสิทธิภาพส่วนหน้าในเว็บไซต์ของเรา :)
ทิมมาโลน

1
@TimMalone - ที่จริงแล้วคุณไม่ได้ - wp_enqueue_scriptsใช้เฉพาะที่ส่วนหน้าในขณะที่admin_enqueue_scriptsใช้สำหรับแบ็กเอนด์
dev_masta

1
ฉันคิดว่าวิธีนี้น่ากลัวจริง ๆ มีการลบแท็กเวอร์ชันด้วยหรือไม่ สไตล์เริ่มต้นคืออะไรและนี่รวมอะไรบ้าง 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 หลักโดยการตั้งค่าgroupการ1ซึ่งเป็นวิธีการ WordPress กำหนดว่าสคริปต์ควรจะอยู่ในส่วนท้ายหรือไม่ (ฉันไม่ได้ตระหนักถึงเหตุผลสำหรับการ1เป็น @jgraup ตั้งข้อสังเกตในความคิดเห็นที่ดูเหมือนว่าพลบิต)


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
ฉันหวังว่าบางคนสามารถแสดงความคิดเห็นเพิ่มเติมเกี่ยวกับคำตอบ upvoted ทั้งสามนี้ ทั้งหมดแตกต่างกันและต้องการความรู้เกี่ยวกับ WP เนื่องจาก google ต้องการให้สคริปต์เหล่านี้อยู่ในช่วงครึ่งหน้าจึงเป็นหัวข้อที่สำคัญ
ssaltman

2
คำตอบที่ดีที่สุด! หมายเหตุ : มันใช้งานได้ตั้งแต่ WordPress 4.2.0 และใช้ใน function.php ในการติดต่อกลับ 'wp_enqueue_scripts' ของ hook
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 );
}

ทำไมมันจึงดีกว่า IMO ที่ได้รับคำตอบแล้ว

  1. เปลี่ยนมันที่แกนกลางไม่ใช่ในภายหลังซึ่งสิ่งอื่น ๆ อาจยุ่งกับมัน
  2. สตริงเวอร์ชันที่เก็บไว้และไม่ถูกลบออก!
  3. มันไม่ได้ถอนการลงทะเบียนและการลงทะเบียนสคริปต์ $footer = trueแต่มันเป็นเพียงแค่ตั้งค่ากลุ่มที่เป็นหลักเช่นเดียวกับถ้าสคริปต์จะต้องลงทะเบียนกับ

เกี่ยวกับการไม่ทำสิ่งนี้กับผู้ดูแลระบบ

หากปลั๊กอินเพิ่ม jQuery แบบอินไลน์ลงใน wp_head ปลั๊กอินจะล้มเหลวเมื่อไม่ได้โหลด jquery ณ จุดนั้นดังนั้นฉันขอแนะนำให้คุณหลีกเลี่ยงจนกว่าจะมีการแก้ไขไซต์ของคุณนับล้านและพยายามเพิ่มประสิทธิภาพให้กับผู้ดูแลระบบของคุณ นี่เป็นความจริงสำหรับส่วนหน้าเช่นกันดังนั้นคุณควรระวังธีมที่ไม่ดีหรือปลั๊กอินที่ถือว่า jQuery ในส่วนหัวโดยใช้โค้ด inline jQuery WP และปลั๊กอินลงทะเบียนสคริปต์อื่น ๆ ไปยังหัวหน้าผู้ดูแลระบบด้วย jquery ใน deps ดังนั้นมันจะไม่ทำงานอย่างไรก็ตามฉันคิดว่า

เกี่ยวกับมันไม่ทำงาน

คุณต้องระวังว่าหากมีการโหลดสคริปต์อื่นใดไปยังส่วนหัวที่มี jQuery ในการอ้างอิงของมันก็จะทำให้การโหลด jQuery ในหัวขวาก่อนที่ตัวเอง และนี่เป็นสิ่งที่ดีและคาดหวังเหตุผลที่ระบบ wp_enqueue มีอยู่ ซึ่งหมายความว่าคุณจะได้เรียนรู้เร็ว ๆ นี้หากคุณใช้ปลั๊กอินเล็ก ๆ น้อย ๆ ที่หนึ่งในนั้นจะต้องทำให้เกิด jQuery มันเป็นค่าเริ่มต้นสำหรับสคริปต์ที่เข้าคิว

วิธีการแก้ปัญหาแบบรุนแรง

ฉันคิดว่ามันจะเบรกแบบอินไลน์ JS ที่ถือว่า jQuery แต่ควรที่จะหายาก วิธีนี้จะบังคับให้สคริปต์ทั้งหมดไปยังส่วนท้ายโดยไม่คำนึงถึงวิธีการจัดคิว

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
ในขณะนี้อาจตอบคำถามและมีจุดที่ดีที่จะเคี้ยวในมีเสียงรบกวนมากเกินไป (ปุย?) ในคำตอบและคล้ายกับคำตอบที่โพสต์ก่อนหน้านี้กับการปรับปรุงรหัสเล็กน้อย อาจได้รับการตอบรับที่ดีกว่าหากมีการแก้ไขและลดขนาดให้เล็กลงเพื่อให้ข้อมูลที่มากกว่า นอกจากนี้ยังไม่จำเป็นต้องโทรออกผู้ใช้หรือคำตอบที่เฉพาะเจาะจง (เนื่องจากอาจไม่มีเหตุผลใด ๆ ในอนาคต)
Howdy_McGee

คุณโทรหาคนที่ไม่ได้กล่าวถึงอย่างสมบูรณ์และน่าจะดีกว่าถ้าอย่างนั้นคำตอบอื่น ๆ ก็คือ "การปรับปรุงรหัสรอง" งั้นก็ไม่จริง นอกจากนี้ฉันไม่ได้ "โทรออก" ทุกคนฉันเพิ่งพูดถึงข้อเท็จจริงที่ฉันรู้เพื่อปรับปรุงรูปแบบการเข้ารหัสและให้ความรู้ผู้อ่านเกี่ยวกับเรื่องนี้เพื่อให้พวกเขาเขียนโค้ดได้ดีขึ้น อย่างจริงจังฉันใช้เวลาพอสมควรในการเขียนคำตอบที่ดีที่สุดที่นี่และนี่คือสิ่งที่ฉันได้รับมัน
NextGenThemes

4
คำตอบอื่น ๆ ไม่ได้พูดถึงสคริปอื่นที่บังคับให้ jQuery เป็นหัวในความเป็นจริงคำตอบของฉันทำให้คนสับสนที่ไม่รู้ว่าทำไมมันถึงไม่ทำงาน ไม่มีคำตอบอื่น ๆ ที่พูดถึงความเสี่ยงที่อาจเกิดขึ้น ...
NextGenThemes

รหัสนี้ (ตามรหัสของคำตอบข้างต้น) ทำให้ฉันมีข้อผิดพลาด 500 ข้อ ฉันมี WordPress 4.9.9
Marco Panichi

ยากที่จะเชื่อว่ารหัสนี้ก่อให้เกิด 500 คุณอาจทำผิดพลาดในการใช้รหัสนี้ นี่ไม่ใช่สถานที่ที่เหมาะสมที่จะถามและรุ่น WP ที่ล้าสมัยของคุณนั้นแทบจะไม่มีข้อมูลเพียงพอ
NextGenThemes

2

ฉันได้พัฒนาปลั๊กอินสำหรับปัญหาเฉพาะนี้ ปลั๊กอินนี้ไม่ยุ่งกับ WordPress jQuery เนื่องจากมันถูกโหลดในส่วนหน้าเท่านั้น ดู: jQuery Manager สำหรับ WordPress

ทำไมถึงเป็นอีกหนึ่งเครื่องมือ jQuery Updater / Manager / Developer / Debugging

เนื่องจากไม่มีเครื่องมือสำหรับนักพัฒนาให้คุณเลือก jQuery และ / หรือ jQuery Migrate รุ่นที่ระบุ ให้ทั้งการบีบอัดขนาดเล็ก / การผลิตและรุ่นที่ไม่บีบอัด / พัฒนา ดูคุณสมบัติด้านล่าง!

executed ดำเนินการเฉพาะในส่วนหน้าเท่านั้นไม่รบกวนการทำงานของ WordPress admin / backend และ WP Customizer (สำหรับเหตุผลด้านความเข้ากันได้) ดู: https://core.trac.wordpress.org/ticket/45130และ https: // core trac.wordpress.org/ticket/37110

เปิด / ปิด jQuery และ / หรือ jQuery Migrate

✅เปิดใช้งานjQuery และ / หรือ jQuery Migration รุ่นที่เฉพาะเจาะจง

และอีกมากมาย! รหัสคือโอเพ่นซอร์สดังนั้นคุณสามารถศึกษาเรียนรู้จากมันและมีส่วนร่วม


เกือบทุกคนใช้มือจับที่ไม่ถูกต้อง

WordPress ใช้ jquery-core handle จริง ๆ ไม่ใช่ jquery:

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-coreพร้อมjquery-migrate

ดูข้อมูลเพิ่มเติมเกี่ยวกับนามแฝง: wp_register_script ตัวระบุหลายตัว?

วิธีที่ถูกต้องในการทำ

ในตัวอย่างของฉันด้านล่างฉันใช้ jQuery CDN อย่างเป็นทางการที่https://code.jquery.comฉันยังใช้script_loader_tagเพื่อให้ฉันสามารถเพิ่มแอตทริบิวต์ CDN บางอย่างได้
คุณสามารถใช้รหัสต่อไปนี้:

// 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

สวัสดี Desi โปรดตรวจสอบคำตอบที่แก้ไขแล้วฉันคิดว่ามันช่วยคุณได้
Amit Mishra

6
ฉันค่อนข้างมั่นใจว่านี่เป็นความคิดที่แย่มาก - คุณได้ป้องกันสิ่งใด ๆจากการโหลดสคริปต์ในส่วนหัวไม่ใช่แค่ jQuery และอาจเป็นสคริปต์ที่มีการซ้อนสองชั้น ในความเป็นจริงคุณอาจแค่ต้องการremove_action/ add_actionส่วนถ้าคุณจะทำเช่นนี้
drzaus

1
ความคิดที่แย่จริง ๆ อย่าทำอย่างนี้!
NextGenThemes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.