Cum să resetezi efectiv obiectul post după apelarea get_posts() în WordPress

26 mai 2011, 17:49:35
Vizualizări: 9.81K
Voturi: 5

Funcția de mai jos este apelată din fișierul meu index.php chiar sub blocul principal de conținut. Scopul ei este să afișeze o listă de link-uri către cele mai recente articole. Totuși, trebuie să resetez obiectul post după ce această funcție se execută (altfel interogarea din bara laterală va crede că postul curent este ultimul post executat de această funcție).

Cum ar trebui să resetez postul înapoi la postul curent al paginii?

Am încercat să adaug wp_reset_query() la sfârșitul funcției, dar nu produce rezultatele dorite (afișează mai multe posturi în zona de conținut). Orice ajutor este binevenit.

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>Titlu Meniu</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
Toate răspunsurile la întrebare 2
1

wp_reset_query() va reseta interogarea la interogarea originală pe care WordPress a efectuat-o pe această pagină. Deci, dacă ai apelat undeva query_posts(), nu va reveni la acea interogare, ci la interogarea "principală".

Probabil dorești să folosești wp_reset_postdata(), care resetează variabila $post la postul curent din $wp_query.

Cea mai bună practică este să nu suprascrii variabila globală $post în funcția ta. Toate funcțiile WordPress au variante care acceptă un obiect post, deci nu ar trebui să fie nevoie să folosești variabila globală acolo.

26 mai 2011 18:09:13
Comentarii

Asta a fost tot, Jan. Am adăugat wp_reset_postdata() la sfârșitul funcției și acum totul funcționează corect. Cu toate acestea, nu am reușit să fac funcția să funcționeze fără a seta global $post. Chiar și transmiterea lui $post în funcție nu funcționează așa cum era de așteptat.

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

Cred că problema aici poate fi legată de utilizarea declarației globale $post, precum și de utilizarea funcției get_posts.

În esență, apelezi posturile de două ori - o dată cu noua interogare WP_Query (doar pentru a verifica numărul de postări returnate), și a doua oară folosind get_posts.

Prima dată când verifici, a returnat postările sub acea variabilă principală $myquery->posts;

De asemenea, nu dorești să folosești found_posts, deoarece acesta nu pare să returneze numărul corect. Folosește în schimb $myquery->post_count.

Odată ce elimini global $post și get_posts, și schimbi variabila found_posts - nu vei mai avea nicio poluare a datelor. Am folosit acest lucru:

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

        // fă lucruri cu postarea, dacă ai nevoie de lucruri precum the_permalink, folosește get_permalink($thispost->ID) în schimb.
    endwhile;
endif;

și nu mi-a corupt datele deloc. Deși este puțin mai incomod, deoarece nu poți folosi the_title obișnuit, the_content, etc.. dar poți folosi cele bazate pe ID-uri oricum - iar dacă ai nevoie de acele filtre specifice pentru cele obișnuite, le poți aplica și pe conținutul extras.

26 mai 2011 18:22:41