ทำไม query_posts () ไม่ถูกทำเครื่องหมายว่าเลิกใช้แล้ว


15

มีสองquery_posts()ฟังก์ชั่นการพูดทางเทคนิค หนึ่งquery_posts()อันที่จริงแล้วWP_Query::query_posts()อีกอันอยู่ในอวกาศโลก

ถามจากสติ:

หากทั่วโลกquery_posts()นั้น "ชั่วร้าย" ทำไมไม่คัดค้าน?

_doing_it_wongหรือทำไมไม่ทำเครื่องหมายเป็น


2
นั่นเป็นคำถามที่ยอดเยี่ยม! สำหรับคนอื่นที่เจอเรื่องนี้ซึ่งไม่รู้ว่าทำไมคุณไม่ควรใช้ query_posts () ที่นี่และที่นี่เป็นคำถามและคำตอบเบื้องต้นที่ดี
Tim Malone

คำตอบ:


11

คำถามสร้างพลังคิด

ขุด Let 's ลงในทั้งสามคน: ::query_posts, ::get_postsและclass WP_Queryเพื่อให้เข้าใจ::query_postsได้ดียิ่งขึ้น

สิ่งสำคัญสำหรับการรับข้อมูลใน WordPress คือWP_Queryคลาส ทั้งวิธี::query_postsและ::get_postsใช้คลาสนั้น

โปรดทราบว่าคลาสWP_Queryนี้ยังมีวิธีการที่มีชื่อเหมือนกัน: WP_Query::query_postsและWP_Query::get_postsแต่จริงๆแล้วเราพิจารณาเฉพาะวิธีการทั่วโลกดังนั้นอย่าสับสน

ป้อนคำอธิบายรูปภาพที่นี่

การทำความเข้าใจ WP_Query

ชั้นที่เรียกว่าWP_Queryได้รับการแนะนำกลับมาในปี 2004 ทุกสาขาที่มีเครื่องหมาย☂ (ร่ม) ที่มีอยู่ในปี 2004 เขตข้อมูลเพิ่มเติมถูกเพิ่มเข้ามาในภายหลัง

นี่คือWP_Queryโครงสร้าง:

class WP_Query (as in WordPress v4.7) 
    public $query; 
    public $query_vars = array(); 
    public $tax_query;
    public $meta_query = false;
    public $date_query = false;
    public $queried_object; 
    public $queried_object_id; 
    public $request;
    public $posts; 
    public $post_count = 0; 
    public $current_post = -1; 
    public $in_the_loop = false;
    public $post; 
    public $comments;
    public $comment_count = 0;
    public $current_comment = -1;
    public $comment;
    public $found_posts = 0;
    public $max_num_pages = 0;
    public $max_num_comment_pages = 0;
    public $is_single = false; 
    public $is_preview = false; 
    public $is_page = false; 
    public $is_archive = false; 
    public $is_date = false; 
    public $is_year = false; 
    public $is_month = false; 
    public $is_day = false; 
    public $is_time = false; 
    public $is_author = false; 
    public $is_category = false; 
    public $is_tag = false;
    public $is_tax = false;
    public $is_search = false; 
    public $is_feed = false; 
    public $is_comment_feed = false;
    public $is_trackback = false; 
    public $is_home = false; 
    public $is_404 = false; 
    public $is_embed = false;
    public $is_paged = false;
    public $is_admin = false; 
    public $is_attachment = false;
    public $is_singular = false;
    public $is_robots = false;
    public $is_posts_page = false;
    public $is_post_type_archive = false;
    private $query_vars_hash = false;
    private $query_vars_changed = true;
    public $thumbnails_cached = false;
    private $stopwords;
    private $compat_fields = array('query_vars_hash', 'query_vars_changed');
    private $compat_methods = array('init_query_flags', 'parse_tax_query');
    private function init_query_flags()

WP_Query คือมีดทหารสวิส

บางสิ่งเกี่ยวกับWP_Query:

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

ฉันไม่สามารถอธิบายทั้งหมดเหล่านี้ได้ แต่สิ่งเหล่านี้บางส่วนมีเล่ห์เหลี่ยมดังนั้นเรามาให้คำแนะนำสั้น ๆ

