คำแนะนำเกี่ยวกับ WordPress hooks

เผยแพร่แล้ว: 2021-07-19

ระบบ hooks อาจดูน่ากลัวสำหรับผู้ที่ไม่ได้ฝึกหัด แต่ก็เป็นหนึ่งในสิ่งที่ดีที่สุดเกี่ยวกับ WordPress คู่มือนี้จะช่วยให้คุณเข้าใจพื้นฐานของตะขอและวิธีใช้งาน โดยให้ตัวอย่างการใช้งานและคำแนะนำเพิ่มเติม

ทำไมคุณถึงต้องใช้ตะขอ?

ในกรณีที่คุณไม่ทราบอยู่แล้วว่ามันเป็นความคิดที่ดีมากที่จะไฟล์การเปลี่ยนแปลงหลักใน WordPress (WP) นอกเหนือจากความเสี่ยงด้านความปลอดภัย การเปลี่ยนแปลงของคุณจะถูกเขียนทับทุกครั้งที่คุณอัปเดต WP! เช่นเดียวกับปลั๊กอินและธีม

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

ใส่เพียงคุณควรใช้ตะขอเพราะพวกเขาชดเชยความเสี่ยงของการทำงานหลักที่เปลี่ยนแปลง

ในแง่นี้ความสำคัญของตะขอไม่สามารถพูดเกินจริง ได้ เป็นกุญแจสำคัญในการขยาย WP และเป็นรากฐานที่สำคัญของระบบนิเวศของปลั๊กอินและธีม จะช่วยตัวเองให้หายปวดหัวได้ด้วยการเรียนรู้พื้นฐานและใช้งานให้ดี

พวกเขาคืออะไร?

คุณสามารถคิดว่า hooks เป็น เหตุการณ์ ที่เกิดขึ้นตลอดลำดับการโหลด WP เมื่อ WP พบตะขอ มันจะยิงฟังก์ชันทั้งหมดที่ติดอยู่กับตะขอนั้นก่อนดำเนินการต่อ

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

พวกเขาทำงานอย่างไร

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

พวกเขามีลักษณะอย่างไร

การเพิ่มฟังก์ชันให้กับ hook มีลักษณะดังนี้:

add_action( $hook_name, $function_name, $priority, $arguments );

$hook_name เป็นชื่อของ hook ที่คุณต้องการกำหนดเป้าหมาย

$function_name เป็นชื่อของฟังก์ชันที่คุณต้องการเพิ่มใน hook . นั้น

$ ความสำคัญเป็นจำนวนเต็มระบุ $ function_name 's ลำดับความสำคัญใน $ hook_name' s คิว ยิ่งตัวเลขน้อย ลำดับความสำคัญยิ่งสูง เริ่มต้นที่ 1 ตัวเลขนี้อาจสูงได้เท่าที่คุณต้องการ (ภายในขีดจำกัดของระบบ) แต่ไม่น่าจะเกิน 40 ค่าดีฟอลต์คือ 10

$arguments เป็นจำนวนเต็มที่ระบุจำนวนอาร์กิวเมนต์ที่คุณใช้ในฟังก์ชัน นี้ต้องตรงกับจำนวนของอาร์กิวเมนต์ส่งผ่านไปยังฟังก์ชั่น ค่าเริ่มต้นคือ 1

การลบฟังก์ชันออกจาก hook เกือบจะเหมือนกัน:

remove_action( $hook_name, $function_name, $priority );

ราคา $ function_name และ $ ลำดับความสำคัญจะต้องตรงกับค่าเดิมของพวกเขาจากฟังก์ชั่น add_action สอดคล้องกันหรือพวกเขาจะไม่ถูกลบ!

ประเภทของเบ็ด

ตะขอมีสองประเภทหลัก: ตะขอ แอ็คชั่น และ ตะขอ กรอง มีความคล้ายคลึงกันหลายประการ – add_action() และส่วนเสริมของ add_filter() ถูกเรียกในลักษณะเดียวกัน ความแตกต่างอยู่ในฟังก์ชันที่คุณส่งผ่าน:


