setup_postdata () tampaknya tidak berfungsi?

12

Saya tidak yakin mengapa, tetapi saya sudah terbiasa get_posts()menanyakan beberapa data. Lalu saya menggunakan setup_postdata()... Saya pikir itu digunakan sehingga saya dapat menggunakan fungsi seperti the_permalink()dll dengan data posting baru?

<?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; ?>

tetapi tampaknya hanya the_excerptberisi nilai data posting baru, mengapa begitu? Saya menemukan bahwa jika saya menggunakannya echo get_the_permalink($cp)berfungsi dengan baik. Tapi saya pikir versi yang lebih pendek akan lebih baik

Jiew Meng
sumber

Jawaban:

32

Saya mungkin salah, tetapi dari apa yang saya lihat, "setup_postdata ()" harus digunakan ketika melakukan kueri pemilihan khusus (bukan hanya query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Selain itu, jika Anda ingin menggunakan tag seperti "the_title ()" dan "the_permalink ()" dengan kueri pemilihan khusus ... Anda harus menggunakan nama variabel $ post secara khusus (bukan nama variabel lain) di setup_postdata ( ) - SERTA - Anda harus menelepon global $ post sebelum loop "foreach" Anda ...

Jadi pada dasarnya ikuti contoh itu di tautan kodeks itu. Dan jangan mengubah nama variabel $ post - jika tidak maka akan merusaknya.

HTH

Jennifer Stuart
sumber
2
"Anda harus menghubungi global $ post". IYA! Mengapa itu tidak ada dalam Codex
AlxVallejo
27

Ganti

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

dengan

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

Jadi, Anda perlu menggunakan $postvariabel yang tepat bersama dengan setup_postdata().

WP-Perak
sumber
Ini memperbaiki masalah yang saya alami. Cheers mate
Jeff K.
2
Seseorang membelikan bir untuk pria ini! Terima kasih .. Adakah yang tahu mengapa / bagaimana variabel lokal dapat mengacaukannya setup_postdata()?
Odys
Aneh. Tampaknya tidak masuk akal untuk memerlukan nama variabel tertentu ketika Anda meneruskannya sebagai parameter.
Gavin
6

Tergantung di mana Anda menggunakan setup_postdata () (jika tidak di loop utama, atau di widget fungsi / sidebar, misalnya), Anda mungkin juga perlu mendeklarasikan -

global $post;
David Gard
sumber
4

global post;tidak berfungsi setup_postdata($post);jika Anda ingin menggunakan the_title()keluarga perintah dll.

Ada di https://codex.wordpress.org/Function_Reference/setup_postdata

Sebaliknya gunakan

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

... juga pastikan $post_objectobjek WP_Post Anda valid.

Ryan Taylor
sumber
1
Jawaban ini sebenarnya memecahkan masalah, alih-alih memarahi OP: p
nodws
1

Saat meminta posting, gunakan saja loop normal dengan serangkaian argumen yang dilewatkan ke dalamnya. Kemudian setel ulang kueri di akhir.

<?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(); ?>
curtismchale
sumber
Terima kasih, ini berhasil. Tapi hanya untuk pengertian, tahukah Anda mengapa setup_postdata()tampaknya tidak berhasil? Apakah saya salah menggunakannya?
Jiew Meng
1
@jiewmeng - Lihat apakah menggunakan $postalih-alih $cpmemperbaiki masalah.
t31os
Saya memilih saran perbaikan @ t31os. Contoh-contoh pada kodeks menunjukkan penggunaan seperti itu dan $ post adalah variabel khusus di WordPress sehingga mungkin melakukan lebih banyak di dalam loop daripada apa yang Anda gunakan.
curtismchale
@ t31os, @curtismchale, sepertinya tidak berhasil juga. Itu masih memberikan hasil yang sama
Jiew Meng