มีสองquery_posts()
ฟังก์ชั่นการพูดทางเทคนิค หนึ่งquery_posts()
อันที่จริงแล้วWP_Query::query_posts()
อีกอันอยู่ในอวกาศโลก
ถามจากสติ:
หากทั่วโลกquery_posts()
นั้น "ชั่วร้าย" ทำไมไม่คัดค้าน?
_doing_it_wong
หรือทำไมไม่ทำเครื่องหมายเป็น
มีสองquery_posts()
ฟังก์ชั่นการพูดทางเทคนิค หนึ่งquery_posts()
อันที่จริงแล้วWP_Query::query_posts()
อีกอันอยู่ในอวกาศโลก
ถามจากสติ:
หากทั่วโลกquery_posts()
นั้น "ชั่วร้าย" ทำไมไม่คัดค้าน?
_doing_it_wong
หรือทำไมไม่ทำเครื่องหมายเป็น
คำตอบ:
ขุด 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
:
pre_get_posts
ตะขอที่มีประโยชน์ฉันไม่สามารถอธิบายทั้งหมดเหล่านี้ได้ แต่สิ่งเหล่านี้บางส่วนมีเล่ห์เหลี่ยมดังนั้นเรามาให้คำแนะนำสั้น ๆ
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_Query
global $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
เคล็ดลับเสมอ
ผมได้สร้างเพียงตั๋ว Trac ใหม่ตั๋ว # 36874query_posts()
เพื่อเสนอคัดค้านของ จะยอมรับได้หรือไม่ยังคงเป็นคำถามที่ดี
ปัญหาใหญ่ที่แท้จริงของquery_posts()
มันคือมันยังคงถูกใช้อย่างกว้างขวางโดยปลั๊กอินและธีมแม้ว่าจะมีงานเขียนที่ดีจริงๆในเรื่องที่ว่าทำไมคุณไม่ควรใช้มันเลย ฉันคิดว่าโพสต์ที่ยิ่งใหญ่ที่สุดที่นี่ใน WPSE คือโพสต์ต่อไปนี้:
deprecation! == การลบดังนั้นการเลิกใช้query_posts()
จะไม่หยุดการใช้งานโดย devs ที่มีคุณภาพต่ำและคนทั่วไปที่ไม่รู้จัก WordPress และผู้ที่ใช้บทเรียนที่มีคุณภาพต่ำเป็นแนวทาง เพียงแค่เป็นข้อพิสูจน์บางกี่คำถามเราจะยังคงได้รับที่นี่ที่ผู้คนใช้caller_get_posts
ในWP_Query
? ตอนนี้เลิกใช้มาหลายปีแล้ว
ฟังก์ชันและอาร์กิวเมนต์ที่เลิกใช้แล้วสามารถลบออกได้ทุกเมื่อที่ devs หลักเห็นว่าเหมาะสม แต่สิ่งนี้อาจจะไม่เกิดขึ้นquery_posts()
เพราะจะทำให้ไซต์นับล้าน ๆ ใช่แล้วเราอาจจะไม่เห็นการลบทั้งหมดquery_posts()
- ซึ่งอาจนำไปสู่ความจริงที่ว่ามันอาจจะไม่ถูกคัดค้าน
นี่เป็นจุดเริ่มต้น แต่สิ่งหนึ่งที่ต้องจำไว้การเลิกใช้บางสิ่งใน WordPress ไม่หยุดการใช้งาน
ตอนนี้ตั๋วที่ฉันยกถูกปิดและทำเครื่องหมายว่าซ้ำกับตั๋วอายุ 4 ปีซึ่งถูกปิดเป็นwontfixและเปิดใหม่และยังคงเปิดอยู่และไม่ได้รับการแก้ไข
ดูเหมือนว่านักพัฒนาหลักกำลังแขวนอยู่กับความชั่วร้ายเล็ก ๆ น้อย ๆ ที่ซื่อสัตย์แบบเก่า ทุกคนที่สนใจนี่คือตั๋วเก่า 4 ปีที่ซ้ำกัน
[พูดจาโผงผาง]
มันเป็นปรัชญาหลักที่ยืน ณ จุดนี้ว่าไม่มีอะไรเลิกอย่างแท้จริง การแจ้งการเลิกใช้งานในขณะที่เป็นสิ่งที่ดีที่จะมีก็จะถูกละเว้นถ้าฟังก์ชั่นจะไม่ถูกทิ้งในบางจุด มีหลายคนที่ไม่พัฒนาด้วยWP_DEBUG
และจะไม่สังเกตเห็นการแจ้งเตือนหากไม่มีการแตกจริง
มือ OTOH ฟังก์ชั่นนี้เป็นเหมือนgoto
คำสั่ง โดยส่วนตัวแล้วฉันไม่เคยใช้ (สำหรับคำจำกัดความที่น้อยกว่านั้น) goto
แต่ฉันสามารถเข้าใจข้อโต้แย้งที่ชี้ไปที่บางสถานการณ์ซึ่งไม่ใช่ความชั่วตามค่าเริ่มต้น เช่นเดียวกันกับquery_posts
มันเป็นวิธีที่ง่ายในการตั้งค่า globals ทั้งหมดที่จำเป็นในการทำลูปที่เรียบง่ายและสามารถเป็นประโยชน์ในบริบท ajax หรือ rest-api ฉันจะไม่ใช้มันในบริบทเหล่านั้นเช่นกัน แต่ฉันเห็นได้ว่าที่นั่นมันเป็นปัญหาของรูปแบบของการเข้ารหัสมากขึ้นจากนั้นฟังก์ชั่นที่เป็นความชั่วร้ายด้วยตัวเอง
หากมองลึกลงไปอีกเล็กน้อยปัญหาหลักคือต้องตั้งค่าให้กลมกลืน นั่นคือปัญหาหลักไม่ใช่ฟังก์ชั่นเดียวที่ช่วยในการตั้งค่า
query_posts
ช้ากว่าเคียวรีรอง (อ่าน: ไม่ใช่เคียวรีหลัก)
query_posts
ตัวเอง แต่แบบสอบถามไร้ประโยชน์ที่ทำเมื่อ WP โหลด