วิธีรับโพสต์ทั้งหมดด้วยสถานะโพสต์ใด ๆ


38

ฉันกำลังสร้างแดชบอร์ดส่วนหน้าที่ฉันต้องการแสดงโพสต์ทั้งหมดโดยผู้ใช้ปัจจุบัน ดังนั้นฉันจึงต้องแสดงโพสต์ในทุกรัฐส่วนใหญ่published, และtrashed pendingตอนนี้ฉันใช้ข้อความค้นหาง่าย ๆ แต่กลับมาเฉพาะบทความที่เผยแพร่

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID              
    );
    query_posts($query);

ใครช่วยได้บ้าง ฉันต้องทำอะไรอีก


4
คุณได้ลองใช้post_statusพารามิเตอร์เช่น 'post_status' => 'any'?
t31os

2
ผมขอแนะนำให้ใช้WP_Query pre_get_postsหรือแทนget_posts query_postsอย่าใช้query_posts
Tom J Nowell

@TomJNowell: นั่นคือทางกลับ :) ผมใช้ WP_Query มากที่สุดในขณะนี้ .. ofter
Sisir

1
@Sisir ระวังใช้WP_Queryสำหรับ front-end และget_postsสอบถามผู้ดูแลระบบเนื่องจากมีปัญหากับwp_reset_postdata(ดูหมายเหตุและตั๋วเกี่ยวกับปัญหานี้)
Aurovrata

คำตอบ:


65

คุณสามารถใช้พารามิเตอร์ post_status:

* 'publish' - a published post or page
* 'pending' - post is pending review
* 'draft' - a post in draft status
* 'auto-draft' - a newly created post, with no content
* 'future' - a post to publish in the future
* 'private' - not visible to users who are not logged in
* 'inherit' - a revision. see get_children.
* 'trash' - post is in trashbin. added with Version 2.9. 

ฉันไม่แน่ใจว่ามันยอมรับ 'any' เพื่อใช้และ array กับทุกประเภทที่คุณต้องการ:

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID,
    'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')    
);
$loop = new WP_Query($query);

while ( $loop->have_posts() ) : $loop->the_post();

7
คุณสามารถใช้get_post_stati()เพื่อรับสถานะทั้งหมดรวมถึงสถานะที่กำหนดเอง
fuxia

5
โอกาสที่สูญเปล่าที่จะฆ่าผู้query_postsโทร ...
Tom J Nowell

เลวร้ายเกินไปเราไม่สามารถทำสิ่งนี้ได้'post_status' => array( '!inherit' );(เพื่อบ่งบอกถึง post_status นอกเหนือจากการสืบทอด)
aequalsb

@aequalsb แล้ว'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab

9

มีวิธีที่ง่ายวิธีการรับโพสต์ทั้งหมดด้วยสถานะใด ๆ :

$articles = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => get_post_types('', 'names'),
 )
);

ตอนนี้คุณสามารถทำซ้ำได้ตลอดโพสต์ทั้งหมด:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}

2
$ $ โพสต์และโพสต์ความขัดแย้งกับ Wordpress' ชื่อตัวแปรของตัวเอง หากคุณใช้รหัสนี้เพื่อใส่สิ่งอื่นนอกเหนือจาก div หลัก (เนื้อหาหลัก) สิ่งนี้จะเขียนทับสิ่งที่จะแสดงใน main หากความตั้งใจของคุณคือการแทนที่ผลการสืบค้นเดิมอย่างสมบูรณ์นี่คือสิ่งที่คุณต้องการแน่นอน แต่มันก็เป็นความคิดที่ดีที่จะเปลี่ยนชื่อตัวแปร $ posts และ $ post
Henrik Erlandsson

5
@Henrik ฉันไม่ได้ตั้งใจที่จะลดความคิดเห็นของคุณเลย (เหตุผลของคุณคือเสียงและปลอดภัย) แต่ฉันพิจารณาใช้ $ post / $ โพสต์เป็นที่ยอมรับอย่างสมบูรณ์ในฟังก์ชั่นโดยไม่ต้องเข้าถึงตัวแปร $ post / $ ทั่วโลก มันช่วยให้ฉันรักษาตรรกะในระหว่างการพัฒนา
aequalsb

