Artykuły:

  • data publikacji: 25.03.2009

    Query_posts, czyli jak ujarzmić loopa część 1.

    kategoria: Wordpress autor: palmiak

    Query_posts, czyli jak ujarzmić loopa część 1.

    WordPress, wbrew temu co myśli o nim wiele osób, od długiego czasu nie służy tylko do blogów. Chociażby dzięki funkcji query_posts(), możemy zachęcić naszego WordPressa do wyświetlania tylko tych wpisów które chcemy zobaczyć. W tym wpisie postaram się przedstawić Wam kilka przykładów zastosowania tej funkcji.

    The Loop w wersji podstawowej

    Loop to nic innego jak pętla, dzięki której wyświetlane są wpisy. Do zastosowań blogowych najczęściej wystarcza jej podstawowa forma, czyli:

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    nasz wpis
    <?php endwhile; else: ?>
    <p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
    <?php endif; ?>

    Oczywiście jest tego kilka drobnych modyfikacji, ale sprowadza się to wszystko właśnie do tego. Dzięki temu kodowi WP wypisuje albo najnowsze wpisy (strona główna), albo wpisy z poszczególnej kategorii (archiwa) etc.

    Kategorie

    Załóżmy, że nie chcemy aby na stronie głównej pokazywały nam się wpisy z kategorii o ID=3. By to zrobić wystarczy skorzystać z funkcji query_posts() na index.php:

    <?php query_posts('cat=-3'); ?>

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    nasz wpis
    <?php endwhile; else: ?>
    <p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
    <?php endif; ?>
     

    Jak łatwo zauważyć query_posts() umieszczamy przed loopem, a całą resztą zajmują się argumenty tej funkcji. W naszym przypadku cat=-3. Analogicznie, jeżeli chcemy wyświetlić tylko wpisy z kategorii o ID=3 to piszemy cat=3.

    A co jeżeli nie chcemy, żeby userzy widzieli kategorię o ID'ach 2,3,4? cat=-2,-3,-4.

    Utrudnijmy sobie teraz zadanie i spróbujmy wyświetlić wpisy z kategorii o ID=7 z roku 2007. cat=7&year=2007.

    Jak ktoś ma ochotę może jeszcze spróbować pobawić się z kolejnością wyświetlania dodając order=ASC|DESC. Jak już jesteśmy przy kolejności warto też wiedzieć po czym sortujemy. Jeżeli byśmy chcieli posortować alfabetycznie wpisy byśmy musieli napisać: order=ASC&orderby=title. Jeżeli byśmy chcieli wypisać kilka losowych postów korzystamy z orderby=rand.

    Nic nie stoi nam też na drodze, by zamiast ID kategorii korzystać z jej nazwy - category_name=wordpress. Nietrudno się domyślić co to zrobi.

    Na koniec pewien rarytasik. Bardzo przydatny, jeżeli chcemy zrobić zaawansowaną wyszukiwarkę. Załóżmy, że chcemy wyświetlić wpisy, które są jednocześnie w kategorii o ID=2 i o ID=7. Można oczywiście bawić się w pisanie zapytań SQLowych, jednak można prościej - array('category__and' => array(2,7)).

    Z kategoriami umiemy już prawie wszystko. Przedstawię Wam jeszcze cztery przydatne opcje:

    Offset służy do pominięcia określonej przez nas liczby wpisów. Przydaje się to kiedy robimy dwa loopy na stronie. W pierwszym wyświetliliśmy 2 wpisy, więc w drugim warto by było je pominąć. Żeby to zrobić wystarczy napisać offset=2 i już.

    Posts_per_page - jak sama nazwa mówi - określamy ile wpisów ma być wyświetlonych na stronie. Nadpisuje to naszą defaultową wartość, którą podaliśmy w panelu administracyjnym.

    Showposts - wyświetla określoną liczbę wpisów. Chcemy pokazać trzy wpisy to piszemy showposts=3.

    Paged - służy do wyświetlenia wpisów z określonej strony. Jeżeli mamy np. 10 wpisów, na każdej stronie pokazują się 3 to pisząc paged=2 pokażą się wpisy nr 4,5 i 6.

    Pojedyncze wpisy, strony

    Bez zbędnego owijania w bawełnę. Jeżeli chcemy pokazać wpis o ID=666 to korzystamy z p=666. Możemy też odwołać się za pomocą nazwy name=tytul.

    Gdy chcemy wyświetlić konkretną stronę (tym razem ID=777) to korzystamy z page_id=777 lub (jeżeli wolimy nazwę) pagename=wpis.

    Przy okazji warto zapoznać się z tym co napisał Szymon a'propos wymuszenia wyświetlania zajawek. Z własnego doświadczenia mogę powiedzieć, że się to bardzo często łączy wyświetlaniem pojedynczego wpisu czy strony za pomocą loopa.

    Autorzy

    Na zakończenie troszkę o wyświetlaniu wpisów danego autora. Gdybym chciał pokazać swoje wpisy to po prostu piszę author=1 (bo takiego mam ID'a) lub author_name=palmiak. Oczywiście możemy to poszerzyć o sortowania, ilość wpisów etc etc. Nie będę jednak tego powtarzał.

    Podsumowanie

    Jak wspominałem na początku - WP naprawdę ma duże możliwości i może służyć jako mały/średni CMS. Jak widzicie po powyższym wpisy można wypisywać na wiele różnych sposobów - wg daty, tytułu, losowo, tylko określonego autora. Nic nie stoi także na przeszkodzie, żeby za pomocą php dopisać do tego dodatkową funkcjonalność. Zapraszam więc do odpalenia WP i eksperymentów - dopiero wtedy zobaczycie z czym to się je.

    W kolejnej części skupię się głównie na tagach oraz custom_fields'ach.

    ps. jak widzicie ostatnio troszkę mało rzeczy się ukazuje - po prostu też drobny kryzys nas trafił. Mam nadzieję, że niebawem sytuacja się poprawi i powrócimy do starego trybu publikacji. Ciągle jednak żyjemy i mamy się dobrze.

    Udostępnij ten artykuł:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Mixx
    • Google Bookmarks
    • Gwar
    • RSS
    • Technorati
    • Twitter
    • Wykop

  • This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

    28 Responses to “Query_posts, czyli jak ujarzmić loopa część 1.”

    1. KMO pisze:

      Ciekawy artykuł ;)
      Na pewno się przyda

    2. piecuch pisze:

      czekam na 2 część ;-)

    3. tomek pisze:

      A czy istnieje możliwość wyświetlenia stron albo kategorii podrzędnych, można tak array(’category__and’ => array(2,7)) ale chodzi mi o to żeby po dodaniu podkategorii nie trzeba było dopisywać jej do szablonu a parametr child_of to chyba w tym przypadku nie działa.

    4. yasc pisze:

      a jaka funkcja odpowiada za niewyświetlanie postów z danej kategorii?

    5. palmiak pisze:

      Jest napisane. cat=-ID (po prostu minusik stawiasz przed ID kategorii i już)

    6. Burger pisze:

      Gdy dam

      wyświetlaja mi się wpisy z różwnych kategorii.
      A gdy nie napisz minusa czyli

      wszystko jest ok, tylko wyświetla się 6 wpisów (ustawione by po tyle się wyświetlało) i jest link do starszych wpisów, a na tej następnej stronie te same wpisy…

    7. Burger pisze:

      oj, uciekł kod
      Gdy dam
      ?php query_posts(‘cat=-16′); ?
      [...] czyli
      ?php query_posts(‘cat=16′); ?
      [...]

    8. Burger pisze:

      yasc, cat=-2,-3,-4
      pomijasz tą której nie chcesz ;)

    9. To powiedzcie mi jeszcze tylko jak zrobić coś takiego:
      - najpierw miejsce na wyróżniony artykuł (ostatni wpis z wyróżnionej kategorii), czyli cat=3&showposts=1
      - niżej (drugi loop) na stronie głównej reszta artykułów z wyłączeniem tego JEDNEGO wyróżnionego, czyli cat=-3&……… ?

      Po prostu nie chcę, żeby wyróżniony art pojawiał się dwa razy na stronie głównej ale reszta artów z wyróżnionej kategorii ma się pojawiać.

      Wszystko dotyczy TYLKO strony głównej – na /page/2/ itd ma być wszystko standardowo :)

      Proszę o pomoc, bo kombinuję i nic :/

    10. Do tego zauważyłem, że na każdej podstronie (/page/x/) mam taką samą zawartość :/

    11. palmiak pisze:

      Tak na szybko z pracy.

      Najpierw tak jak zrobiłeś. czyli cat=3&showposts=1 potem zaś cat=3&offset=1(by przeskoczyć ten pierwszy)&posts_per_page=10(ilość wpisów na podstronie).

      Powinno być wtedy ok.

    12. Burger pisze:

      Jednakże problem z tą samą zawartością na każdej stronie zostaje…

    13. palmiak pisze:

      Sprawdziłem. Nie działa. Tzn wystarczy dopisać paged=$paged, czy w sumie:

      query_posts(“cat=3&offset=1&posts_per_page=10&paged=$paged”);

    14. Burger pisze:

      Mi to nie działa, wpisy nadal te same.
      Skontaktuj się ze mną przez email

    15. palmiak pisze:

      Kontakt mailowy kontaktem mailowym, ale warto by było ustalić co nie działa. Powiedz mi czy skopiowałeś to co napisałem czy przepisałeś ręcznie? Bo jeżeli to pierwsze to muszę zastrzelić WP, za używanie tych cudzysłowów zamiast normalnych. Po prostu napisz zwykłe cudzysłowy zamiast tego na co wp zamienia.

    16. Burger pisze:

      Zawsze poprawiam kod
      ma tak
      ?php query_posts(‘cat=3&posts_per_page=3&paged=$paged’); ?

      chciałbym ci dać link, ale tu nie moge, ponieważ projekt nie może zostać jeszcze ujawniony :)

    17. palmiak pisze:

      Już widze błąd. Normalny cudzysłów czyli ” a nie ‘ inaczej php nie wie, że $paged to zmienna tylko myśli, że to kawałek tekstu.

    18. ‘cat=3&posts_per_page=3&paged=$paged’ ? w drugim loopie chce mieć wszystkie wpisy poza tym jednym jedynym, który pojawi się w pierwszym loopie…. :(

    19. Napisałeś:

      Najpierw tak jak zrobiłeś. czyli cat=3&showposts=1 potem zaś cat=3&offset=1(by przeskoczyć ten pierwszy)&posts_per_page=10(ilość wpisów na podstronie).

      To da mi takie efekt: najpierw (to co zrobiłem w 1 loopie) będę miał 1 wpis z katID 3. później będę miał (to co Ty napisałeś) 10 wpisów z katID 3 z pominięciem tego pierwszego…

      A mi chodzi o to, żeby 1 loop byl tylko na stronie głównej i pokazywał ostatni wpis z katID 3, natomiast 2 loop ma pokazywać normalnie wszystkie wpisy z całego bloga (wszystkie kategorie) z pominięciem tego jednego wpisu z 1 loopa (najlepiej gdyby był pomijany tylko jeżeli miałby się dublować na stronie głównej).

      ps. szkoda, że nie ma powiadomień o odpowiedzi :P

      • miego pisze:

        u mnie działa coś takiego, parametry query post sobie dobierz sam:

        <!– pierwsza pętla –>
        <?php
        $temp = $wp_query;
        $wp_query= null;
        $wp_query = new WP_Query();
        $wp_query->query('cat=3&showposts=1'.'&paged='.$paged);
        ?>

        <?php while ( have_posts() ) : the_post(); ?>

        <?php endwhile; ?>

        <?php $wp_query = null; $wp_query = $temp;?>

        <!– koniec pierwszej petli –>

        <!– druga pętla –>
        <?php
        $temp = $wp_query;
        $wp_query= null;
        $wp_query = new WP_Query();
        $wp_query->query('cat=3&showposts=1'.'&paged='.$paged);
        ?>

        <?php while ( have_posts() ) : the_post(); ?>

        <?php endwhile; ?>

        <?php $wp_query = null; $wp_query = $temp;?>

        <!– koniec drugiej petli –>

    20. agressiva pisze:

      “ps. szkoda, że nie ma powiadomień o odpowiedzi ” – moze niedlugo sie pojawią ;)

    21. Burger pisze:

      Dzięki palmiak, działa teraz.
      Ale zauważyłem jeszcze jeden problem, gdy dam !-more– w poście, to tekst przed tym znacznikiem się nie wyświetla w ogóle.

    22. Burger pisze:

      Poradziłem sobie, wszystko gra :)

    23. Adrian pisze:

      Super wpis, właśnie tego mi było trzeba.

    24. Flacktub pisze:

      Może ktoś powiedzieć jak wyświetlić same tematy postów w danej kategorii ? (i najlepiej żeby można było je jakoś posegregować, np najczęściej czytane, oraz ustalić ich liczbę)
      Jest w ogóle jakiś spis funkcji php do wp ?

      • palmiak pisze:

        Spisu funkcji poszukaj na codex.wordpress.org.

        Co do pierwszego to w query post dajesz która kategoria Cię interesuje oraz showposts=-1 (wyświetli wszystkie wpisy) a w loopie wyświetlasz tylko the_title() i już.

        Żeby ustalić ich liczbę po prostu tworzysz sobie zmienną pomocniczą i inkrementujesz co wyświetlenie title.

        Najczęściej czytane musisz rozwiąząć za pomocą wtyczek.

    25. Tomek pisze:

      Bardzo pomocny post. Jestem poczatkujacym uzytkownikiem WP, jednak nie mam wielkiego pojecia o PHP, staram sie ogranac wszystko “na logike”.

      Wiem juz jak wyswietlic posty z konkretnej kategorii. Moje pytanie jest nastepujace:
      Jak wyswietlic jedna kategorie na jednej stronie (innej niz glowna)? I przy okazji pominac ta kategorie na str. glownej? Najlepiej jeszcze, zeby dalo sie zrobic RSS do kazdej (albo chociaz kilku) kategorii.

      prosze o pomoc
      pozdrawiam

    26. [...] czyli jak ujarzmić loopa część 1. | Vivee – wordpress, webmastering, grafika i fotografia vivee.info/…ry_posts-czyli-jak-ujarzm… Pokaż reakcje /* */ inne strony z tej witryny + obserwuj co [...]

    Leave a Reply