WP_Query เป็นสิ่งที่คุณสามารถควบคุมผ่านการโต้แย้งที่คุณผ่าน

The list of the arguments
---
 attachment
 attachment_id
 author
 author__in
 author__not_in
 author_name
 cache_results
 cat
 category__and
 category__in
 category__not_in
 category_name
 comments_per_page
 day
 embed
 error
 feed
 fields
 hour
 ignore_sticky_posts
 lazy_load_term_meta
 m
 menu_order
 meta_key
 meta_value
 minute
 monthnum
 name
 no_found_rows
 nopaging
 order
 p
 page_id
 paged
 pagename
 post__in
 post__not_in
 post_name__in
 post_parent
 post_parent__in
 post_parent__not_in
 post_type
 posts_per_page
 preview
 s
 second
 sentence
 static
 subpost
 subpost_id
 suppress_filters
 tag
 tag__and
 tag__in
 tag__not_in
 tag_id
 tag_slug__and
 tag_slug__in
 tb
 title
 update_post_meta_cache
 update_post_term_cache
 w
 year

รายการจาก WordPress เวอร์ชั่น 4.7 นี้จะมีการเปลี่ยนแปลงในอนาคต

นี่เป็นตัวอย่างขั้นต่ำในการสร้างWP_Queryวัตถุจากอาร์กิวเมนต์:

// WP_Query arguments
$args = array ( /* arguments*/ );
// creating the WP_Query object
$query = new WP_Query( $args );
// print full list of arguments WP_Query can take
print ( $query->query_vars );

WP_Query เป็นโลภ

ที่สร้างขึ้นจากแนวคิดที่get all you canพัฒนา WordPress ตัดสินใจที่จะรับข้อมูลที่เป็นไปได้ทั้งหมดในช่วงต้นเช่นนี้เป็นสิ่งที่ดีสำหรับผลการดำเนินงาน นี่คือเหตุผลโดยค่าเริ่มต้นเมื่อแบบสอบถามใช้เวลา 10 โพสต์จากฐานข้อมูลก็จะได้รับข้อกำหนดและข้อมูลเมตาสำหรับการโพสต์เหล่านี้ผ่านการสืบค้นแยกต่างหาก ข้อกำหนดและข้อมูลเมตาจะถูกแคช (ดึงข้อมูลล่วงหน้า)

โปรดทราบว่าการแคชเป็นเพียงสำหรับอายุการใช้งานคำขอเดียว

คุณสามารถปิดใช้งานการแคชหากคุณตั้งค่าupdate_post_meta_cacheและupdate_post_term_cacheถึงfalseในขณะที่ตั้งค่าWP_Queryอาร์กิวเมนต์ เมื่อการแคชถูกปิดใช้งานข้อมูลจะถูกร้องขอจากฐานข้อมูลตามต้องการเท่านั้น

สำหรับการแคชบล็อก WordPress ส่วนใหญ่ทำงานได้ดี แต่มีบางครั้งที่คุณอาจปิดการใช้งานการแคช

WP_Query ใช้คลาสตัวช่วย

หากคุณตรวจสอบWP_Queryฟิลด์ที่นั่นคุณมีสามสิ่งต่อไปนี้

public $tax_query;
public $meta_query;
public $date_query;

คุณสามารถจินตนาการการเพิ่มสิ่งใหม่ในอนาคต

ป้อนคำอธิบายรูปภาพที่นี่

WP_Query เก็บสารสำหรับการวนซ้ำ

ในรหัสนี้:

$query = new WP_Query( $args )
if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();

คุณอาจสังเกตเห็นว่าWP_Queryมีสารที่คุณสามารถทำซ้ำ วิธีการช่วยเหลือก็มีเช่นกัน คุณเพียงแค่ตั้งwhileวง

บันทึก. forและwhileลูปนั้นเทียบเท่ากันทางความหมาย

WP_Query ประถมศึกษาและมัธยมศึกษา

ใน WordPress คุณมีหนึ่งหลักและศูนย์หรือมากกว่ารองคำสั่ง

เป็นไปได้ที่จะไม่มีคิวรีหลัก แต่อยู่นอกเหนือขอบเขตของบทความนี้

แบบสอบถามหลักที่เรียกว่าแบบสอบถามหลักหรือแบบสอบถามทั่วไป แบบสอบถามรองเรียกว่าแบบสอบถามแบบกำหนดเอง

