วิธีรับอาร์เรย์ของข้อมูลโพสต์จากผลลัพธ์ wp_query


35

เมื่อเรียกใช้แบบสอบถามด้วยวิธีการ WP_Query ฉันได้รับวัตถุ ฉันเข้าใจว่าฉันสามารถทำลูปเพื่อแสดงเนื้อหาได้ แต่เป้าหมายของฉันคือไม่แสดงอะไรเลยฉันต้องการได้รับข้อมูลโพสต์โดยทำบางสิ่งเช่น "foreach ... " ฉันจะรับข้อมูลโพสต์มากมายที่ฉันสามารถวนซ้ำและรับข้อมูลได้อย่างไร


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

คำตอบ:


73

คุณควรอ่านฟังก์ชันอ้างอิงสำหรับ WP_Queryบน WordPress codex ที่นั่นคุณมีตัวอย่างมากมายให้ดู หากคุณไม่ต้องการที่จะห่วงมากกว่าผลการตั้งค่าการใช้whileคุณอาจได้รับข้อความทั้งหมดที่ส่งกลับโดยแบบสอบถามที่มีในสถานที่WP_Queryposts

ตัวอย่างเช่น

$query = new WP_Query( array( 'post_type' => 'page' ) );
$posts = $query->posts;

foreach($posts as $post) {
    // Do your stuff, e.g.
    // echo $post->post_name;
}

1
ไม่มีตัวอย่างที่คุณลิงค์เพื่อสาธิตวิธีการโพสต์ เป็นเรื่องที่ดีที่คุณตอบว่าเสียดายที่ไม่มีในเอกสารประกอบ เคล็ดลับอื่น: หากคุณทำการจับคู่กับโพสต์ที่ไม่ซ้ำใครคุณสามารถใช้ฟังก์ชั่นเช่นนี้กับ'posts_per_page'=>1args ได้ function wp_queryfirstpost($args) { $q=new WP_Query($args); $pp=$q->get_posts(); $firstpost=false;if ($pp) $firstpost=$pp[0]; wp_reset_postdata(); return $firstpost; }
Henrik Erlandsson

@rofflox: คุณเป็นนักบุญ! เหมาะสำหรับการหลีกเลี่ยงการ get_the_title / ID / younameit
ขวด

8
คุณควรใช้$query->postsแทน$query->get_posts()จะทำการเรียกใช้การแยกวิเคราะห์เคียวรีและการสืบค้นฐานข้อมูลที่ไม่จำเป็นเพิ่มเติมอีกครั้ง
Tom J Nowell

$ query-> get_posts (); ไม่ทำงานตามที่คาดไว้ ไม่แน่ใจว่าทำไม แต่ส่งคืนโพสต์น้อยกว่าการสืบค้น ดูที่นี่: stackoverflow.com/questions/25395299/…
Laxmana

1
คำตอบนี้ผิดธรรมดาเมื่อคุณสร้าง WP_Query ใหม่ที่มีข้อโต้แย้งบางอย่างเมธอด get_posts () จะถูกเรียกภายในทันทีและคุณไม่ควรเรียกมันอีกครั้ง! หากคุณเรียกมันอีกครั้งตามที่แสดงในตัวอย่างด้านบนมันจะเรียกใช้แบบสอบถามที่แตกต่างกันขึ้นอยู่กับข้อโต้แย้งและผลลัพธ์ในรูปแบบการเริ่มต้น (ชุดธงภายใน, ฯลฯ .. ) และอาจส่งคืนชุดผลลัพธ์ที่แตกต่างกัน หรือไม่มีผลลัพธ์เลย ตามที่ TomJNowell และ Laxmana แนะนำไว้ข้างต้นควรใช้ $ query-> posts เพื่อรับข้อมูลการโพสต์
ivanhoe

11

ที่จริงแล้วคุณไม่จำเป็นต้องปฏิเสธที่จะใช้การwhile()วนซ้ำ วัตถุ WP_Post เดียวกันถูกเก็บไว้ในpostทรัพย์สินแล้ว:

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();

                // now $query->post is WP_Post Object, use:
                // $query->post->ID, $query->post->post_title, etc.

            }

        }

2
ifซ้ำซ้อน
Akkumulator

2
ไม่ifไม่ซ้ำซ้อน ในกรณีนี้แน่นอนมันเป็น แต่ในสถานการณ์การผลิตส่วนใหญ่คุณมีรหัสที่จะดำเนินการระหว่างถ้าและในขณะที่
magi182

2
@ magi182 ซึ่งทำให้ซ้ำซ้อนในกรณีนี้ ผู้คนควรเรียนรู้ว่าจะใช้เมื่อไร
frodeborli

4
@ frodeborli สิ่งที่ดีเกี่ยวกับข้อความที่เริ่มต้นด้วย "คนควร" คือคุณเกือบจะสามารถแทนที่ "คนจะไม่" และคำสั่งยังคงทดสอบว่าเป็นจริง
magi182

1
@ magi182 ฉันอาจจะทำให้ร้อยดีที่มีเส้นรหัสเพื่อเสริมรหัสข้างต้น
frodeborli

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