• 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 &#34<?php the_title(); ?>&#34"><?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?

Viewing 5 replies - 1 through 5 (of 5 total)
  • A próbowałeś sposób z WP_Query? Wydaje mi się dużo bezpieczniejszy w tym przypadku.

    Sorry, to jednak też nie zadziała.

    Może po prostu, jeśli zależy Ci na tej kolejności to użyj css do zamiany miejscami komentarzy z powiązanymi.

    Twórca wątku TadeuszD

    (@tadeuszd)

    Dzięki za sugestie.
    Sposób z WP_Query też próbowałem, ale zachowanie było identyczne. 🙁

    W międzyczasie znalazłem rozwiązanie problemu, przynajmniej częściowe. Otóż na końcu funkcji similar_posts(); należy wywołać funkcję wp_reset_query();. Funkcja ta ustawia wszystkie wymagane zmienne na pierwszy post z głównej pętli postów. Tak więc wywołany w następnej kolejności szablon comments_template(); wyświetla już poprawnie komentarze do właściwego postu.
    Tymczasowość tego rozwiązania wiąże się z tym, że wp_reset_query(); resetuje ustawienia zawsze na pierwszy post, a nie ostatnio czytany. Tak więc będzie działać tylko w przypadku szablonów single.php lub page.php. Na innych szablonach, gdzie jest wyświetlanych więcej niż jeden post, znowu nie będzie to działać…

    A gdyby przy WP_Query() nie wywoływać the_post(), a zamiast tego użyć metody get_posts()? Dzięki temu nie powinno zostać nadpisana zmienna globalna $post, a to chyba stąd wynikają problemy ($wp_query w ogóle nie będzie zmieniona).

    Twórca wątku TadeuszD

    (@tadeuszd)

    Sprawdzę, choć mam wątpliwości, czy to zadziała…
    Oprócz $post w kodzie WordPress’a używane są jeszcze inne zmienne globalne, jak np. $id.
    Poza tym wywołanie the_post(); jest chyba niezbędne, żeby przesunąć się na kolejny post?

    Przepraszam, że tak bez testowania piszę, ale niestety brak mi trochę czasu na to więc tylko podsuwam pomysły na sucho;) Wydaje mi się że jeśli wyciągniesz posty za pomocą get_post to będziesz mogl normalnie iterowac po nich za pomoca foreach.

Viewing 5 replies - 1 through 5 (of 5 total)
  • Temat ‘Pętla w pętli.’ jest zamknięty na nowe odpowiedzi.