Komentarze

Kategorie

Top 10

  • CMSy Artykuły dotyczące różnego rodzaju systemów zarządzania treścią CMS.
  • Flash Podstawowe informacje pomocne przy tworzeniu animacji w Adobe Flash.
  • Fotografia Samouczki dotyczące nie tylko robienia zdjęć ale też ich cyfrowej obróbki.
  • Grafika Ogólnie pojęta grafika komputerowa, od inspiracji, po tworzenie layoutów oraz mniejszych form graficznych.
  • Inne tutoriale wordpressowe Wszystkie inne zagadnienia dotyczące WordPressa.
  • Inspiracje Inspirujące materiały graficzne z dziedziny projektowania stron www, projektów DTP, digital painting, itp.
  • Obróbka zdjęć Techniki retuszu fotografii cyfrowych.
  • Rysunek Tworzenie rysowanych ilustracji w Adobe Photoshop.
  • Skóry do Wordpressa Darmowe oraz płatne – najlepsze skóry do WordPressa.
  • Skrypty client-side
  • Skrypty server-side
  • Tutoriale
  • Webdesign Tutoriale z zakresu projektowania stron www i grafiki użytkowej na rzecz internetu.
  • Wieczór z Open Source
  • Wordpress Ulubieniec naszej publiczności CMS WordPress: nowości, tricki, wtyczki, skóry i wszystko to co może przydać się przy korzystaniu z tego systemu.
  • Wtyczki do Wordpressa Recenzje oraz instrukcje najbardziej popularnych i najbardziej niezbędnych pluginów do WordPressa.
  • XHTML/CSS Ciekawostki z dziedziny kodowania stron www: XHTML, CSS, jQuery.

Najnowsze newsy

Wieczór z Open Source 2010

Jak co roku WSINF organizuje konferencję Wieczór z Open Source.
Chciałbym zaprosić was na tegoroczna konferencję Wieczór z Open Source 2010! Czytaj dalej

Grafart.org i WACOM zapraszają na konkursy!

Witam!

Myślę, że czas najwyższy nadmienić, że za niedługi czas zostanie zorganizowany pierwszy z trzech konkursów, w których główną nagrodą będą tablety firmy WACOM!
Za miejsca drugie oraz trzecie nagrodami będą kubki i koszulki firmy WACOM oraz magazyny graficzne PSD PHOTOSHOP oraz COMPUTERARTS.
Czytaj dalej

Zapraszamy na forum graficzne Graffika.pl

Każda osoba interesująca się grafiką komputerową ma czasami ochotę porozmawiać o swoich pracach, posłuchać rad, krytyki i pochwał innych osób. Idealnym miejscem na realizowanie takich potrzeb jest forum graficzne Graffika.pl.
Czytaj dalej