เราควรไว้วางใจโพสต์กลม


21

@toscho แสดงความคิดเห็นต่อคำตอบนี้ซึ่งทำให้ฉันคิดอีกครั้ง วิธีการไว้วางใจมากที่สุดเราควรจะมีในขอบเขตทั่วโลกโดยเฉพาะเกี่ยวกับการโพสต์ Globals เช่น$post?

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

$postเช่นเป็นหนึ่งใน globals ที่มีการปรับเปลี่ยนส่วนใหญ่ทั้งในรูปแบบของตัวเองหรือโดยปลั๊กอิน แต่มันยังเป็นที่นิยมใช้กันทั่วโลกในแอปพลิเคชั่นอื่น ๆ ภายในเทมเพลตที่กำหนดตัวอย่างเช่นการตั้งค่าโพสต์ที่เกี่ยวข้อง

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

จากนี้เห็นได้ชัดว่า$postไม่น่าเชื่อถือ โค้ดที่เขียนไม่ดีใด ๆ ที่ใช้ประโยชน์จากการสืบค้นที่กำหนดเองสามารถเปลี่ยน$postทั่วโลกซึ่งจะทำลายบางสิ่งบางอย่าง (เช่นโพสต์ที่เกี่ยวข้อง)

มีนักพัฒนา WordPress เพียงไม่กี่คนเท่านั้นที่มีความรู้เพียงพอในการทำงานด้านในของคอร์และรู้ว่าต้องหลีกเลี่ยงอะไรบ้าง จำนวนผู้ใช้งานที่มากขึ้นไม่รู้ว่า WordPress แกนทำงานอย่างไร

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

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

เพียงเพื่อแบ่งปันความคิดของฉันที่นี่ก่อนที่ผมจะสรุป: ผมคิดว่า (และที่เห็นในรูปแบบบางและปลั๊กอินด้วย) ทั้งการใช้wp_reset_postdata()หรือwp_reset_query()ก่อนที่จะทำให้การใช้เพื่อให้แน่ใจว่าโลกจะถูกรีเซ็ตของแบบสอบถามหลัก$post $postแต่ทำไมฉันควรขยายโค้ดของฉันในชุดรูปแบบของฉันเพราะคนอื่นไม่ได้รหัสปลั๊กอินของเขาอย่างถูกต้อง? และหากมีคนรีเซ็ตการสืบค้นที่กำหนดเองอย่างถูกต้องการดำเนินการนี้จะทำงานเป็นครั้งที่สองโดยไม่จำเป็นซึ่งไม่ดี

วิธีที่สองผมคิดว่าการที่จะทำให้การใช้งานของแล้วใช้วิธีการบางอย่างเช่น$wp_query$wp_query->post

ความคิดใด ๆ เกี่ยวกับเรื่องนี้จะได้รับการชื่นชม


การรีเซ็ตโพสต์เพียงแค่คัดลอก var ไปยังอีกคุณสามารถเรียกได้ว่าเป็นล้านครั้งในรหัสของคุณและไม่เห็นประสิทธิภาพใด ๆ เลยดังนั้นฉันไม่รู้ว่าอะไรดีไปกว่านี้
Milo

คำตอบ:


16

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

ที่กล่าวว่าใช่ทั่วโลก$postเป็นหนึ่งใน var ทั่วโลกที่ใช้มากที่สุดดังนั้นการใช้พิเศษดูแลมันสามารถเป็นความคิดที่ดี

$postในรหัสของฉันฉันไม่ค่อยโดยตรงเข้าถึงทั่วโลก

เมื่ออยู่ในเอกพจน์ประกวดผมใช้get_queried_object()และมักจะตรวจสอบว่า$postเป็นที่ถูกต้องWP_Postเช่น:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

ฉันจะตรวจสอบในกรณีที่หายากที่ฉันเข้าถึง$postโดยตรง

พิจารณาว่าget_queried_object()ส่งคืนค่าที่ไม่คาดคิดหากบางรหัสใช้query_postsแต่ถ้ามีคนใช้รหัสที่ต้องพึ่งพาquery_postsพวกเขาสมควรได้รับหากไซต์ของพวกเขาแตก :)

นอกจากนี้หากฉันคาดหวังว่าจะมีเงื่อนไขฉันจะตรวจสอบพวกเขาเช่นประเภทโพสต์เฉพาะหรือสถานะเฉพาะ

หากฉันต้องการเช็คเพิ่มเติมและในสถานที่อื่น ๆ ฉันจะสร้างฟังก์ชั่นเพื่อใช้งาน:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

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

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