WordPress ใช้WP_Rewriteคลาสแรกเริ่มเพื่อสร้างอาร์กิวเมนต์การสืบค้นตาม URL ขึ้นอยู่กับข้อโต้แย้งเหล่านี้มันเก็บสองวัตถุที่เหมือนกันในพื้นที่โลก ทั้งสองสิ่งนี้จะระงับข้อความค้นหาหลัก

global $wp_query   @since WordPress 1.5
global $wp_the_query @since WordPress 2.1

เมื่อเราพูดคำค้นหาหลักเราคิดถึงตัวแปรเหล่านี้ แบบสอบถามอื่น ๆ สามารถเรียกได้ว่ารองหรือกำหนดเอง

มันถูกกฎหมายอย่างสมบูรณ์ที่จะใช้อย่างใดอย่างหนึ่งglobal $wp_queryหรือ $GLOBALS['wp_query']แต่ใช้สัญกรณ์ที่สองมีความโดดเด่นมากขึ้นและบันทึกการพิมพ์บรรทัดพิเศษภายในขอบเขตของฟังก์ชั่น

$GLOBALS['wp_query']และ$GLOBALS['wp_the_query']เป็นวัตถุแยกต่างหาก $GLOBALS['wp_the_query']ควรแช่แข็ง

WP_Queryมีpre_get_postsตะขอที่สะดวก

นี่คือเบ็ดการกระทำ มันจะใช้กับตัวอย่างใด ๆ WP_Queryคุณเรียกว่าชอบ:

add_action( 'pre_get_posts', function($query){

 if ( is_category() && $query->is_main_query() ) {
    // set your improved arguments
    $query->set( ... );  
    ...  
 }

 return $query;  
});

เบ็ดนี้ดีมากและสามารถแก้ไขข้อโต้แย้งใด ๆ

นี่คือสิ่งที่คุณสามารถอ่านได้ :

ไฟหลังจากสร้างวัตถุตัวแปรคิวรี่ แต่ก่อนที่จะรันเคียวรีจริง

ดังนั้นตะขอนี้คือตัวจัดการข้อโต้แย้ง แต่ไม่สามารถสร้างWP_Queryวัตถุใหม่ ถ้าคุณมีหนึ่งแบบสอบถามหลักและแบบสอบถามรองหนึ่งpre_get_postsไม่สามารถสร้างแบบสอบถามที่สาม หรือถ้าคุณมีหนึ่งหลักมันไม่สามารถสร้างรอง

หมายเหตุในกรณีที่คุณต้องการแก้ไขคิวรีหลักเท่านั้นที่คุณสามารถใช้requestเบ็ดได้

WP_Query รองรับลูปซ้อนกัน

สถานการณ์นี้อาจเกิดขึ้นหากคุณใช้ปลั๊กอินและคุณเรียกใช้ฟังก์ชันปลั๊กอินจากแม่แบบ

นี่คือตัวอย่างของ WordPress ที่มีฟังก์ชั่นช่วยเหลือแม้กระทั่งลูปซ้อนกัน:

global $id;
while ( have_posts() ) : the_post(); 

    // the custom $query
    $query = new WP_Query( array(   'posts_per_page' => 5   ) );    
    if ( $query->have_posts() ) {

        while ( $query->have_posts() ) : $query->the_post();            
            echo '<li>Custom ' . $id . '. ' . get_the_title() . '</li>';
        endwhile;       
    }   

    wp_reset_postdata();
    echo '<li>Main Query ' . $id . '. ' . get_the_title() . '</li>';

endwhile;

เอาต์พุตจะเป็นแบบนี้ตั้งแต่ฉันติดตั้งข้อมูลทดสอบชุดรูปแบบ :

Custom 100. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 1. Hello world!

แม้ว่าฉันจะขอ 5 โพสต์ในการค้นหา $ ที่กำหนดเองมันจะส่งคืนฉันหกโพสต์เพราะโพสต์เหนียวจะไปพร้อมกัน หากไม่มีwp_reset_postdataในตัวอย่างก่อนหน้าเอาต์พุตจะเป็นเช่นนี้เพราะ$GLOBALS['post']จะไม่ถูกต้อง