6

WP_Queryวิธีการเรียน->query()ยอมรับอาร์กิวเมนต์สำหรับการany post_statusดูwp_get_associated_nav_menu_items()หลักฐาน

เช่นเดียวกันสำหรับget_posts()(ซึ่งเป็นเพียงเสื้อคลุมสำหรับการโทรด้านบน)


3
จาก WP_Query docs: 'any' - เรียกข้อมูลสถานะใด ๆ ยกเว้นว่าจากประเภทการโพสต์ด้วยการตั้งค่า 'excluse_from_search' เป็นจริง (มีการพิมพ์ผิดที่พวกเขาหมายถึงสถานะการโพสต์แทนประเภทโพสต์) ซึ่งหมายถึงสถานะauto-draftและtrashได้รับการยกเว้น
Tamlyn

@Tamlyn Afaik นี่ไม่ใช่การพิมพ์ผิด มันจะดึงสถานะใด ๆ จากประเภทโพสต์ที่เปิดเผยต่อสาธารณะ สถานะเป็นเพียงข้อกำหนด พวกเขาไม่มีทรัพย์สินของรัฐหรือเอกชนเอง คุณสามารถปิดการใช้งานอนุกรมวิธานด้วยการปิดquery_var... ไม่ว่าด้วยเหตุผลใดก็ตาม Sidenote: พหูพจน์สถานะโพสต์ ...
ไกเซอร์

1
หากคุณติดตามรหัส (มักจะง่ายกว่าการอ่านเอกสารฉันพบว่า) คุณสามารถเห็นได้ว่าการWP_Query#get_posts()เรียกใช้get_post_stati()ตัวกรองใด$wp_post_statusesสำหรับค่าที่exclude_from_searchเป็นจริงจากนั้นจะแยกการโพสต์ที่มีสถานะเหล่านี้ออกจากแบบสอบถาม มีกระบวนการที่คล้ายกันสำหรับประเภทโพสต์เมื่อ post_type ถูกตั้งค่าเป็น 'ใด ๆ '
Tamlyn

@Tamlyn หลังจากการตรวจสอบเนื้อหาของ$wp_post_statusesคุณสมบัติที่ผมต้องยอมรับว่าคุณขวา :)
Kaiser

ไม่ทำงานกับสถานะถังขยะ
Maxwell sc

2

ในกรณีส่วนใหญ่คุณสามารถใช้get_posts()กับ'any'พารามิเตอร์สำหรับสิ่งนี้:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => 'my-post-type',
 )
);

แต่วิธีนี้คุณจะไม่ได้รับการโพสต์ที่มีสถานะและtrash auto-draftคุณต้องให้พวกเขาอย่างชัดเจนเช่นนี้:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any, trash, auto-draft',
  'post_type' => 'my-post-type',
 )
);

หรือคุณสามารถใช้ฟังก์ชัน get_post_stati () เพื่อระบุสถานะที่มีอยู่ทั้งหมดอย่างชัดเจน:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);

1

แม้ว่าคุณจะผ่านanyเป็นpost_statusคุณจะยังไม่ได้รับโพสต์ในผลลัพธ์หากเงื่อนไขต่อไปนี้ทั้งหมดเป็นจริง:

  1. มีการสอบถามโพสต์เดียว ตัวอย่างนี้จะสอบถามโดยnameเช่นกระสุน
  2. โพสต์มีสถานะโพสต์ที่ไม่เป็นสาธารณะ
  3. ไคลเอ็นต์ไม่มีเซสชันผู้ดูแลระบบที่ใช้งานอยู่นั่นคือคุณยังไม่ได้เข้าสู่ระบบ

วิธีการแก้

ค้นหาอย่างชัดเจนสำหรับทุกสถานะ ตัวอย่างเช่นหากต้องการค้นหา stati ที่ไม่ใช่trashหรือauto-draft(เป็นไปได้ยากที่คุณต้องการ) คุณสามารถทำสิ่งนี้:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.