Pętla w pętli.
-
Na wstępie witam wszystkich!
Piszę właśnie stronę opartą na WordPress’ie i stanąłem przed koniecznością obsługi własnej pętli obsługi postów wewnątrz głównej pętli obsługi postów. Na stronie Codex-u przeczytałem, że można to zrobić przez utworzenie własnego obiektu WP_Query lub poprzez przechowanie globalnego obiektu $wp_query w tymczasowej zmiennej. Problem w tym, że to nie do końca działa… 🙁Poniżej poglądowy kod szablonu single.php :
if (have_posts()) : while (have_posts()) : the_post(); the_content('Czytaj dalej...'); endwhile; similar_posts(); comments_template(); else : echo "Nic nie znaleziono."; endif;
W powyższym kodzie nie ma nic niezwykłego poza wywołaniem funkcji similar_posts(), która wykonuje własne zapytanie:
<?php $temp_query = clone $wp_query; query_posts(array( 'category__and' => $catlist, 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'ASC')); ?> <?php if ( have_posts() ) : ?> <h3>Podobne wpisy:</h3> <ul> <?php while ( have_posts() ) : the_post(); ?> <li> <a href="<?php the_permalink() ?>" rel="bookmark" title="Przejdź do "<?php the_title(); ?>""><?php the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php endif; endif; $wp_query = clone $temp_query; ?>
Problem polega na tym, że pomimo zachowania i późniejszego odtworzenia obiektu $wp_query, szablon comments_template() wyświetla komentarze do ostatniego postu wyświetlonego przez similar_posts() zamiast do głównego postu. Oczywiście, jeśli zamienię similar_posts() i comments_template() kolejnością, to wszystko jest OK, ale nie o to tu chodzi.
Analizując kod WordPress’a znalazłem jeszcze dwie zmienne oprócz $wp_query, które trzeba było zachować, aby w pełni odtworzyć stan środowiska sprzed wywołania similar_posts(). Jednak takie rozwiązanie wydaje mi się mocno niekoszerne. Nie mam gwarancji, że w nowszych wydaniach WordPress’a będzie to działać tak samo. 🙁
Czy ktoś ma jakieś inne, bardziej zgodne z filozofią WP, propozycje rozwiązania tego problemu?
- Temat ‘Pętla w pętli.’ jest zamknięty na nowe odpowiedzi.