¿setup_postdata () no parece funcionar?

12

No estoy seguro de por qué, pero solía get_posts()consultar algunos datos. Luego usé setup_postdata()... ¿Creo que se usa para poder usar funciones como the_permalink()etc. con los nuevos datos de publicación?

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

pero parece que solo the_excerptcontiene el nuevo valor de datos de publicación, ¿por qué es eso? Me parece que si lo uso echo get_the_permalink($cp)funciona bien. Pero creo que la versión más corta será mejor.

Jiew Meng
fuente

Respuestas:

32

Podría estar equivocado, pero por lo que estoy viendo, "setup_postdata ()" debe usarse al hacer una consulta de selección personalizada (no solo query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Además, si desea usar etiquetas como "the_title ()" y "the_permalink ()" con esa consulta de selección personalizada ... deberá usar el nombre de variable $ post específicamente (no otro nombre de variable) en setup_postdata ( ) - ASÍ COMO - debe llamar a $ post global antes de su bucle "foreach" ...

Básicamente, sigue ese ejemplo en ese enlace del códice. Y no cambie el nombre de la variable $ post, de lo contrario lo rompe.

HTH

Jennifer Stuart
fuente
2
"deberías llamar a $ post global". ¡SI! ¿Por qué no está en el Codex
AlxVallejo
27

Reemplace la

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

con

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

Por lo tanto, debe usar la $postvariable exacta junto con setup_postdata().

WP-Silver
fuente
Esto solucionó el problema que estaba teniendo. Saludos compañero
Jeff K.
2
¡Alguien compre una cerveza para este hombre! Gracias. ¿Alguna idea de por qué / cómo puede meterse con una variable local setup_postdata()?
Odys
Extraño. Parece tan ilógico requerir un nombre de variable específico cuando lo pasa como parámetro.
Gavin
6

Dependiendo de dónde esté utilizando setup_postdata () (si no está en el bucle principal, o en un widget de función / barra lateral, por ejemplo), es posible que también deba declarar:

global $post;
David Gard
fuente
4

global post;no funciona setup_postdata($post);si desea utilizar la the_title()familia de comandos, etc.

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

En lugar de usar

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

... también asegúrese de que $post_objectsea ​​un objeto WP_Post válido.

Ryan Taylor
fuente
1
Esta respuesta realmente resuelve el problema, en lugar de regañar al OP: p
asiente con la cabeza el
1

Al consultar publicaciones simplemente use el bucle normal con un conjunto de argumentos pasados. Luego restablezca la consulta al 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
fuente
Gracias, esto funciona. Pero solo para entender, ¿sabes por qué setup_postdata()no parece funcionar? ¿Lo usé mal?
Jiew Meng
1
@jiewmeng: comprueba si usar en $postlugar de $cpsoluciona el problema.
t31os
Voto por la solución que sugiere @ t31os. Los ejemplos en el códice muestran el uso de esa manera y $ post es una variable especial en WordPress, por lo que podría hacer más dentro de un bucle de lo que has usado.
curtismchale
@ t31os, @curtismchale, eso tampoco parecía funcionar. Todavía da el mismo resultado
Jiew Meng