คอมพิวเตอร์ Windows อินเทอร์เน็ต

คลั่งไคล้การกระทำ 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 พิเศษที่มีองค์ประกอบอินพุตต่างๆ - กล่องข้อความ ปุ่ม และอื่นๆ และด้วยความช่วยเหลือของข้อมูลแบบฟอร์ม เราสามารถป้อนข้อมูลบางส่วนและส่งไปยังเซิร์ฟเวอร์ และเซิร์ฟเวอร์กำลังประมวลผลข้อมูลนี้อยู่แล้ว

การสร้างแบบฟอร์มประกอบด้วยลักษณะต่อไปนี้:

    การสร้างองค์ประกอบ

    ในมาร์กอัป HTML

    การเพิ่มช่องป้อนข้อมูลอย่างน้อยหนึ่งช่องในองค์ประกอบนี้

    การตั้งค่าวิธีการถ่ายโอนข้อมูล: GET หรือ POST

    การตั้งค่าที่อยู่ที่จะส่งข้อมูลที่ป้อน

มาสร้างรูปร่างใหม่กันเถอะ ในการทำเช่นนี้ เราจะกำหนดไฟล์ใหม่ form.php ซึ่งเราจะใส่เนื้อหาต่อไปนี้:

เข้าสู่เว็บไซต์

เข้าสู่ระบบ:

รหัสผ่าน:

แอ็ตทริบิวต์ 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ด้วยวิธีต่อไปนี้:

รหัสผ่านของคุณ: $ password ";)?>

เข้าสู่เว็บไซต์

เข้าสู่ระบบ:

รหัสผ่าน:

ความปลอดภัยของข้อมูล

ความปลอดภัยของข้อมูลมีความสำคัญมากใน 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 นั้นง่ายมาก:

  1. ทำเครื่องหมายตำแหน่งที่ควรดำเนินการโดยใช้เบ็ดการดำเนินการพร้อมพารามิเตอร์ที่จำเป็น
  2. สร้างฟังก์ชันที่จะทำการดำเนินการที่จำเป็นโดยใช้พารามิเตอร์ที่ส่งผ่านโดย hook
  3. ลงทะเบียนเหตุการณ์ที่จะดำเนินการเมื่อมีการทริกเกอร์ hook โดยมีลำดับความสำคัญเฉพาะ
  4. เมื่อ 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 () (เสียงก้อง "

สวัสดี ฉันเป็นคนแจ้งความเอง
";) add_action (" 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. รับอย่างน้อย 1 อาร์กิวเมนต์;
  2. ส่งกลับค่าที่แก้ไข
add_filter (แท็ก $, $ function_to_add, $ ลำดับความสำคัญ, $ accept_args);

ฟังก์ชัน '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-> คำอธิบาย) ; $ ออก = "

"; $ ออก ="
นี่คือแขกโพสต์โดย ($ ชื่อ)
"; $ ออก ="
($ desc)
"; 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

รหัส ดำเนินการ: wp-includes / plugin.php WP 5.2.2

do_action ($ args); array_pop ($ wp_current_filter); )