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()";' )
);

Jak wykorzystać ten kod?

Należy go wstawić w function.php uzywanego motywu, oczywiście nie w takiej formie, bo nie wyświetlimi pojedynczego wpisu nawet, bo będzie losowy, ale z odpowiednimi warunkami.

Przykład losujący tylko na stronie kategorii:

add_filter( 'posts_orderby', 'iworks_random_order' );
function iworks_random_order( $order ) {
    if ( is_category() ) {
        return "rand()";
    }
    return $order;
}

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ć.

Uzupełniłem wpis o przykład losowania w kategorii.

Dodaj komentarz

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