เมื่อใดควรใช้ add_action ('init') กับ add_action ('wp_enqueue_scripts')


10

ในฟังก์ชั่นของ theme.php ฉันกำลังเรียก add_action เพื่อให้สามารถวัดการควบคุมได้ว่าโหลด jquery ไว้ที่ไหน (ในส่วนท้ายพร้อมกับสคริปต์อื่น ๆ ของธีม)

ปัญหาที่ฉันมีอยู่ก็คือเมื่อฉันใช้ add_action ('wp_enqueue_scripts') มันจะปรากฏขึ้นก็ต่อเมื่อไม่มีการโหลดปลั๊กอิน อย่างไรก็ตามวิธีการ add_action ('init') สามารถใช้งานได้ในทุกกรณี

ฉันจำไม่ได้ว่าทำไม แต่ฉันเชื่อว่าเป็นที่ต้องการ add_action ('wp_enqueue_scripts') ในกรณีนี้ หากเป็นจริงฉันจะทำให้มันทำงานได้ในทุกกรณีได้อย่างไร

ในฟังก์ชั่น

//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');

}

เมธอดที่ 2 โดยใช้ add_action ('wp_enqueue_scripts') จะไม่ถูกเรียกใช้งานในสภาวะที่ปลั๊กอินมีอยู่ซึ่งจะเขียนการอ้างอิงสคริปต์ไปยังธีม


5
กรุณาอย่าลงทะเบียนสำเนาของคุณเอง jQuery - ใช้รุ่นมาพร้อมกับ WordPress, อื่น ๆ ที่คุณจะจบลงหมดปลั๊กอิน :)
สตีเฟ่นแฮร์ริส

ฉันเห็นด้วยจริง ๆ แล้วฉันใช้ของที่จัดส่งมาพร้อม jQuery ฉันแค่โหลดมันลงในไฟล์. js (mythemescripts.js) เดี่ยวพร้อมกับไฟล์ js อื่น ๆ ที่ชุดรูปแบบของฉันต้องการเพื่อลดคำร้องขอ http
N2Mystic

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

2
@EAMann เมื่อมีการติดตั้งชุดรูปแบบเป็นครั้งแรกและทุกครั้งที่มีการบันทึกหน้าตัวเลือกชุดรูปแบบของฉันในภายหลังฉันจะเขียน mythemescripts.js ใหม่โดยโหลดสำเนา jQuery ไลบรารี่ใหม่ลงในนั้น หากผู้ใช้อัปเดตรุ่น WP ของพวกเขาชุดรูปแบบตัวเลือกของฉันประจำ jQuery ที่มาพร้อมกับที่ มันทันสมัยอยู่เสมอ
N2Mystic

ปัญหายังคงเกิดขึ้นเมื่อมีการเรียก jquery ในเนื้อหาของเอกสารก่อนท้ายกระดาษ เห็นได้ชัดว่า jQuery (เอกสาร). เตรียมพร้อมก่อนที่สคริปต์. js จะถูกโหลดลงในส่วนท้าย
N2Mystic

คำตอบ:


26

นักพัฒนาปลั๊กอินจำนวนมากไม่ทำสิ่งที่ถูกต้อง ขวาวิธีคือการขอไปwp_enqueue_scriptsเหมือนที่คุณกำลังพยายามที่จะทำ

อย่างไรก็ตามนี่คือคำสั่งของ hooks ที่ทำงานในคำขอทั่วไป:

  • 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_scriptบนinithook ของคุณและใช้wp_enqueue_scriptshook เมื่อคุณ enqueue jQuery

สิ่งนี้จะทำให้คุณอยู่ในโลกของ "ทำถูกต้อง" เพื่อจัดคิวสคริปต์ของคุณและจะช่วยปกป้องคุณจากนักพัฒนาซอฟต์แวร์หลายร้อยคนที่ยัง "ทำผิด" โดยสลับ jQuery สำหรับรุ่นที่ต่อกันก่อนที่จะเพิ่มลงในคิว .

คุณจะต้องเพิ่มinitตะขอของคุณด้วยลำดับความสำคัญสูง:

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

2
ฉันจะแนะนำสิ่งนี้ แต่แล้วฉันก็รู้ว่า OP นั้นเลิกการลงทะเบียน jQuery แล้วลงทะเบียนสคริปต์ที่แตกต่างออกไปโดยสิ้นเชิงและเรียกมันว่า "jquery" ฉันไม่คิดว่าเป็นวิธีที่ดีที่จะส่งเสริมและคิดว่าเป็นเส้นทางที่ดีกว่าจะเพียงเพื่อdequeue jQuery อย่างสิ้นเชิงแล้ว enqueue สคริปต์ที่กำหนดเองโดยใช้มือจับที่กำหนดเอง
Chip Bennett