Custom 1001. Template: Sticky
Custom 1. Hello world!
Custom 10. Markup: HTML Tags and Formatting
Custom 11. Markup: Image Alignment
Custom 12. Markup: Text Alignment
Custom 13. Markup: Title With Special Characters
Main Query 13. Markup: Title With Special Characters

WP_Queryมีwp_reset_queryฟังก์ชั่น

นี่เป็นเหมือนปุ่มรีเซ็ต $GLOBALS['wp_the_query']ควรถูกตรึงตลอดเวลาและปลั๊กอินหรือธีมไม่ควรเปลี่ยนแปลง

นี่คือสิ่งที่wp_reset_queryทำ:

function wp_reset_query() {
    $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
    wp_reset_postdata();
}

ข้อสังเกตใน get_posts

get_posts ดูเหมือน

File: /wp-includes/post.php
1661: function get_posts( $args = null ) {
1662:   $defaults = array(
1663:       'numberposts' => 5,
1664:       'category' => 0, 'orderby' => 'date',
1665:       'order' => 'DESC', 'include' => array(),
1666:       'exclude' => array(), 'meta_key' => '',
1667:       'meta_value' =>'', 'post_type' => 'post',
1668:       'suppress_filters' => true
1669:   );
... // do some argument parsing
1685:   $r['ignore_sticky_posts'] = true;
1686:   $r['no_found_rows'] = true;
1687: 
1688:   $get_posts = new WP_Query;
1689:   return $get_posts->query($r);

หมายเลขบรรทัดอาจมีการเปลี่ยนแปลงในอนาคต

มันเป็นเพียงwrapperรอบ ๆWP_Queryที่คืนค่าการโพสต์วัตถุแบบสอบถาม

การignore_sticky_postsตั้งค่าเป็นจริงหมายถึงโพสต์เหนียวอาจปรากฏขึ้นในตำแหน่งที่เป็นธรรมชาติเท่านั้น ด้านหน้าจะไม่มีเสาเหนียว อีกno_found_rowsชุดหนึ่งเป็นจริงหมายถึง API ของฐานข้อมูล WordPress จะไม่ใช้SQL_CALC_FOUND_ROWSเพื่อใช้การแบ่งหน้าลดภาระในฐานข้อมูลเพื่อดำเนินการนับแถวที่พบ

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

$args = array ( 'ignore_sticky_posts' => true, 'no_found_rows' => true);
$query = new WP_Query( $args );
print( $query->request );

นี่คือคำขอ SQL ที่สอดคล้องกัน:

SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10

เปรียบเทียบสิ่งที่เรามีตอนนี้กับคำขอ SQL ก่อนหน้านี้ที่SQL_CALC_FOUND_ROWSมีอยู่

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_date DESC LIMIT 0, 10

คำขอที่ไม่มีSQL_CALC_FOUND_ROWSจะเร็วขึ้น

ข้อสังเกตใน query_posts

เคล็ดลับ: ตอนแรกในปี 2004 global $wp_queryมีเพียง ตั้งแต่เวอร์ชัน WordPress 2.1 $wp_the_queryมาแล้ว เคล็ดลับ: $GLOBALS['wp_query']และ$GLOBALS['wp_the_query']เป็นวัตถุแยกต่างหาก

query_posts()เป็นWP_Queryเสื้อคลุม มันกลับอ้างอิงถึงหลักวัตถุและในเวลาเดียวกันก็จะตั้งค่าWP_Queryglobal $wp_query

File: /wp-includes/query.php
function query_posts($args) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($args);
}

ใน PHP4 ทุกอย่างรวมถึงวัตถุถูกส่งผ่านตามค่า query_postsเป็นเช่นนี้:

File: /wp-includes/query.php (WordPress 3.1)
function &query_posts($args) {
    unset($GLOBALS['wp_query']);
    $GLOBALS['wp_query'] =& new WP_Query();
    return $GLOBALS['wp_query']->query($args);
}

โปรดทราบในสถานการณ์ทั่วไปที่มีหนึ่งแบบสอบถามหลักและแบบสอบถามรองหนึ่งเรามีตัวแปรทั้งสามนี้:

$GLOBALS['wp_the_query'] 
$GLOBALS['wp_query'] // should be the copy of first one
$custom_query // secondary

