setup_postdata () não parece estar funcionando?

12

Não sei por que, mas usei get_posts()para consultar alguns dados. Então eu usei setup_postdata()... Eu acho que é usado para que eu possa usar funções como the_permalink()etc com os novos dados do post?

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

mas parece que the_excerptcontém apenas o novo valor dos dados de postagem, por que isso? Acho que se eu usá- echo get_the_permalink($cp)lo funciona bem. Mas acho que a versão mais curta será melhor

Jiew Meng
fonte

Respostas:

32

Eu posso estar errado, mas pelo que estou vendo, "setup_postdata ()" deve ser usado ao fazer uma consulta de seleção personalizada (não apenas query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Além disso, se você quiser usar tags como "the_title ()" e "the_permalink ()" com essa consulta de seleção personalizada ... será necessário usar o nome da variável $ post especificamente (não outro nome de variável) em setup_postdata ( ) - TAMBÉM - você deve chamar global $ post antes do seu loop "foreach" ...

Então, basicamente, siga esse exemplo no link do codex. E não altere o nome da variável $ post - caso contrário, ele a interrompe.

HTH

Jennifer Stuart
fonte
2
"você deve chamar global $ post". SIM! Por que é que não no Codex
AlxVallejo
27

Substitua o

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

com

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

Então você precisa usar a $postvariável exata junto com o setup_postdata().

WP-Silver
fonte
Isso corrigiu o problema que eu estava tendo. Cheers mate
Jeff K.
2
Alguém compre uma cerveja para este homem! Obrigado .. Alguma idéia de por que / como uma variável local pode mexer setup_postdata()?
Odys
Esquisito. Parece tão ilógico exigir um nome de variável específico quando você o passa como parâmetro.
Gavin
6

Dependendo de onde você estiver usando setup_postdata () (se não estiver no loop principal ou em um widget de função / barra lateral, por exemplo), também será necessário declarar -

global $post;
David Gard
fonte
4

global post;não funciona setup_postdata($post);se você deseja usar a the_title()família de comandos etc.

Está em https://codex.wordpress.org/Function_Reference/setup_postdata

Em vez disso, use

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

... também verifique se você $post_objecté um objeto WP_Post válido.

Ryan Taylor
fonte
11
Essa resposta realmente resolve o problema, em vez de repreender o OP: p
nodws
1

Ao consultar posts, basta usar o loop normal com um conjunto de argumentos passados ​​para ele. Em seguida, redefina a consulta no final.

<?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
fonte
Obrigado, isso funciona. Mas apenas para entender, você sabe por setup_postdata()que não parece funcionar? Eu usei errado?
Jiew Meng
11
@ jiewmeng - Veja se o uso em $postvez de $cpcorrige o problema.
T31os
Eu voto na correção @ t31os sugere. Os exemplos no codex mostram que o uso assim e $ post é uma variável especial no WordPress, portanto, ele pode fazer mais dentro de um loop do que o que você usou.
Curtismchale
@ t31os, @curtismchale, que também não pareceu funcionar. Ainda dá o mesmo resultado
Jiew Meng 20/02