Come resettare efficacemente l'oggetto post dopo aver chiamato get_posts()

26 mag 2011, 17:49:35
Visualizzazioni: 9.81K
Voti: 5

La funzione qui sotto viene chiamata dal mio index.php appena sotto il blocco di contenuto principale. Il suo scopo è mostrare una lista di link degli ultimi post. Tuttavia, ho bisogno di resettare l'oggetto post una volta che questa funzione ha terminato (altrimenti la query della sidebar che segue penserà che il post corrente sia l'ultimo post eseguito da questa funzione).

Come dovrei resettare il post al post corrente della pagina?

Ho provato ad aggiungere wp_reset_query() alla fine della funzione, ma non produce i risultati che voglio (genera multipli post nell'area di contenuto). Qualsiasi aiuto è molto apprezzato.

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>Titolo Menu</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
Tutte le risposte alla domanda 2
1

wp_reset_query() reimposta la query alla query originale che WordPress ha eseguito su questa pagina. Quindi se da qualche parte hai chiamato query_posts(), non verrà ripristinata a quella query, ma alla query "principale".

Probabilmente vuoi usare wp_reset_postdata(), che reimposta la variabile $post al post corrente in $wp_query.

La cosa migliore è non sovrascrivere la variabile globale $post nella tua funzione. Tutte le funzioni di WordPress hanno varianti che accettano un oggetto post, quindi non dovrebbe esserci bisogno di usare la variabile globale lì.

26 mag 2011 18:09:13
Commenti

Era questo Jan. Ho aggiunto wp_reset_postdata() alla fine della funzione e ora tutto funziona bene. Tuttavia, non sono riuscito a far funzionare la funzione senza impostare global $post. Anche passare $post alla funzione non funziona come previsto.

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

Penso che il problema qui possa essere legato all'uso dell'istruzione globale $post, così come all'utilizzo di get_posts.

Stai essenzialmente richiamando i post due volte, una con il nuovo WP_Query (solo per verificare il conteggio dei post restituiti), e la seconda volta utilizzando get_posts.

La prima volta che lo controlli, ha restituito i post sotto quella variabile principale $myquery->posts;

Inoltre non vuoi usare found_posts, poiché non sembra restituire il numero corretto. Usa invece $myquery->post_count.

Una volta che ti liberi del globale $post, e di get_posts, cambia la variabile found_posts - non avrai più alcuna contaminazione dei dati. Ho usato questo:

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

        // fai operazioni con il post, se hai bisogno di cose come the_permalink, usa get_permalink($thispost->ID) invece.
    endwhile;
endif;

e non ha rovinato affatto i miei dati. Anche se è un po' più scomodo dato che non puoi usare i soliti the_title, the_content, ecc.. ma puoi comunque usare quelli basati sugli id - e se hai bisogno di quei filtri specifici per i regolari, puoi sempre utilizzarli sul contenuto estratto applicandoli anche lì.

26 mag 2011 18:22:41