Cómo restablecer efectivamente el objeto post después de llamar a get_posts()

26 may 2011, 17:49:35
Vistas: 9.81K
Votos: 5

La función siguiente se llama desde mi index.php justo debajo del bloque de contenido principal. Su propósito es mostrar una lista de enlaces de las publicaciones más recientes. Sin embargo, necesito restablecer el objeto post una vez que esta función ha terminado (o la consulta de la barra lateral que sigue piensa que la publicación actual es la última que se ejecutó por esta función).

¿Cómo debo restablecer el post al post actual de la página?

He intentado agregar wp_reset_query() al final de la función, pero no produce los resultados que quiero (muestra múltiples posts en el área de contenido). Agradecería cualquier ayuda.

function myFunction(){
    $catHidden=get_cat_ID('hidden');
    $myquery = new WP_Query();
    $myquery->query(array('cat' => "-$catHidden",'post__not_in' => get_option('sticky_posts')));
    $myrecentpostscount = $myquery->found_posts;
    if ($myrecentpostscount > 0){ ?>
        <div>
            <h4>Título del Menú</h4>
            <ul>
            <?php 
            global $post;
            $myrecentposts = get_posts(array('post__not_in' => get_option('sticky_posts'), 'cat' => "-$catHidden",'numberposts' => get_option('latest_count')));
            foreach($myrecentposts as  $idxrecent=>$post) { ?>
                <li class="page_item">
                    <a href="<?php the_permalink(); ?>"><?php if(has_post_thumbnail() && get_option('show_thumbs')) the_post_thumbnail('thumbnail', array('class' => 'alignleft', 'style' => 'margin:0 10px 0 0;')); ?><?php the_title(); ?></a>
                    <?php  
                        if(has_post_thumbnail() && get_option('show_thumbs')) echo '<div style="clear:both">&nbsp;</div>';?>
                </li>
            <?php } 
    echo "</ul></div>";}}
0
Todas las respuestas a la pregunta 2
1

wp_reset_query() restablecerá la consulta a la consulta original que WordPress realizó en esta página. Así que si en algún lugar llamaste a query_posts(), no se restablecerá a esa consulta, sino a la consulta "principal".

Probablemente quieras usar wp_reset_postdata(), que restablece la variable $post al post actual en $wp_query.

Lo mejor es no sobrescribir la variable global $post en tu función. Todas las funciones de WordPress tienen variantes que aceptan un objeto post, por lo que no debería ser necesario usar la variable global allí.

26 may 2011 18:09:13
Comentarios

Eso fue todo Jan. Agregué wp_reset_postdata() al final de la función y ahora todo está bien. Sin embargo, no pude hacer que la función funcionara sin establecer global $post. Incluso pasar $post a la función no funciona como se esperaba.

Scott B Scott B
26 may 2011 18:26:31
0

Creo que el problema aquí puede tener que ver con el uso de incluir la declaración global $post, así como con el uso de get_posts.

Esencialmente estás solicitando los posts dos veces, una con el nuevo WP_Query (solo para verificar el conteo de los posts devueltos), y la segunda vez usando get_posts.

La primera vez que lo verificas, ha devuelto los posts bajo esa variable principal $myquery->posts;

Tampoco querrás usar found_posts, ya que no parece devolver el número correcto. Usa $myquery->post_count en su lugar.

Una vez que te deshagas del global $post, y del get_posts, cambia la variable found_posts - no tendrás más contaminación de datos. He usado esto:

$posts=new WP_Query(//detalles del array);
if($posts->have_posts()) : 
    while($posts->have_posts()) : $posts->the_post();
    $thispost=$posts->post;

        // haz cosas con el post, si necesitas cosas como the_permalink, usa get_permalink($thispost->ID) en su lugar.
    endwhile;
endif;

Y no arruinó mis datos en absoluto. Aunque es un poco más engorroso ya que no puedes usar los the_title, the_content, etc. regulares... pero puedes usar las funciones get basadas en los IDs de todos modos - y si necesitas esos filtros específicos para los regulares, siempre puedes aplicarlos al contenido extraído también.

26 may 2011 18:22:41