// รันโค้ด
add_action( 'where_to_do_the_thing', 'do_the_thing' );
ฟังก์ชัน do_the_thing() {
// ดำเนินการบางอย่างที่จำเป็นในการทำสิ่งนั้น
}

// เปลี่ยนตัวแปร
add_filter( 'the_thing', 'change_the_thing' );
ฟังก์ชั่น change_the_thing( $thing ) {
// กรอง $thing และเปลี่ยนเป็นอะไรก็ได้ที่คุณต้องการ จากนั้น...

ส่งคืนสิ่ง $;
}

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

คุณอาจจะได้สังเกตเห็นว่าฉันซ้ายออก $ ลำดับความสำคัญและ $ ข้อโต้แย้ง เนื่องจากค่าเริ่มต้นนั้นใช้ได้ ถ้ามันช่วยได้ หลักการข้างต้นก็เหมือนกับ:


// รันโค้ด
add_action( 'where_to_do_the_thing', 'do_the_thing', 10, 1 );
// เปลี่ยนตัวแปร
add_filter( 'the_thing', 'change_the_thing', 10, 1 );

นี่เป็นตัวอย่างที่ประดิษฐ์ขึ้นแน่นอน แต่แสดงให้เห็นความแตกต่างที่สำคัญระหว่างสองสิ่งนี้: ตัวกรองมีไว้สำหรับเปลี่ยนตัวแปร การกระทำสำหรับการเพิ่มโค้ด

ตัวอย่างที่ประดิษฐ์น้อยลง

สมมติว่าคุณต้องการให้ WP ส่งการแจ้งเตือนทางอีเมลเมื่อมีผู้ใช้ใหม่ลงทะเบียนในไซต์ของคุณ อ้างถึง WP codex คุณพบ user_register action hook สิ่งนี้ให้ ตัวแปร $user_id แก่ คุณ ซึ่งคุณสามารถใช้เพื่อรับรายละเอียดของผู้ใช้ wp_mail() จัดการส่วนที่เหลือ:


add_action( 'user_register', 'notify_on_user_registration' );
ฟังก์ชั่น notify_on_user_registration ($ user_id ) {

// รับผู้ใช้
$user = get_user_by( 'id', $user_id );

// เตรียมหัวเรื่องอีเมลและเนื้อหา
$ subject = “การลงทะเบียนผู้ใช้ใหม่”;
$message = “ผู้ใช้ใหม่ {$user->first_name} {$user->last_name} ได้ลงทะเบียนแล้ว”;

// ส่งอีเมล
wp_mail( '[email protected]', $ subject, $message );
}

จะทำอย่างไรถ้าคุณต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าแรกของคุณเมื่อเข้าสู่ระบบ? คุณทำสิ่งนี้ได้อย่างง่ายดายด้วย hook_redirect ซึ่งให้ URL ที่ผู้ใช้ถูกเปลี่ยนเส้นทางโดยค่าเริ่มต้น:


add_filter( 'login_redirect', 'redirect_user_on_login' );
ฟังก์ชัน redirect_user_on_login ($redirect_to) {
กลับบ้าน_url();
}

หลังจากที่คุณเพิ่มข้อมูลนี้ คุณจะทราบได้อย่างรวดเร็วว่าในฐานะผู้ดูแลระบบ คุณต้องการให้ไปที่แดชบอร์ด WP แทนหน้าแรกโดยตรง ไม่ใช่ปัญหา คุณเพียงแค่แก้ไข hook ให้ทำงานสำหรับผู้ดูแลระบบเท่านั้น:


