WordPress: losowa kolejność postów

Jak losowo wyświetlać posty? Nic prostszego, wystarczy jedna linijka kodu (tu rozbite, żeby dobrze się wyświetlało:

add_filter(
    'posts_orderby',
    create_function( '$a', 'return "rand()";' )
);

Liczba komentarzy: 7

Sebastian - Gravatar

17 stycznia 2012 o godzinie 15:19 Sebastian skomentował:

A jak to wygląda w przypadku paginacji?
Bo wydaje mi się, że przy przechodzeniu na kolejną stronę walidacji podaje kolejne, wylosowane posty, bez zawężania wyników o wyświetlone już wpisy.
Ale nie jestem w 100% pewien, bo moje testy trwały ułamek sekundy ;)

Sebastian - Gravatar

17 stycznia 2012 o godzinie 15:23 Sebastian skomentował:

Po krótkich testach już się upewniłem, że jest tak, jak przed chwilą napisałem.
Ktoś ma jakiś pomysł na uwzględnienie tego?

Marcin - Gravatar

17 stycznia 2012 o godzinie 16:59 Marcin skomentował:

Trzeba dodać warunki, is_paged, is_single i nie losować wtedy. Tutaj losuje zawsze, nie sprawdzając.

Michał - Gravatar

31 stycznia 2012 o godzinie 9:30 Michał skomentował:

A po co filtry do tego. Przecież to jest zaimplementowane w argumentach funkcji get_posts().
Wystarczy dodać do tej funkcji argument:

‘orderby’ => ‘rand’

Nie trzeba się bawić w warunki, globalne filtry. Włączamy losowanie tam gdzie potrzebujemy.

Marcin - Gravatar

31 stycznia 2012 o godzinie 11:27 Marcin skomentował:

@Michał: prawie masz rację. Prawie, ponieważ funkcji get_posts używa się poza the loop. Przeciętny motyw nigdy nie używa tej funkcji, raczej używa „while ( have_posts() )”, do którego nie wepniesz się z „orderby”.

Michał - Gravatar

31 stycznia 2012 o godzinie 11:58 Michał skomentował:

@Marcinie oczywiście, że masz rację. Ale ..

to samo ‘orderby’=>’rand’ jest dostępne ogólnie w WP_Query co powoduje, że można go użyć praktycznie wszędzie gdzie występuje zapytanie do bazy danych o posty w tym query_posts() czy wspomniane get_posts itd.

Musisz pamiętać, że globalne dodanie proponowanego przez Ciebie filtru wszędzie w całym temacie będzie powodowało wyświetlanie losowych postów (niezależnie od paginacji jak zauważył @Sebastian). Trzeba stosować różne warunki aby to ujarzmić. Zastosowanie tego prostego kodu w typowym temacie zasadniczo rozłoży funkcjonalność tematu na łopatki.

Więc nadal łatwiej dodać 2 linijki kodu z funkcją

global $wp_query;
$args = array_merge( $wp_query->query, array( ‘orderby’ => ‘rand’ ) );
query_posts( $args );

przed konkretną pętlą, czy wykorzystać ten argument gdzieś w temacie z funkcją get_posts.

Marcin - Gravatar

31 stycznia 2012 o godzinie 12:42 Marcin skomentował:

@Michał: to co podałem we wpisie, to przepis JAK zrobić losowanie, a nie GDZIE je stosować.

Dodaj komentarz

Należy wpełnić pola oznaczone znakiem gwiazdki "*". Proszę zapoznać się z zasadami komentowania.

Przeczytaj poprzedni wpis:
WordPress 3.3 dashboard
Aktualizacja do 3.3.1

Każdy kto zdążył już do tej pory zaktualizować WordPressa do wersji 3.3 powinien jak najszybciej wykonać aktualizację do wersji 3.3.1,...

Zamknij

Dodatek zrealizowany za pomocą wtyczki upPrev.