setup_postdata () ดูเหมือนจะใช้งานไม่ได้ใช่ไหม


12

ฉันไม่แน่ใจว่าทำไม แต่ฉันเคยget_posts()ค้นหาข้อมูลบางอย่าง ถ้าอย่างนั้นฉันก็ใช้setup_postdata()... ฉันคิดว่ามันใช้แล้วเพื่อให้ฉันสามารถใช้ฟังก์ชั่นอย่างthe_permalink()อื่นกับโพสต์ข้อมูลใหม่ได้หรือไม่

<?php foreach ($childPosts as $cp) : setup_postdata($cp); ?>

<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
  <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
  <?php if (has_post_thumbnail()) : ?>
  <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
  <?php endif; ?>
  <?php the_excerpt(); ?>
  <p class="more"><a href="<?php the_permalink() ?>">Read more ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

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

คำตอบ:


32

ฉันอาจจะผิด แต่จากสิ่งที่ฉันเห็น "ควรใช้" setup_postdata () "เมื่อทำแบบสอบถามเลือกแบบกำหนดเอง (ไม่ใช่แค่ query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

เช่นกันหากคุณต้องการใช้แท็กเช่น "the_title ()" และ "the_permalink ()" ด้วยคิวรีเลือกแบบกำหนดเองนั้น ... คุณจะต้องใช้ชื่อตัวแปร$ postโดยเฉพาะ (ไม่ใช่ชื่อตัวแปรอื่น) ใน setup_postdata ( ) - คุณควรเรียก$ post ทั่วโลกก่อนที่ลูป "foreach" ของคุณ ...

ดังนั้นโดยทั่วไปให้ทำตามตัวอย่างในลิงค์ codex นั้น และอย่าเปลี่ยนชื่อตัวแปร $ post - มิฉะนั้นจะทำให้แตก

HTH


2
"คุณควรเรียกโพสต์ทั่วโลก $" ใช่! เหตุใดจึงไม่อยู่ใน Codex
AlxVallejo

27

แทนที่

foreach ( $childPosts as $cp ) : setup_postdata( $cp );

กับ

foreach ( $childPosts as $post ) : setup_postdata( $post );

ดังนั้นคุณจำเป็นต้องใช้ที่แน่นอนตัวแปรพร้อมกับ$postsetup_postdata()


สิ่งนี้แก้ไขปัญหาที่ฉันมี เพื่อนคู่ใจ
เจฟฟ์เค

2
ใครบางคนซื้อเบียร์ชายคนนี้! ขอบคุณ .. ความคิดใด ๆ ที่ทำให้ตัวแปรท้องถิ่นสามารถยุ่งกับsetup_postdata()อะไรได้บ้าง?
Odys

แปลก. ดูเหมือนว่าไม่มีเหตุผลที่จะต้องใช้ชื่อตัวแปรเฉพาะเมื่อคุณผ่านมันเป็นพารามิเตอร์
กาวิน

6

ขึ้นอยู่กับตำแหน่งที่คุณใช้ setup_postdata () (หากไม่ได้อยู่ในลูปหลักหรือในวิดเจ็ตฟังก์ชั่น / แถบด้านข้าง) คุณอาจต้องประกาศ -

global $post;

4

global post;ไม่ทำงานsetup_postdata($post);หากคุณต้องการใช้the_title()ตระกูลคำสั่ง ฯลฯ

อยู่ในhttps://codex.wordpress.org/Function_Reference/setup_postdata

ใช้แทน

// global $post; setup_postdata($post_object); //don't do this!
setup_postdata( $GLOBALS['post'] =& $post_object );

... ตรวจสอบให้แน่ใจว่าคุณ$post_objectเป็นวัตถุ WP_Post ที่ถูกต้อง


1
คำตอบนี้จริงแก้ปัญหาแทนดุด่า OP: p
nodws

1

เมื่อสอบถามการโพสต์เพียงแค่ใช้วนรอบปกติกับชุดของการขัดแย้งผ่านเข้าไป จากนั้นรีเซ็ตคิวรีในตอนท้าย

<?php 

    // makes query respect paging rules
    $paged = get_query_var('paged');

    // defining the arguements for the custom loop
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // neg 1 means all posts
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // end query

    // pass result into query_posts to get result
    query_posts($variablenameQuery);

?>
<?php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post(); ?>

        <?php // Individual Post Styling ?>

    <?php endwhile; ?>

        <?php // paged navigation - next post, previous post... ?>

    <?php else : ?>

    <h3>Ooops looks like there was an issue. Please <a href="<?php echo get_option('home'); ?>/contact" title="Contact Us">get in touch</a> with us and we'll get the problem fixed.</h3>

<?php endif; ?>

<!-- resets the WordPress Query -->
<?php wp_reset_query(); ?>

ขอบคุณมันใช้งานได้ แต่เพื่อความเข้าใจคุณรู้ไหมว่าทำไมsetup_postdata()ดูเหมือนไม่ทำงาน? ฉันใช้ผิดหรือเปล่า?
Jiew Meng

1
@jiewmeng - ดูว่าใช้$postแทนการ$cpแก้ไขปัญหา
t31os

ฉันลงคะแนนให้ fix @ t31os แนะนำ ตัวอย่างใน codex แสดงการใช้งานแบบนั้นและ $ post เป็นตัวแปรพิเศษใน WordPress ดังนั้นจึงอาจทำได้มากกว่าภายในวงที่คุณเคยใช้
Curtismchale

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