ชี้ไปที่บันทึกเกี่ยวกับpriorityการเพิ่มการกระทำ ทุกอย่างขึ้นอยู่กับว่าคุณดูลำดับความสำคัญอย่างไร หากคุณต้องการให้คุณเรียกใช้ "ลำดับแรก" หมายเลขที่ต่ำกว่าจะดีกว่า - ลำดับความสำคัญสูงกว่าในลำดับคิวการดำเนินการ แต่ถ้าคุณต้องการให้เอฟเฟกต์ของคุณมีความสำคัญเหนือกว่าคนอื่นคุณจะต้องให้มันทำงานในภายหลัง - ดังนั้นจึงมีความสำคัญสูงกว่าโดย "เอฟเฟกต์" และในกรณีนี้อาจเป็นตัวเลขที่สูงกว่าที่คุณต้องการ แม้ว่าจะมีข้อดีเล็กน้อยในการแลกเปลี่ยน jQuery รุ่น RTM ตามที่ผู้วิจารณ์คนก่อนหน้าแนะนำ
Paul G.

3

มีหลายปัญหาที่นี่ซึ่งเกี่ยวข้องกับการทำงานร่วมกัน

  1. เบ็ดการกระทำที่ถูกต้องที่จะใช้ในการจัดคิวสคริปต์คือ wp_enqueue_scripts
  2. หากต้องการพิมพ์สคริปต์ในส่วนท้ายด้วยwp_enqueue_script()ให้ตั้งค่า$footerพารามิเตอร์เป็นtrue
  3. การadd_action( $hook, $callback )โทรของคุณไม่ควรห่อในสิ่งใด ให้พวกเขาดำเนินการโดยตรงจากfunctions.php
  4. คุณควรใส่การis_admin()ตรวจสอบตามเงื่อนไขในการติดต่อกลับ
  5. คุณไม่ควรลงทะเบียนสคริปต์หลักที่รวมมาจาก Theme ไม่ว่าด้วยเหตุผลใด แม้ว่าจุดประสงค์ของคุณเป็นสคริปต์เรียงต่อกันว่าเป็นดินแดนปลั๊กอิน
  6. หากคุณต้องยกเลิกการลงทะเบียน jQuery แล้วwp_enqueue_scriptsเป็นสายเกินไป แยกยกเลิกการลงทะเบียน / initรหัสลงทะเบียนของคุณให้เป็นโทรกลับเข้าไปติดยาเสพติด
  7. การเรียกสคริปต์ "jquery" อื่น ๆอาจไม่ใช่วิธีที่ดี ทางออกที่ดีกว่าของคุณคือdequeue 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 );

แต่อีกครั้ง: นี่ไม่ใช่วิธีที่ดีที่สุด ทางออกที่ดีกว่าของคุณคือเพียงแค่ลบการเรียกกลับปลั๊กอิน add_action () ที่ยกเลิกการลงทะเบียน jQuery หลักหรือใช้ปลั๊กอินที่ไม่ได้ทำสิ่งใดอย่างประมาทเมื่อเทียบกับการเปลี่ยน jQuery หลักที่รวมมาด้วย


OP กำลังรวม jQuery เวอร์ชันกระจาย WP กับสคริปต์อื่น ๆ โดยทางโปรแกรมเพื่อให้มีการร้องขอ HTTP หนึ่งครั้งเท่านั้นโดยธีมของเขาเพื่อโหลดไฟล์ JS ทั้งหมด ดังนั้นสคริปต์ที่กำหนดเองจะมี jQuery และจะไม่แตกหักหากโหลดด้วยวิธีนี้ การเขียนทับหมายเลขอ้างอิง 'jquery' ที่ลงทะเบียนไว้นั้นเป็นสิ่งจำเป็นเพื่อป้องกันการโหลด jQuery สองครั้ง - หนึ่งครั้งในไฟล์ JS ที่รวมกันและอีกครั้งโดยปลั๊กอินใด ๆ ที่พยายามจัดคิว jQuery ด้วยตนเอง
EAMann

มันมีความหมายและในทางปฏิบัติที่_doing_it_wrong()จะเรียกสิ่งที่ไม่ใช่แค่ jQuery "jQuery" นอกจากนี้: jQuery สามารถdequeuedเพื่อให้แน่ใจว่าไม่ได้โหลดสองครั้ง การwp_dequeue_script()โทรต้องเกิดขึ้นโดยมีลำดับความสำคัญเพียงพอเพื่อให้มั่นใจว่าจะไม่มีสิ่งใดเข้ามาในภายหลัง
Chip Bennett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.