สมมุติว่าสามหน่วยความจำแต่ละเครื่องใช้เวลา 1M ทั้งหมดจะเป็น 3M ของหน่วยความจำ ถ้าเราใช้query_posts, $GLOBALS['wp_query']จะไม่มีการตั้งค่าและสร้างขึ้นอีกครั้ง

PHP5 + ควรเป็นสมาร์ทเทอะทะ$GLOBALS['wp_query']วัตถุเช่นเดียวกับใน PHP4 เราทำมันด้วยunset($GLOBALS['wp_query']);

function query_posts($args) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($args);
}

เป็นผลให้query_postsใช้หน่วยความจำรวม 2M ในขณะที่get_postsใช้หน่วยความจำ 3M

หมายเหตุในquery_postsเราจะไม่คืนค่าวัตถุจริง แต่เป็นการอ้างอิงถึงวัตถุ

จากphp.net : การอ้างอิง PHP เป็นนามแฝงซึ่งอนุญาตให้ตัวแปรสองตัวที่แตกต่างกันเขียนเป็นค่าเดียวกัน ในฐานะของ PHP 5 ตัวแปรอ็อบเจกต์ไม่ได้มีวัตถุเป็นค่าอีกต่อไป มันมีเพียงตัวระบุวัตถุที่ช่วยให้วัตถุเข้าถึงเพื่อค้นหาวัตถุที่เกิดขึ้นจริง เมื่อวัตถุถูกส่งโดยอาร์กิวเมนต์ส่งคืนหรือกำหนดให้กับตัวแปรอื่นตัวแปรที่แตกต่างไม่ใช่นามแฝง: พวกเขาเก็บสำเนาของตัวระบุซึ่งชี้ไปที่วัตถุเดียวกัน

นอกจากนี้ใน PHP5 + ตัวดำเนินการ assign (=) ก็ฉลาดเช่นกัน มันจะใช้การคัดลอกตื้นและไม่คัดลอกวัตถุอย่างหนัก เมื่อเราเขียนเช่นนี้$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];ข้อมูลเท่านั้นที่จะถูกคัดลอกไม่ใช่วัตถุทั้งหมดเนื่องจากสิ่งเหล่านี้ใช้วัตถุชนิดเดียวกันร่วมกัน

นี่คือตัวอย่างหนึ่ง

print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
print( md5(serialize($GLOBALS['wp_the_query']) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );

จะส่งผลให้:

f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
d6db1c6bfddac328442e91b6059210b5

ลองรีเซ็ตแบบสอบถาม:

print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
query_posts( '' );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );

จะส่งผลให้:

f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef
f14153cab65abf1ea23224a1068563ef

คุณสามารถสร้างปัญหาแม้ว่าคุณจะใช้ WP_Query

print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );   
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );

แน่นอนว่าวิธีแก้ปัญหาคือใช้wp_reset_queryฟังก์ชั่นอีกครั้ง

print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );
global $wp_query;
$wp_query = new WP_Query( array( 'post_type' => 'post' ) );
wp_reset_query();
print( md5(serialize($GLOBALS['wp_the_query'] ) ) );
print( md5(serialize($GLOBALS['wp_query'] ) ) );

นี่คือเหตุผลที่ฉันคิดว่าquery_postsอาจจะดีกว่าจากมุมมองของหน่วยความจำ แต่คุณควรทำwp_reset_queryเคล็ดลับเสมอ


10

ผมได้สร้างเพียงตั๋ว Trac ใหม่ตั๋ว # 36874query_posts()เพื่อเสนอคัดค้านของ จะยอมรับได้หรือไม่ยังคงเป็นคำถามที่ดี

ปัญหาใหญ่ที่แท้จริงของquery_posts()มันคือมันยังคงถูกใช้อย่างกว้างขวางโดยปลั๊กอินและธีมแม้ว่าจะมีงานเขียนที่ดีจริงๆในเรื่องที่ว่าทำไมคุณไม่ควรใช้มันเลย ฉันคิดว่าโพสต์ที่ยิ่งใหญ่ที่สุดที่นี่ใน WPSE คือโพสต์ต่อไปนี้:

