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;
}

Poprzedni

Aktualizacja do 3.3.1

Następne

WordPress: Jak skasować starsze niż miesiąc wersje wpisów?

24 komentarze

  1. Sebastian

    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 ;)

  2. Sebastian

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

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

  4. Michał

    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.

  5. @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”.

  6. Michał

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

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

  8. Mateusz

    Witam, a jak zrobić by wyszukiwarka wyświetlała po jednym ale losowym wpisie oczywiście pasującym do wyrażenia wyszukiwania?

  9. @Mateusz: musisz wyszukać dokumenty, a potem losowo wyświetlić jeden z nich.

  10. Mateusz

    Hmm, dzięki za szybką odpowiedź. Jednak to co mi napisałeś za dużo mi nie mówi, a zależy mi bardzo na tym zagadnieniu.
    Czyli wyszukiwanie ma odbywać się normalnie a wyniki wyszukiwania trzeba ustawić aby losowo się wyświetlały pojedynczo tak?
    Moja znajomość obsługi PHP jest na bardzo niskim poziomie, byłbym bardzo wdzięczny za bardziej szczegółową odpowiedź

  11. @Mateusz: jeżeli Twój motyw ma plik search.php, to w nim wyświetlanie realizowane jest za pomocą „while( have_posts() )” i w środku tej pętli trzeba wyświetlić „losowy” post, a reszty po prostu nie wyświetlać.

  12. Mateusz

    Nie wiem czy dobrze to zrobiłem ale chyba działa. Zaraz sprawdzę na innych rekordach.
    Dodałem: przed:
    Może tak być?

  13. Mateusz

    Coś mi kodu nie dodało.
    Dodałem : przed:

    Może tak być czy nie bardzo?

  14. Kod wrzucaj na pastebin.com

  15. Adrian

    witam, swietnie wszystko działa. uzyłem kodu mam jednak jeden problem. Kod ten sprawił że wpisy które są wpisami opisującymi domy noclegowe są wyświetlane losowo. Jak wymusic żeby wordpress kategorię z nr 15 (aktualnosci) pokazywał według daty od najnowszych do najstarszych? wie ktos i podpowie jak przeedytować kod? :)

  16. Dodaj do warunku:

    is_category() && !is_category( 15 )

  17. Adrian

    działa idealnie :) dziękuję bardzo za podpowiedz i gratuluję wiedzy :)

  18. oliver87

    Dodatnie filtra to fajna sprawa.

    A gdyby tak do tego było możliwe sortowanie wpisów (na stronie blogu dla niezalogowanego użytkownika) według daty, alfabetycznie itp – podobnie jak na allegro – możemy sortować sobie według kończących się, najdroższych, najtańszych itd.

    Ktoś z Was może spotkał taki plugin?

  19. @oliver87 – ja niestety nie znam.

  20. Witam,
    w jaki sposob przesortowac tak posty na stronie glownej ?

  21. @Tomasz: trzeba dodać i obsłużyć warunek is_home().

  22. Tomasz

    dzieki, zadzialalo ;)

  23. Romuald

    Witam,
    także chciałbym by na moim blogu losowo pojawiały się posty, ale nie wiem gdzie i jak coś dodać. Przeczytałem wszystkie podpowiedzi i nie wiem jak się za to zabrać. Czy może mam zbyt ubogą wersję bloga? Proszę o pomoc za którą z góry dzięki!

  24. @Romuald: nie za bardzo rozumiem „ubogość”. Pamiętaj jedno, większość opisywanych przeze mnie rzeczy jest możliwa tylko w przypadku własnego hostingu. Jeżeli kupujesz u kogoś usługę w modelu utrzymaniowym, to (zazwyczaj) nie da się ich zastosować.

    Opisz coś więcej, albo napisz mi maila.

Oparte na WordPress & Theme by Anders Norén