add_filter( 'login_redirect', 'redirect_user_on_login', 10, 3 );
ฟังก์ชัน redirect_user_on_login( $redirect_to, $request, $user ) {
// เปลี่ยน URL ล็อกอินเว้นแต่ผู้ใช้จะเป็นผู้ดูแลระบบ
if ( isset( $user->roles ) && is_array( $user->roles ) ) {
if ( in_array( 'administrator', $user->roles ) ) {
คืนค่า $redirect_to; // เปลี่ยนเส้นทางผู้ดูแลระบบเป็นค่าเริ่มต้น (พื้นที่ผู้ดูแลระบบ)
}
}

คืนค่า $redirect_to;
}

สังเกตว่า $priority และ $arguments เข้ามามีบทบาทแล้ว!

เนื่องจากคุณต้องเข้าถึงอาร์กิวเมนต์ที่สามของ hook เพื่อตรวจสอบระดับของผู้ใช้ คุณต้องแสดง 3 อาร์กิวเมนต์ คุณผ่านค่า 3

มูลค่า $ ลำดับความสำคัญของ 10 เป็นเช่นเดียวกับการเริ่มต้นของหลักสูตร แต่ถูกระบุไว้ในคำสั่งไปถึงมูลค่า $ ข้อโต้แย้งที่คุณจำเป็นดังกล่าวข้างต้น

สร้างตะขอของคุณเอง

พลังในการสร้างตะขอแบบกำหนดเองอยู่ในมือคุณ! ฟังก์ชันที่ WP จัดเตรียมไว้ให้มีลักษณะดังนี้:

do_action( $hook_name, $arg_1, $arg_2 … $arg_n );

apply_filters( $hook_name, $arg_1, $arg_2 … $arg_n );

อีกครั้งพวกเขาคล้ายกัน ทั้งสองฟังก์ชั่นยอมรับชื่อ – นี่คือที่ที่คุณตั้งชื่อเบ็ด อาร์กิวเมนต์ต่อไปนี้ทั้งหมดเป็นอาร์กิวเมนต์เดียวกันกับฟังก์ชันที่คุณเพิ่มในเบ็ดนั้น apply_filters() ต้องมีอาร์กิวเมนต์เพิ่มเติมอย่างน้อยหนึ่งอาร์กิวเมนต์ (อาร์กิวเมนต์ที่กำลังถูกกรอง) แต่อาร์กิวเมนต์อื่นๆ ทั้งหมดเป็นทางเลือก

ตัวอย่างเช่น หากคุณต้องการแทรกสคริปต์การวิเคราะห์ก่อนแท็กเปิดเนื้อหา แต่ไม่ต้องการเปลี่ยน header.php ให้ยุ่งเหยิง:


<?php do_action( 'before_body_tag' ); ?;>
</head>
<body>

จากนั้นคุณสามารถเพิ่มสคริปต์ได้มากเท่าที่คุณต้องการ:


add_action( 'before_body_tag', 'add_analytics_custom' );
ฟังก์ชัน add_analytics_custom() {
// <script> แท็กและโค้ดการวิเคราะห์ไปที่นี่
}

apply_filters() ทำงานแตกต่างกันเล็กน้อย ตามที่กล่าวไว้ข้างต้น ตัวกรองใช้เพื่อแก้ไขค่า เนื่องจากตัวกรองส่งคืนค่า คุณจึงกำหนดให้การ เรียกใช้ apply_filters() ของคุณ เป็นตัวแปร:


<?php $text = apply_filters( 'call_to_action_text', 'เกี่ยวกับเรา' ); ?>
<a href=”<?php echo get_permalink( 'เกี่ยวกับ' ); ?>” class=”button cta”>
<?php echo $text; ?>
</a>

// หรือคุณสามารถสะท้อนผลลัพธ์ของ apply_filters() ได้โดยตรง
<a href=”<?php echo get_permalink( 'เกี่ยวกับ' ); ?>” class=”button cta”>
<?php echo apply_filters( 'call_to_action_text', 'เกี่ยวกับเรา' ); ?>
</a>

จากนั้น คุณสามารถแก้ไขตัวแปรที่กรองตามความจำเป็น:


add_filter( 'call_to_action_text', 'change_call_to_action_text' );
ฟังก์ชัน change_call_to_action_text( $text ) {
ถ้า ( is_front_page() ) {
$text = 'ค้นพบเพิ่มเติม';
}

ส่งคืนข้อความ $;
}

ข้อเสีย

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

นอกจากนี้ เนื่องจาก hooks สามารถอยู่ที่ใดก็ได้ภายในโครงสร้างไดเร็กทอรี WP การค้นหาตรรกะบางอย่างจึงเป็นเรื่องยากในบางครั้ง สิ่งนี้สามารถชดเชยได้โดยแยกฟังก์ชั่น hooks ของคุณออกเป็นไฟล์ของตัวเอง

คำแนะนำเพิ่มเติม

  • เมื่อสร้างฟังก์ชันสำหรับ hooks ตรวจสอบให้แน่ใจว่าชื่อไม่ซ้ำกัน ไม่เช่นนั้นจะเกิดข้อขัดแย้งขึ้น เช่นเดียวกับตะขอและชื่อตัวกรองที่กำหนดเองของคุณ!
  • ใช้ตะขอเพื่อให้แม่แบบของคุณไม่รก ไม่กี่ do_action ทั่วไป () ตะขอแทรกตลอดทั้งแม่ของคุณจะช่วยตรรกะเก็บให้ห่างจากมาร์กอัป (เกือบเสมอความคิดที่ดี)
  • เมื่อคุณติดตั้งปลั๊กอินใหม่ ให้ตรวจดูว่ามีขอเกี่ยวอะไรบ้างและพิจารณาว่าคุณจะใช้งานมันอย่างไร นี้จะเป็นประโยชน์อย่างยิ่งสำหรับช่วงเวลาที่หลีกเลี่ยงไม่ได้ที่ปลั๊กอินไม่มากทำในสิ่งที่คุณต้องการ
  • เมื่อเพิ่มการดำเนินการหรือตัวกรอง คุณสามารถแทนที่ชื่อฟังก์ชันด้วยตัวฟังก์ชันเองได้ สิ่งนี้สามารถช่วยให้การกระทำและตัวกรองมีอยู่ในตัวเอง ฟังก์ชันที่เพิ่มด้วยวิธีนี้ไม่สามารถลบออกได้โดยใช้ remove_action() หรือ remove_filter() ดังนั้นโปรดระวัง!

add_action ( 'where_to_do_the_thing', ฟังก์ชัน () {
echo 'งานเสร็จแล้ว';
}, 10, 1 );
  • ตรวจสอบฟังก์ชั่นอื่น ๆ ที่เกี่ยวข้องกับเบ็ดใช้ได้เช่น did_action () หรือ has_action () คุณไม่มีทางรู้หรอกว่าการรู้ตัวเมื่อไรจะมีประโยชน์

สรุป

การใช้ตะขอเป็นเรื่องของนิสัย ลองถามตัวเองสองคำถามง่ายๆ ทุกครั้งที่คุณทำงานในโครงการ WP ของคุณ:

  1. “มีตะขอที่จะช่วยให้ฉันง่ายขึ้นไหม”
  2. “ฉันขอเพิ่มเบ็ดที่จะทำให้สิ่งนี้ง่ายขึ้นสำหรับอนาคตของฉันได้ไหม”

เมื่อคุณเข้าใกล้การพัฒนา WP ด้วยทัศนคตินี้ คุณจะพบกับประตูหลายบานที่เปิดออก

ตัวอย่างในคู่มือนี้คือส่วนยอดของภูเขาน้ำแข็ง มีเบ็ดหลายร้อยตัวใน WP core เพียงอย่างเดียว ไม่ต้องพูดถึงไลบรารีขนาดใหญ่ของปลั๊กอินและธีม มีลักษณะที่อ้างอิงการกระทำ WP และอ้างอิงกรองสำหรับรายการเต็มรูปแบบของ WP ตะขอหลัก


หากคุณต้องการความช่วยเหลือเกี่ยวกับการพัฒนาเว็บ อย่าลังเลที่จะติดต่อเรา