setup_postdata() no parece estar funcionando

19 feb 2011, 16:50:26
Vistas: 43.7K
Votos: 17

No estoy seguro por qué pero he usado get_posts() para consultar algunos datos. Luego usé setup_postdata() ... Creo que se usa para poder utilizar funciones como the_permalink() etc con los nuevos datos del 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() ?>">Leer más ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

pero parece que solo the_excerpt contiene el nuevo valor de datos del post, ¿por qué es eso? Me doy cuenta de que si uso echo get_the_permalink($cp) funciona bien. Pero creo que la versión más corta sería mejor

0
Todas las respuestas a la pregunta 6
2
44

Puedo estar equivocado, pero por lo que veo, "setup_postdata()" debería usarse cuando se hace una consulta select personalizada (no solo query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Además, si deseas usar etiquetas como "the_title()" y "the_permalink()" con esa consulta select personalizada ... necesitarás usar específicamente el nombre de variable $post (no otro nombre de variable) en setup_postdata() - TAMBIÉN - deberías llamar a global $post antes de tu bucle "foreach"...

Así que básicamente sigue ese ejemplo en el enlace del codex. Y no cambies el nombre de la variable $post - de lo contrario se romperá.

Espero que esto ayude

22 feb 2011 20:02:56
Comentarios

"deberías llamar a global $post" . ¡SÍ! ¿Por qué no está eso en el Codex?

AlxVallejo AlxVallejo
26 abr 2014 20:11:39

2021 y esto todavía me causa problemas jajaja

Andrew Schultz Andrew Schultz
25 feb 2021 14:04:07
5
41

Reemplaza el

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

con

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

Por lo tanto, necesitas usar exactamente la variable $post junto con la función setup_postdata().

25 ago 2011 00:12:28
Comentarios

Esto resolvió el problema que estaba teniendo. ¡Saludos, compañero!

Jeff K. Jeff K.
3 mar 2012 00:05:04

¡Alguien le compre una cerveza a este hombre! Gracias... ¿Alguna idea de por qué/cómo una variable local puede interferir con setup_postdata()?

Odys Odys
7 nov 2016 16:09:53

Extraño. Parece tan ilógico requerir un nombre de variable específico cuando lo estás pasando como parámetro.

Gavin Gavin
14 dic 2018 09:51:02

@Gavin No sé por qué más personas no cuestionan lo extraña que es parte de la lógica de WP. Lo raro ahora parece ser lo normal...

JDandChips JDandChips
24 jul 2020 19:47:59

Otra hermosa implementación por Automattticcc.

marek.m marek.m
4 nov 2021 17:22:08
1
12

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

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

En su lugar, utiliza:

// global $post; setup_postdata($post_object); // ¡no hagas esto!
setup_postdata( $GLOBALS['post'] =& $post_object );

...también asegúrate de que tu $post_object sea un objeto WP_Post válido.

14 sept 2016 02:40:49
Comentarios

Esta respuesta realmente resuelve el problema, en lugar de regañar al OP :p

nodws nodws
24 nov 2017 01:20:10
1
10

Dependiendo de dónde estés usando setup_postdata() (si no es en el bucle principal, o en una función/widget de la barra lateral, por ejemplo), también puede que necesites declarar -

global $post;
21 sept 2011 18:50:21
Comentarios

¿Puedes explicar por qué?

Peter Højlund Andersen Peter Højlund Andersen
4 dic 2021 16:16:36
0

2 aspectos importantes para que esto funcione,

  1. usa la variable global $post para configurar los datos del post, de lo contrario las funciones del loop no verán tu objeto de post personalizado.

  2. MUY IMPORTANTE: asegúrate de llamar a la función wp_reset_postdata() al final del loop, de lo contrario podrías tener errores extraños que serán muy difíciles de depurar.

    <?php
     global $post;
    
    $myposts = get_posts( array(
        'posts_per_page' => 5,
        'offset'         => 1,
        'category'       => 1
    ) );
    
    if ( $myposts ) :
        foreach ( $myposts as $post ) :
          setup_postdata( $post ); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        endforeach; 
        wp_reset_postdata();
    endif;
    ?>
    
9 nov 2021 14:07:53
5

Al consultar publicaciones, simplemente usa el bucle normal con un conjunto de argumentos pasados a él. Luego restablece la consulta al final.

<?php 

    // hace que la consulta respete las reglas de paginación
    $paged = get_query_var('paged');

    // definiendo los argumentos para el bucle personalizado
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // -1 significa todas las publicaciones
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // fin de la consulta

    // pasa el resultado a query_posts para obtener el resultado
    query_posts($variablenameQuery);

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

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

        <?php // Estilo de publicación individual ?>

    <?php endwhile; ?>

        <?php // navegación paginada - siguiente publicación, publicación anterior... ?>

    <?php else : ?>

    <h3>¡Vaya! Parece que hubo un problema. Por favor <a href="<?php echo get_option('home'); ?>/contact" title="Contáctanos">ponte en contacto</a> con nosotros y solucionaremos el problema.</h3>

<?php endif; ?>

<!-- restablece la consulta de WordPress -->
<?php wp_reset_query(); ?>
19 feb 2011 16:55:33
Comentarios

Gracias, esto funciona. Pero solo para entender, ¿sabes por qué setup_postdata() parece no funcionar? ¿Lo usé incorrectamente?

Jiew Meng Jiew Meng
19 feb 2011 17:16:37

@jiewmeng - Prueba usando $post en lugar de $cp para ver si resuelve el problema.

t31os t31os
20 feb 2011 03:28:43

Yo voto por la solución que sugiere @t31os. Los ejemplos en el codex 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 que lo que has usado.

curtismchale curtismchale
20 feb 2011 03:54:04

@t31os, @curtismchale, eso tampoco pareció funcionar. Sigue dando el mismo resultado

Jiew Meng Jiew Meng
20 feb 2011 04:11:38

Antiguo, lo sé, pero NO uses query_posts() a menos que SEPAS que lo necesitas. Es ineficiente. Mira esta imagen útil con las alternativas: https://www.rarst.net/images/query_functions.png

Tex0gen Tex0gen
29 mar 2023 17:00:45