คลั่งไคล้การกระทำ php PHP และแบบฟอร์ม จุดไม่ดีที่เกี่ยวข้องกับตัวแปร PHP _SELF
“อย่าใช้คำสั่ง goto”- ครูที่สถาบันการศึกษาบอกเรา และที่จริง เจ้าหน้าที่คนนี้เปลี่ยนรหัสให้ยุ่งเหยิงไปหมด นักพัฒนา php ได้แก้ไขปัญหาอย่างรุนแรง - ใน php3 และ php4 มันไม่มีอยู่จริง ในตอนแรกพวกเขาได้รับคำแนะนำจากอะไร? บางทีพวกเขาต้องการปลูกฝังรูปแบบการเขียนโปรแกรมที่ถูกต้องให้กับพวกเราทุกคน? เราสามารถพูดได้ว่าพวกเขาประสบความสำเร็จค่อนข้างดี - เราทุกคนคุ้นเคยกับมันนั่นคือมันแม่นยำกว่าที่จะบอกว่าเราสูญเสียนิสัยของโอเปอเรเตอร์นี้ไปโดยสิ้นเชิงบางทีมันอาจจะดีกว่าเพราะครั้งหนึ่งฉันมี เพื่อสร้างโครงสร้างเชิงตรรกะที่ชดเชยความโชคร้ายที่สุดนี้ได้อย่างสมบูรณ์ ไปที่.
ฉันไม่รู้ว่าใครเป็นอย่างไรบ้าง แต่ฉันมักมีความปรารถนาที่จะใช้ goto เมื่อสร้างตัวจัดการแบบฟอร์ม html เมื่อมีการส่งข้อมูลจำนวนมากจากผู้ใช้ไปยังเซิร์ฟเวอร์ซึ่ง สคริปต์ phpควรตรวจสอบทีละขั้นตอน ตามกฎแล้วกระบวนการนี้เกิดขึ้นในหลายขั้นตอน: การพิมพ์แบบฟอร์มเองการตรวจสอบข้อมูลที่ได้รับการแสดงเบื้องต้นและตัวอย่างเช่นการบันทึก นอกจากนี้ บางขั้นตอนอาจทำซ้ำได้: หากการตรวจสอบข้อมูลไม่ผ่าน เราไปพิมพ์แบบฟอร์ม หรือหากการแสดงตัวอย่างไม่เหมาะกับผู้ใช้ เขาสามารถกลับไปป้อนข้อมูลได้ กล่าวโดยย่อ โค้ดบางโค้ดสามารถใช้ได้หลายครั้ง การใช้ฟังก์ชันในเงื่อนไขเหล่านี้ไม่สะดวกเช่นกัน - มีตัวแปรอินพุตและเอาต์พุตจำนวนมาก ฟังก์ชันต้องดำเนินการที่ซับซ้อนเกินไป โดยทั่วไปจะกลายเป็นเงอะงะและความสามารถในการอ่านโค้ดลดลงอย่างรวดเร็ว
และฉันก็ได้ออกแบบดังกล่าว
ทำ ( สวิตช์ ($ การกระทำ) ( ค่าเริ่มต้น: หยุดพัก; กรณี "PRINT_FORM": เราพิมพ์แบบฟอร์มหลัก หยุดพัก; กรณี "CHECK_FORM": การตรวจสอบความถูกต้องของข้อมูล หยุดพัก; กรณี "PREVIEW_FORM": ดูตัวอย่าง หยุดพัก; กรณี "SAVE_FORM": เราบันทึกข้อมูล หยุดพัก; ) ในขณะที่ (จริง); |
ที่นี่ตัวดำเนินการปรนัยหลักคือ สวิตซ์อยู่ในวงวนไม่สิ้นสุด ทำในขณะที่- ด้วยวิธีนี้เราจัดกลุ่มการกระทำที่จำเป็นในส่วนต่างๆ กรณี: แตก;และเราสามารถไปจากส่วนหนึ่งไปอีกส่วนหนึ่งได้ไม่มีกำหนด ในส่วน ค่าเริ่มต้น:จะทำการแยกวิเคราะห์ข้อมูลเบื้องต้นได้สะดวก เช่น หากไม่มีข้อมูลเข้า $ การกระทำ = 'PRINT_FORM'เราพิมพ์แบบฟอร์มถ้ามีตัวอย่างเช่น $ _POST ['ส่ง']จากนั้นเราจะส่งข้อมูลที่ได้รับสำหรับการประมวลผล $ การกระทำ = 'CHECK_FORM'... การถ่ายโอนการควบคุมระหว่างบล็อคสวิตช์เกิดขึ้นโดยการเปลี่ยนตัวแปร $ การกระทำ, ออกจากลูปด้วย แตก 2; หรือทางออก;
ตัวอย่างเช่น ในบล็อกการพิมพ์ของแบบฟอร์มหลัก คุณสามารถใส่ได้อย่างปลอดภัย แตก 2;เพราะผลลัพธ์ของแบบฟอร์มสันนิษฐานว่าสิ้นสุดสคริปต์
การออกแบบมีความยืดหยุ่นสูงและอ่านง่าย แต่มีข้อเสียอย่างหนึ่งคือ หากข้อมูลได้รับการประมวลผลอย่างไม่ถูกต้อง คุณสามารถเข้าสู่การวนซ้ำไม่รู้จบและสคริปต์ค้าง - ไม่เป็นที่พอใจที่จะต้องรอนานถึง 30 วินาที
มากำหนดขีดจำกัดจำนวนรอบของตัวดำเนินการกันเถอะ ทำในขณะที่, 20 ก็เพียงพอแล้วกับหัวของคุณ ตอนนี้ ถ้าเราได้เพิ่มอะไรลงไป สคริปต์จะหมุน 20 รอบ หยุดและโยนคำเตือนการหยุดฉุกเฉินออก
สะดวกในการดีบักโครงสร้างดังกล่าว - เพียงพอหลังจากโอเปอเรเตอร์ สวิตช์พิมพ์ตัวแปร $ action และเราได้รับลำดับที่สมบูรณ์ของการดำเนินการบล็อก
DO (// ที่จุดเริ่มต้นของแต่ละรอบเราพิมพ์ชื่อ // ของส่วนที่ดำเนินการสะดวกมากสำหรับการดีบัก echo $ action ""; SWITCH ($ action) (ค่าเริ่มต้น: break; case "PRINT_FORM": / * print the main form * / break; case "CHECK_FORM": / * ตรวจสอบว่าข้อมูลถูกต้องหรือไม่ * / break; case "PREVIEW_FORM": / * preview * / break ; case "SAVE_FORM": / * บันทึกข้อมูล * / break;) // end switch) WHILE ((($ i ++)< 20) or die("Принудительный останов цикла"));
ทำ ( // ที่จุดเริ่มต้นของแต่ละรอบเราพิมพ์ชื่อ // ส่วนการดำเนินการสะดวกมากสำหรับการดีบัก การกระทำสะท้อน $ "";< / strong > สวิตซ์ ($ การกระทำ) ( ค่าเริ่มต้น: หยุดพัก; กรณี "PRINT_FORM": เราพิมพ์แบบฟอร์มหลัก หยุดพัก; |
ปรับปรุงล่าสุด: 1.11.2015
การประมวลผลแบบฟอร์มเป็นวิธีหลักวิธีหนึ่งในการส่งข้อมูลไปยังเว็บไซต์ ฟอร์มเป็นองค์ประกอบมาร์กอัป HTML พิเศษที่มีองค์ประกอบอินพุตต่างๆ - กล่องข้อความ ปุ่ม และอื่นๆ และด้วยความช่วยเหลือของข้อมูลแบบฟอร์ม เราสามารถป้อนข้อมูลบางส่วนและส่งไปยังเซิร์ฟเวอร์ และเซิร์ฟเวอร์กำลังประมวลผลข้อมูลนี้อยู่แล้ว
การสร้างแบบฟอร์มประกอบด้วยลักษณะต่อไปนี้:
การสร้างองค์ประกอบ
แอ็ตทริบิวต์ action = "login.php" ขององค์ประกอบแบบฟอร์มระบุว่าข้อมูลในแบบฟอร์มจะถูกประมวลผลโดยสคริปต์ เข้าสู่ระบบ.phpซึ่งจะอยู่กับไฟล์ form.phpในโฟลเดอร์เดียว และแอตทริบิวต์ method = "POST" ระบุว่าวิธี POST จะใช้เป็นวิธีการถ่ายโอนข้อมูล
มาสร้างไฟล์กัน เข้าสู่ระบบ.phpซึ่งจะมีเนื้อหาดังนี้
รหัสผ่านของคุณ: $ password ";?>
ตัวแปรส่วนกลาง $ _POST ใช้เพื่อรับข้อมูลแบบฟอร์ม มันแสดงถึงอาร์เรย์ที่เชื่อมโยงของข้อมูลที่ส่งโดยใช้วิธี POST ด้วยการใช้กุญแจ เราสามารถรับค่าที่ส่งได้ คีย์ในอาร์เรย์นี้คือค่าของแอตทริบิวต์ชื่อของช่องป้อนแบบฟอร์ม
เนื่องจากแอตทริบิวต์ชื่อของช่องป้อนข้อมูลการเข้าสู่ระบบคือการเข้าสู่ระบบ ( ) จากนั้นในอาร์เรย์ $ _POST ค่าของฟิลด์นี้จะแสดงคีย์ "login": $ _POST ["login"]
และเนื่องจากมีบางสถานการณ์ที่ฟิลด์อินพุตจะไม่ถูกตั้งค่า เช่น เมื่อคุณไปที่สคริปต์โดยตรง: http: // localhost: 8080 / login.php... ในกรณีนี้ ขอแนะนำให้ตรวจสอบความพร้อมใช้งานของข้อมูลโดยใช้ฟังก์ชัน isset () ก่อนประมวลผลข้อมูล และหากตัวแปรถูกตั้งค่าไว้ ฟังก์ชัน isset () จะคืนค่าเป็นจริง
ตอนนี้เราสามารถเปลี่ยนเป็นแบบฟอร์ม:
และเมื่อกดปุ่ม ข้อมูลที่ป้อน โดยวิธี POSTจะถูกส่งไปยังสคริปต์ เข้าสู่ระบบ.php:
คุณไม่จำเป็นต้องส่งข้อมูลแบบฟอร์มไปยังสคริปต์อื่น คุณสามารถประมวลผลข้อมูลในแบบฟอร์มในไฟล์แบบฟอร์มเดียวกันได้ ในการทำเช่นนี้เราจะเปลี่ยนไฟล์ form.phpด้วยวิธีต่อไปนี้:
เข้าสู่เว็บไซต์
ความปลอดภัยของข้อมูล
ความปลอดภัยของข้อมูลมีความสำคัญมากใน PHP มาดูกลไกง่ายๆ สองสามอย่างที่สามารถปรับปรุงความปลอดภัยของเว็บไซต์ของเรากันดีกว่า
แต่ก่อนอื่น ให้นำแบบฟอร์มจากหัวข้อก่อนหน้าแล้วลองป้อนข้อมูลบางอย่างลงไป ตัวอย่างเช่น ให้ป้อนในช่องเข้าสู่ระบบ "" และในช่องรหัสผ่านจะมีข้อความ"
รหัสผ่าน
":หลังจากส่งข้อมูลไปยังมาร์กอัป html แล้ว โค้ดจาวาสคริปต์จะถูกฉีด ซึ่งจะแสดงกล่องข้อความ
เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัยประเภทนี้ ให้ใช้ฟังก์ชัน htmlentities ():
If (isset ($ _ POST ["login"]) && isset ($ _ POST ["password"])) ($ เข้าสู่ระบบ = htmlentities ($ _ POST ["login"]); $ password = htmlentities ($ _ POST ["รหัสผ่าน" ]); echo "ข้อมูลเข้าสู่ระบบของคุณ: $ login
รหัสผ่านของคุณ: $ รหัสผ่าน ";)
และแม้กระทั่งหลังจากพิมพ์ โค้ด htmlหรือจาวาสคริปต์แท็กทั้งหมดจะถูก Escape และเราได้รับผลลัพธ์ต่อไปนี้:
อีกคุณสมบัติหนึ่งคือ ฟังก์ชัน strip_tags () ช่วยให้คุณสามารถดึงแท็ก html ออกได้อย่างสมบูรณ์:
If (isset ($ _ POST ["login"]) && isset ($ _ POST ["password"])) ($ login = strip_tags ($ _ POST ["login"]); $ password = strip_tags ($ _ POST ["รหัสผ่าน" ]); echo "ข้อมูลเข้าสู่ระบบของคุณ: $ login
รหัสผ่านของคุณ: $ รหัสผ่าน ";)
ผลลัพธ์ของการทำงานกับอินพุตเดียวกันจะเป็นผลลัพธ์ต่อไปนี้
24.6Kไม่ใช่ความลับสำหรับทุกคนที่วิธีการโต้ตอบทั่วไปที่สุดของหน้า html กับไซต์คือรูปแบบ แบบฟอร์ม (นั่นคือองค์ประกอบ html ที่เกิดจากแท็กแบบฟอร์ม) ยังถูกใช้โดยบริการไปรษณีย์ฟรี ร้านค้าอิเล็กทรอนิกส์ และไซต์ประเภทอื่นๆ อีกมากมาย
การประมวลผลแบบฟอร์มอย่างง่ายด้วย PHP นั้นง่ายมาก อย่างไรก็ตาม ในบางครั้ง มีความจำเป็นต้องประมวลผลแบบฟอร์มที่มีฟิลด์ประเภทเดียวกันหลายฟิลด์ ยิ่งไปกว่านั้น หมายเลขของแบบฟอร์มอาจแตกต่างกันไปในวงกว้าง และไม่ทราบหมายเลขล่วงหน้า PHP จัดให้มีการประมวลผลกรณีดังกล่าวของฟิลด์ประเภทเดียวกันกับอาร์เรย์ของค่า
พิจารณารายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกสำหรับ ประเภทต่างๆฟิลด์
ช่องข้อความ
ฟิลด์ข้อความในบทความนี้อ้างอิงถึงองค์ประกอบที่สร้างโดยแท็กอินพุตที่มีพารามิเตอร์ประเภทข้อความและแท็ก textarea เป็นการง่ายที่สุดในการจัดระเบียบการประมวลผลของแบบฟอร์มที่ประกอบด้วยหลายฟิลด์ดังกล่าว รายการด้านล่างแสดงรายการที่มีมาร์กอัป html สำหรับแบบฟอร์มดังกล่าว
ดังที่คุณเห็นจากรายการ ชื่อขององค์ประกอบแบบฟอร์ม จากมุมมองของ PHP เป็นองค์ประกอบอาร์เรย์ ดังนั้น สคริปต์ PHP ที่จะประมวลผลแบบฟอร์มนี้จะถือว่าฟิลด์ข้อความทั้งชุดในแบบฟอร์มนั้นเป็นอาร์เรย์เดียว องค์ประกอบแต่ละรายการสามารถอ้างอิงได้ด้วยดัชนีหรือระบุโดยใช้รายการและแต่ละคำสั่ง ดังตัวอย่างต่อไปนี้
น ";?>
สวิตช์
ช่องทำเครื่องหมายในบทความนี้เป็นองค์ประกอบที่สร้างโดยแท็กอินพุตที่มีพารามิเตอร์ประเภทเท่ากับช่องทำเครื่องหมาย แบบฟอร์มการใช้หมายเลขตัวแปรของ "สวิตช์" สร้างขึ้นในลักษณะเดียวกันทุกประการ โปรดทราบว่าการเลือกค่าปุ่มตัวเลือกเฉพาะ (นั่นคือ ค่าของคุณสมบัติค่า) ไม่สำคัญ ตัวอย่างแสดงในรายการด้านล่าง:
อย่างไรก็ตาม การประมวลผลแบบฟอร์มดังกล่าวจะแตกต่างจากการประมวลผลที่อธิบายไว้สำหรับฟิลด์ข้อความ ในกรณีนี้ จำเป็นต้องพิจารณาว่าผู้เยี่ยมชมไซต์ได้เปิดสวิตช์นี้หรือสวิตช์นั้นหรือไม่ หากเปิดใช้งาน องค์ประกอบที่สอดคล้องกันของอาร์เรย์จะมีอยู่ หากไม่มี แสดงว่าไม่มีองค์ประกอบดังกล่าว รายการต่อไปนี้แสดงตัวอย่างสคริปต์ PHP ที่พิมพ์สวิตช์ที่เปิดใช้งาน:
ปุ่มตัวเลือก
ก่อนอธิบายการประมวลผลปุ่มตัวเลือก คุณต้องจำไว้ว่ามันทำงานอย่างไร สาระสำคัญของปุ่มตัวเลือก (องค์ประกอบที่สร้างโดยแท็กอินพุตที่มีค่าของพารามิเตอร์ประเภทเท่ากับวิทยุ) คือโดยการเลือกปุ่มหนึ่งปุ่ม ผู้ใช้จะยกเลิกการเลือกปุ่มอื่นจากชุดเดียวกันโดยอัตโนมัติ การรวมปุ่มต่างๆ ไว้ในชุดนั้นง่ายมาก: ปุ่มทั้งหมดในชุดมีชื่อเดียวกัน
แต่ค่า (นั่นคือ ค่าพารามิเตอร์) ของปุ่มในชุดต่างกัน และค่าของปุ่มที่เลือกพร้อมกับชื่อของชุดจะถูกส่งไปยังไซต์ เช่นเดียวกับช่องข้อความและปุ่มตัวเลือก ชื่อชุดปุ่มตัวเลือกต้องจัดรูปแบบเป็นชื่อองค์ประกอบอาร์เรย์ใน PHP ตัวอย่างของแบบฟอร์มดังกล่าวแสดงในรายการต่อไปนี้:
การประมวลผลปุ่มตัวเลือกจะรวมแนวคิดเข้าด้วยกัน โดยใช้ทั้งช่องข้อความและปุ่มตัวเลือกในการประมวลผล หากผู้เขียนหน้า html ไม่ได้ตั้งค่าเริ่มต้น และผู้ใช้ไม่ได้เลือกปุ่มเฉพาะในชุดปุ่มตัวเลือก องค์ประกอบนี้จะไม่ปรากฏในอาร์เรย์ (สำหรับปุ่มตัวเลือก)
เราได้สร้างรากฐานสำหรับปลั๊กอินในอนาคตที่รู้จัก ระบบเวิร์ดเพรส... วันนี้เราจะจัดการกับการเปลี่ยนแปลงฟังก์ชันพื้นฐานของระบบโดยตรง
ระบบของ hooks การกระทำและตัวกรองจะช่วยเราได้ แนวคิดทั้งสามนี้เป็นหัวใจสำคัญของปลั๊กอิน WordPress ทุกตัว
ตะขอ
มี hooks สองประเภทใน WordPress:
- ตะขอแอคชั่น:ทำเครื่องหมายตำแหน่งในโค้ดที่ดำเนินการบางอย่าง เช่น คุณต้องป้อนข้อมูลบางส่วนและบันทึกไว้ในฐานข้อมูล
- ตะขอกรอง:ทำเครื่องหมายตัวกรองซึ่งจะเปลี่ยนค่าใด ๆ (ตัวแปร) เพื่อให้โค้ดใช้ค่าที่แก้ไขในอนาคต
การกระทำ
การทำงานกับเหตุการณ์ (การกระทำ)
ตรรกะทั่วไปในการจัดการกิจกรรมใน WordPress นั้นง่ายมาก:
- ทำเครื่องหมายตำแหน่งที่ควรดำเนินการโดยใช้เบ็ดการดำเนินการพร้อมพารามิเตอร์ที่จำเป็น
- สร้างฟังก์ชันที่จะทำการดำเนินการที่จำเป็นโดยใช้พารามิเตอร์ที่ส่งผ่านโดย hook
- ลงทะเบียนเหตุการณ์ที่จะดำเนินการเมื่อมีการทริกเกอร์ hook โดยมีลำดับความสำคัญเฉพาะ
- เมื่อ WordPress โหลดหน้าและพบ hook ระบบจะดำเนินการฟังก์ชั่นทั้งหมดที่ลงทะเบียนกับ hook นั้น
ในการดำเนินการขั้นตอนแรก ระบบจะจัดเตรียมฟังก์ชัน 'do_action':
Do_action (แท็ก $, $ arg_1, $ arg_2, ..., $ arg_n);
ยอมรับอาร์กิวเมนต์ต่อไปนี้: $ tag - ชื่อของ "hook", $ arg_1, $ arg_2,…, $ arg_n - พารามิเตอร์ที่จะเรียกใช้ฟังก์ชัน สามารถมีอาร์กิวเมนต์จำนวนเท่าใดก็ได้หรือ 0
ระบบมี hooks ที่กำหนดไว้แล้ว:
Do_action ("เริ่มต้น");
นี่เป็นตัวอย่างง่ายๆ โดยไม่มีข้อโต้แย้งเพิ่มเติม data hook จะทำงานเมื่อระบบส่วนใหญ่ได้รับการกำหนดค่าแล้ว และถึงเวลาสร้างวัตถุ หมวดหมู่ โพสต์ ฯลฯ ของคุณเอง
Do_action ("save_post", $ post_id, $ โพสต์);
ในตัวอย่างนี้ hook จะถูกทริกเกอร์เมื่อมีการบันทึกโพสต์ด้วยสองอาร์กิวเมนต์ post_id - ID โพสต์และโพสต์ - ตัวโพสต์เอง
การสร้าง Hook มีให้สำหรับนักพัฒนาทุกคนเพื่อสร้างปลั๊กอิน (หรือธีม) ของตนเอง สิ่งนี้ทำให้เรามีเครื่องมืออันทรงพลังสำหรับจัดการพฤติกรรมของระบบ
Do_action ("my_truly_custom_hook");
เมื่อเราสร้าง hook และเขียนฟังก์ชันแล้ว เราต้องลงทะเบียนฟังก์ชันด้วย "add_action"
Add_action (แท็ก $, $ function_to_add, $ ลำดับความสำคัญ, $ accept_args_number);
ฟังก์ชัน 'add_action' ใช้พารามิเตอร์ที่จำเป็นสองค่า: แท็ก $: ชื่อของ hook ที่เกี่ยวข้อง และ $ function_to_add: ชื่อของฟังก์ชันที่จะเรียก อีกสองพารามิเตอร์เป็นทางเลือก: $ ลำดับความสำคัญ: ตัวแปรจำนวนเต็มที่กำหนดลำดับการทำงานของฟังก์ชัน (ค่าเริ่มต้นคือ 10), $ reserved_args_number: จำนวนอาร์กิวเมนต์ที่ฟังก์ชันยอมรับ (ค่าเริ่มต้นคือ 1)
มาดูตัวอย่างเพื่อทำความเข้าใจกระบวนการทั้งหมด สมมติว่าเราต้องการเพิ่มประกาศเล็กน้อยที่ด้านล่างของไซต์ของเรา เราสามารถใช้เบ็ด "wp_footer" ได้เพราะเป็นส่วนที่จำเป็นของโค้ดที่ทุกธีมใช้
ฟังก์ชัน msp_helloworld_footer_notice () (เสียงก้อง "
ในตัวอย่างนี้ เราได้สร้างฟังก์ชันที่เพียงแค่ส่งออกมาร์กอัปสำหรับการแจ้งเตือนและลงทะเบียนใน 'wp_footer' ทันทีที่เราเพิ่มโค้ดนี้ลงในไฟล์ปลั๊กอินของเรา (ดูไฟล์ก่อนหน้า) เราจะเห็นผลลัพธ์ในหน้า:
การแจ้งเตือนปลั๊กอิน WordPress
การทำงานกับตัวกรอง
ตัวกรองทำงานในลักษณะเดียวกับเหตุการณ์ แต่ตัวกรองไม่เพียงแค่รันโค้ดบางโค้ดเท่านั้น แต่ยังปรับเปลี่ยนค่าที่ hook ส่งมาให้อีกด้วย ซึ่งหมายความว่าแต่ละตัวกรองมีค่าที่เกี่ยวข้อง (ตัวแปร) ที่ทำงานอยู่
ฟังก์ชันตัวกรองจะใช้ค่านี้และแปลงค่าเพื่อใช้ในภายหลัง ขอเกี่ยวกรองจะต่างจากขอเกี่ยวเล็กน้อย
Apply_filters (แท็ก $, $ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n);
ฟังก์ชัน 'apply_filter' สร้าง hook สำหรับตัวกรองชื่อ $ tag และพารามิเตอร์ที่จำเป็น $ value_to_filter (เว้นว่างได้ แต่ต้องประกาศ) อาร์กิวเมนต์ทางเลือกที่เหลือทำงานเหมือนกับเหตุการณ์
Filter_function ($ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n) (// filter return $ value_to_filter; // ต้องคืนค่า)
นี่คือโครงร่างตัวกรองที่แสดงให้เห็นว่าตัวกรองควร:
- รับอย่างน้อย 1 อาร์กิวเมนต์;
- ส่งกลับค่าที่แก้ไข
ฟังก์ชัน 'add_filter' จะลงทะเบียนฟังก์ชันที่มีชื่ออยู่ใน $ function_to_add สำหรับ $ tag hook อาร์กิวเมนต์ที่เหลือ - $ priority และ $ accept_args - ทำงานในลักษณะเดียวกับ event hooks
ตัวอย่างเช่น งานปลั๊กอินทั่วไปคือการเพิ่มบางอย่างที่ส่วนท้ายของโพสต์ หากเราพิจารณาอย่างละเอียดถี่ถ้วนที่ฟังก์ชัน 'the_content' ซึ่งใช้เพื่อแสดงเนื้อหาโพสต์ เราจะพบเบ็ดดังนี้:
$ content = apply_filters ("the_content", $ เนื้อหา);
การใช้มันทำให้เราสามารถเพิ่มอะไรก็ได้ที่ส่วนท้ายของโพสต์
ฟังก์ชั่น msp_helloworld_post_footer ($ เนื้อหา) ($ เนื้อหา. = "
"; ส่งคืนเนื้อหา $;) add_filter (" the_content "," msp_helloworld_post_footer ", 100);โปรดทราบว่าเราใช้ลำดับความสำคัญจำนวนมากเพื่อให้แน่ใจว่าตัวกรองมาตรฐานทั้งหมดได้รับการประมวลผลก่อนที่จะดำเนินการ 'msp_helloworld_post_footer' หลังจากใส่โค้ดลงในปลั๊กอินแล้ว เราจะเห็นผลลัพธ์:
วิธีหาตะขอ
ตอนนี้เป็นที่ชัดเจนสำหรับเราว่าเพื่อดำเนินการบางอย่าง เราจำเป็นต้องรู้เกี่ยวกับตะขอที่มีอยู่
WordPress Codex มีรายการ hooks สำหรับตัวกรองและเหตุการณ์การอ้างอิงการดำเนินการและการอ้างอิงตัวกรอง
การดำเนินการเพิ่มเติมด้วยตะขอ
นอกเหนือจากการเพิ่ม ตะขอสามารถลบออกได้โดยใช้ไวยากรณ์ที่คล้ายกัน
คุณสามารถลบกิจกรรมเช่นนี้:
Remove_action (แท็ก $, $ function_to_remove, $ ลำดับความสำคัญ, $ accept_args); remove_all_actions (แท็ก $, $ ลำดับความสำคัญ);
ตามที่คุณอาจเดาได้ 'remove_action' จะลบเหตุการณ์เฉพาะที่ลงทะเบียนสำหรับ hook นี้ (คุณต้องระบุลำดับความสำคัญและจำนวนอาร์กิวเมนต์ให้ถูกต้อง ตามที่ระบุในระหว่างการลงทะเบียน) และ 'remove_all_actions' จะช่วยลบกิจกรรมทั้งหมดที่ลงทะเบียนสำหรับ hook (หากละเว้นลำดับความสำคัญ ฟังก์ชันจะลบเหตุการณ์ทั้งหมด)
ตัวกรองสามารถลบออกได้ด้วยวิธีเดียวกัน:
Remove_filter (แท็ก $, $ function_to_remove, $ ลำดับความสำคัญ, $ accept_args); remove_all_filters (แท็ก $, $ ลำดับความสำคัญ);
API ปลั๊กอินของ WordPress ยังมีฟังก์ชันสำหรับตรวจสอบว่ามีการลงทะเบียนฟังก์ชันสำหรับ hook ที่กำหนดหรือไม่:
Has_action ($ tag, $ function_to_check); has_filter (แท็ก $, $ function_to_check);
ฟังก์ชั่นทั้งสองตรวจสอบว่า ฟังก์ชั่นนี้สำหรับเบ็ดและกลับเป็นจริงในความสำเร็จมิฉะนั้นจะลุกเป็นไฟ ภายในฟังก์ชัน เราสามารถตรวจสอบว่า hook เรียกมันว่า:
ถ้า ("hook_to_check_name" === current_filter ()) ()
แม้ว่าชื่อ 'current_filter' จะใช้งานได้ไม่เฉพาะกับตัวกรองเท่านั้นแต่ยังใช้ได้กับเหตุการณ์ด้วย
ตัวอย่างที่ไม่สำคัญ
มาทำให้ "โครงกระดูก" ของปลั๊กอินเคลื่อนไหวกัน ซึ่งเราได้เตรียมเอาไว้ในบทเรียนที่แล้ว
มากรอกไฟล์ 'core.php' (ส่วนหลักของปลั๊กอินของเราซึ่งมีส่วนหลักของฟังก์ชัน) ด้วยโค้ดที่แก้ปัญหาที่อาจเกิดขึ้นจริงระหว่างการทำงาน เพื่อแก้ปัญหานี้ เราจะใช้การดำเนินการและตัวกรอง
ให้ไซต์ WordPress ของคุณรับโพสต์จากผู้เขียนหลายคนจากแขก แต่ไม่อนุญาตให้คุณสร้างบัญชี ซึ่งหมายความว่าผู้ใช้ที่เผยแพร่โพสต์และผู้เขียนที่แท้จริงเป็นคนละคนกัน และเราจำเป็นต้องตรวจสอบให้แน่ใจว่าผู้เขียนมีรายชื่ออยู่ในโพสต์ เราสามารถทำได้ด้วยอนุกรมวิธาน
มาสร้างอนุกรมวิธานของเราเองเพื่อจัดการกับชื่อผู้แต่งและประวัติโดยย่อ เราจะสามารถใช้ชื่อผู้เขียนได้เหมือนกับคำศัพท์อนุกรมวิธานอื่นๆ (เช่น แท็ก) ในโพสต์ รหัส:
/ ** ลงทะเบียนตัวกรองและกิจกรรม ** / function msp_helloworld_init () (add_action ("init", "msp_helloworld_taxonomies"); add_filter ("the_content", "msp_helloworld_author_block_filter"); add_filter ("post_class", "msp_hellow") addclass (" plugins_loaded", "msp_helloworld_init"); / ** อนุกรมวิธาน ** / function msp_helloworld_taxonomies () ($ args = array ("labels" => array ("name" => "Guest authors", "singular_name" => "Guest author"), "show_in_nav_menus" => เท็จ); register_taxonomy ("gauthor", อาร์เรย์ ("โพสต์"), $ args);) / ** มาร์กอัปของบล็อกผู้เขียน ** / ฟังก์ชัน msp_helloworld_author_block () (โพสต์ $ ทั่วโลก; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); ถ้า (ว่างเปล่า ($ author_terms)) ส่งคืน; $ name = stripslashes ($ author_terms-> ชื่อ); $ url = esc_url (get_term_link ($ author_terms)); $ desc = wp_filter_post_kses ($ author_terms-> คำอธิบาย) ; $ ออก = "
"; return $ out;) / ** เพิ่มมาร์กอัปที่ส่วนท้ายของโพสต์ ** / function msp_helloworld_author_block_filter ($ content) (if (is_single ()) $ content. = msp_helloworld_author_block (); return $ content;) / ** เพิ่มคลาส CSS ให้กับโพสต์ ** / function msp_helloworld_post_class ($ post_class) ( global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); if (! empty ($ author_terms)) ($ post_class = " gauthor";) คืนค่า $ post_class;)อย่างที่คุณเห็น เราได้สร้างฟังก์ชันเพื่อลงทะเบียนอนุกรมวิธานของเราเองและผูกไว้กับเบ็ด 'init' หลังจากนั้น เราได้สร้างเทมเพลตสำหรับแสดงบล็อกผู้เขียนโดยใช้ฟังก์ชัน "wp_get_object_terms" ของ WordPress จากนั้นเราก็แทรกบล็อกที่มีข้อมูลเกี่ยวกับผู้เขียนที่ส่วนท้ายของโพสต์โดยใช้ตัวกรอง "the_content" สุดท้าย เราได้เพิ่มคลาส CSS ของเราเอง ผลงาน:
สร้างเหตุการณ์ (เบ็ดสำหรับฟังก์ชั่นที่กำหนดเอง) สำหรับฟังก์ชันที่จะทริกเกอร์ในช่วงเวลาของเหตุการณ์ จะต้องเชื่อมต่อกับเหตุการณ์นี้โดยใช้ฟังก์ชัน add_action ()
นอกจากเหตุการณ์แล้ว WP ยังมีตัวกรองหลักการทำงานเหมือนกัน ข้อแตกต่างเพียงอย่างเดียวคือตัวกรองต้องส่งคืนตัวแปรผลลัพธ์ นั่นคือ มันกรอง (แก้ไข) ข้อมูล และเหตุการณ์อนุญาตให้ฟังก์ชันที่ผู้ใช้กำหนดเองทำงานเมื่อเหตุการณ์นี้เริ่มทำงาน ตัวกรองถูกเรียกใช้โดยฟังก์ชัน apply_filters ()
✈ 1 ครั้ง = 0.00007s = เร็วมาก| 50,000 ครั้ง = 0.03 วินาที = ความเร็วของแสง
ไม่มีตะขอ
คืนสินค้า
ไม่ส่งคืนอะไรเลย
การใช้งาน
do_action (แท็ก $, $ arg_a, $ arg_b, ...); $ tag (สตริง) (จำเป็น)ชื่อของเบ็ดที่จะสร้าง $ arg_a ค่าของอาร์กิวเมนต์ที่จะถูกส่งผ่าน$ arg_b (สตริง / อาร์เรย์ / หมายเลข / วัตถุ / บูลีน)ความหมายอีกหนึ่งข้อโต้แย้ง ...
ค่าเริ่มต้น: ไม่มีอาร์กิวเมนต์$ arg_с (สตริง / อาร์เรย์ / หมายเลข / วัตถุ / บูลีน)ฟังก์ชั่นสามารถส่งผ่านอาร์กิวเมนต์มากมายอนันต์ ...
ตัวอย่างของ
#1. ตัวอย่างการใช้งาน
ฟังก์ชันนี้สามารถใช้ในปลั๊กอิน ธีม ฯลฯ เมื่อจำเป็นต้องฉีดเข้าไปในกระบวนการเรียกใช้โค้ดจากที่อื่น ตัวอย่างเช่น เราติดตั้ง "hook" (do_action) ในปลั๊กอิน และเราจะ "ยึด" จากไฟล์ functions.php ในขณะที่ "hook" ทำงาน
สมมติว่าเราใช้โค้ดต่อไปนี้ในปลั๊กอิน:
ตอนนี้ เราสามารถดำเนินการบางอย่างได้ในขณะที่ฟังก์ชัน do_action ทำงาน และในขณะเดียวกัน เราสามารถอธิบายการกระทำของเราได้ เช่น จากไฟล์ functions.php โดยการวางโค้ดต่อไปนี้ลงไป:
ฟังก์ชัน do_my_hook ($ a, $ b) (// หากตัวแปรที่ส่งผ่าน $ a เป็นจริง // ตัวอย่างเช่น ลบรายการ 10 if ($ a === true) wp_delete_post (10); // และที่นี่ เราแค่แสดงตัวแปร echo "
" . $ b; // แสดงค่าของตัวแปรที่สอง) // ลงทะเบียน hook ผ่าน // add_action ( แท็ก $, $ function_to_add, $ ลำดับความสำคัญ, $ reserved_args); add_action (" my_hook "," do_my_hook ", 10, 2);
การดำเนินการต่างจากตัวกรองตรงที่ข้อมูลที่ส่งผ่านจากการกระทำนั้นจะไม่ถูกส่งกลับไปยังฟังก์ชันและไม่ได้ใช้งานที่นั่นในอนาคต แต่จะถูกส่งต่อเพื่อใช้ในฟังก์ชันของ hook