deprecation! == การลบดังนั้นการเลิกใช้query_posts()จะไม่หยุดการใช้งานโดย devs ที่มีคุณภาพต่ำและคนทั่วไปที่ไม่รู้จัก WordPress และผู้ที่ใช้บทเรียนที่มีคุณภาพต่ำเป็นแนวทาง เพียงแค่เป็นข้อพิสูจน์บางกี่คำถามเราจะยังคงได้รับที่นี่ที่ผู้คนใช้caller_get_postsในWP_Query? ตอนนี้เลิกใช้มาหลายปีแล้ว

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

นี่เป็นจุดเริ่มต้น แต่สิ่งหนึ่งที่ต้องจำไว้การเลิกใช้บางสิ่งใน WordPress ไม่หยุดการใช้งาน

อัปเดต 19 พฤษภาคม 2559

ตอนนี้ตั๋วที่ฉันยกถูกปิดและทำเครื่องหมายว่าซ้ำกับตั๋วอายุ 4 ปีซึ่งถูกปิดเป็นwontfixและเปิดใหม่และยังคงเปิดอยู่และไม่ได้รับการแก้ไข

ดูเหมือนว่านักพัฒนาหลักกำลังแขวนอยู่กับความชั่วร้ายเล็ก ๆ น้อย ๆ ที่ซื่อสัตย์แบบเก่า ทุกคนที่สนใจนี่คือตั๋วเก่า 4 ปีที่ซ้ำกัน


ทำไมพวกเขาปิดตั๋วcore.trac.wordpress.org/ticket/36874 ? กรุณา @PieterGoosen คุณสามารถรวมลิงค์ไปยังเธรดนี้ในตั๋วของคุณcore.trac.wordpress.org/ticket/36874เนื่องจากคำถามนี้เกี่ยวข้องกับตั๋ว 1: 1
prosti

@prosti ดูเหมือนว่ามันถูกทำเครื่องหมายเป็นซ้ำเป็นปัญหานี้ได้รับการขึ้นมาแล้ว ... 4 ปีที่ผ่านมา พบได้ที่นี่
Howdy_McGee

3

[พูดจาโผงผาง]

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

มือ OTOH ฟังก์ชั่นนี้เป็นเหมือนgotoคำสั่ง โดยส่วนตัวแล้วฉันไม่เคยใช้ (สำหรับคำจำกัดความที่น้อยกว่านั้น) gotoแต่ฉันสามารถเข้าใจข้อโต้แย้งที่ชี้ไปที่บางสถานการณ์ซึ่งไม่ใช่ความชั่วตามค่าเริ่มต้น เช่นเดียวกันกับquery_postsมันเป็นวิธีที่ง่ายในการตั้งค่า globals ทั้งหมดที่จำเป็นในการทำลูปที่เรียบง่ายและสามารถเป็นประโยชน์ในบริบท ajax หรือ rest-api ฉันจะไม่ใช้มันในบริบทเหล่านั้นเช่นกัน แต่ฉันเห็นได้ว่าที่นั่นมันเป็นปัญหาของรูปแบบของการเข้ารหัสมากขึ้นจากนั้นฟังก์ชั่นที่เป็นความชั่วร้ายด้วยตัวเอง

หากมองลึกลงไปอีกเล็กน้อยปัญหาหลักคือต้องตั้งค่าให้กลมกลืน นั่นคือปัญหาหลักไม่ใช่ฟังก์ชั่นเดียวที่ช่วยในการตั้งค่า


และสำหรับการเปรียบเทียบนั้นquery_postsช้ากว่าเคียวรีรอง (อ่าน: ไม่ใช่เคียวรีหลัก)
prosti

@prosti เนื่องจากมันเพิ่งจะตั้งค่าและรัน wp_query มันจะช้ากว่านี้ได้เท่าไหร่? แน่ใจว่ามีค่าใช้จ่ายบางส่วน แต่เราอาจพูดถึง miliseconds ที่นี่ แน่นอนว่าคุณจะใช้มันในสถานที่ที่ WP ไม่ได้จัดทำแบบสอบถามโดยค่าเริ่มต้น ในสถานที่ที่มันไม่ดีไม่ใช่query_postsตัวเอง แต่แบบสอบถามไร้ประโยชน์ที่ทำเมื่อ WP โหลด
Mark Kaplun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.