Korzystam z następującego kodu, aby pobrać posty:
<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');
while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<div class="meta">
By <?php the_author() ?>
</div>
<div class="storycontent">
<?php the_excerpt(); ?>
</div>
<?php endwhile; ?>
Czy muszę używać wp_reset_query()
? Jeśli tak, to gdzie mam to umieścić?
the_post()
metodę (tj.$my_custom_query->the_post()
), Uzupełniasz zmienne wpisu, na które patrzy główne zapytanie, reset wypełnia te zmienne poprzednimi danymi, kiedy je wywołujesz. Dobrą praktyką jest używanie resetowania po niestandardowych zapytaniach.Odpowiedzi:
Cześć @janoChen:
Prosta odpowiedź: nie.
Poniżej znajduje się kod PHP dla funkcji
wp_reset_query()
z/wp-includes/query.php
WordPRess v3.0.4, a także później wywołane funkcje. Widać, że chodzi przede wszystkim o modyfikację zmiennych globalnych.Podczas korzystania
new WP_Query($args)
będziesz przypisywać wartość zwracaną z wartości do zmiennej lokalnej, więc jeśli nie robisz czegoś tak skomplikowanego, że znasz już odpowiedź na to pytanie, nie, nie musisz dzwonićwp_reset_query()
:-Mikrofon
źródło
the_post()
w swoim kodzie, najlepsze praktyki nakazują, aby musiał z niego korzystaćwp_reset_postdata()
.wp_reset_query()
wywołańwp_reset_postdata()
, więc to zadziała, chociaż druga rzeczwp_reset_query()
- resetowanie$wp_query
zmiennej globalnej - nie jest konieczne, ale w tym przypadku nie jest szkodliwe. Tak więc odpowiedź brzmi TAKNie jest to konieczne
WP_Query
samo w sobie, ale jest konieczne (lub przynajmniej dobre, aby zrobić), jeśli użyjesz powiązanych funkcji / metod (takich jakthe_post()
lubsetup_postdata()
), aby wypełnić zmienne globalne danymi.Zasadniczo tworzenie nowego
WP_Query
obiektu to tylko pobieranie danych, ale użycie go do uruchomienia aktywnej pętli i udostępnienie danych tagom szablonu modyfikuje środowisko i dobrze jest zresetować wszystko później.Ogólnie rzecz biorąc - nazywanie go nie jest znaczącą utratą wydajności, więc łatwiej jest zawsze zadzwonić, niż zdecydować, czy powinieneś lub zapomnieć o tym i mieć coś tajemniczo zepsutego.
Aktualizacja
wp_reset_postdata()
funkcja wydaje się bardziej odpowiednim wyborem.wp_reset_query()
resetuje zmienne globalne$wp_query
(któreWP_Query
nie wpływają na niestandardowy obiekt) i$post
(które mogłyby jak wyżej)wp_reset_postdata()
przywraca tylko$post
, co powinno wystarczyć.źródło
Nie. Jeśli utworzysz instancję własnego obiektu WP_Query, możesz zrobić to, co chcesz. Jeśli jednak manipulujesz
global $wp_query
zmienną, to w globalnej przestrzeni nazw wpływasz na skrypt każdego użytkownika, który jednocześnie używa tej zmiennej. A jeśli zrobisz coś, aby zmienić zawarte w nim dane, musisz je zresetować po zakończeniu używania.źródło
Jeśli używasz niestandardowego zapytania w ten sposób
Wtedy nie napotkasz problemów. W przeciwnym razie, jeśli na tej samej stronie znajduje się kolejna pętla, musisz uzyskać nieoczekiwane wyniki. Nie użyłem wp_reset_query () w powyższym kodzie (który został umieszczony w moim pliku header.php. Potem, gdy przeszedłem do single.php, głównie otrzymałem strony ze szczegółami innych kategorii, co było frustrujące. Później zdałem sobie sprawę, że zapomniałem zresetować zapytanie u góry. Wkrótce zaczęło działać jak urok.
źródło