{"id":233924,"date":"2023-02-25T11:21:00","date_gmt":"2023-02-25T08:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233924"},"modified":"2022-11-11T13:12:09","modified_gmt":"2022-11-11T10:12:09","slug":"samouczek-motywu-wordpress-dla-poczatkujacych-czesc-12-niestandardowe-zapytanie-post","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/samouczek-motywu-wordpress-dla-poczatkujacych-czesc-12-niestandardowe-zapytanie-post\/","title":{"rendered":"Samouczek motywu WordPress dla pocz\u0105tkuj\u0105cych \u2013 cz\u0119\u015b\u0107 12: Niestandardowe zapytanie post"},"content":{"rendered":"\n<p>W tej ostatniej lekcji nauczymy si\u0119 pisa\u0107 w\u0142asne zapytanie o posty i przechodzi\u0107 przez nie bez przerywania p\u0119tli nadrz\u0119dnej w szablonie. Stworzymy cz\u0119\u015b\u0107 szablonu dla pojedynczych post\u00f3w, kt\u00f3ra pokazuje powi\u0105zane posty w tej samej kategorii.<\/p>\n<p>To, co zrobimy w tej lekcji, to powi\u0105zane zapytanie o posty w naszym widoku pojedynczego postu, pokazuj\u0105ce maksymalnie 3 posty, post typu post, w tej samej kategorii lub kategoriach co post, w kt\u00f3rym si\u0119 znajdujemy, z wy\u0142\u0105czeniem samego bie\u017c\u0105cego posta, i losuj wy\u015bwietlane posty. Przyjrzymy si\u0119 r\u00f3wnie\u017c strategiom, kt\u00f3re nie psuj\u0105 zagnie\u017cd\u017conej p\u0119tli.<\/p>\n<h2>Szablon powi\u0105zanych post\u00f3w<\/h2>\n<p>Uczy\u0144my powi\u0105zane posty troch\u0119 szablonow\u0105 cz\u0119\u015bci\u0105, o kt\u00f3rej dowiedzieli\u015bmy si\u0119 w <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-10-fleshing-out-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cz\u0119\u015bci 10<\/a>. W ten spos\u00f3b nie komplikujemy nadmiernie <code>single.php<\/code>i nie zwi\u0119kszamy mo\u017cliwo\u015bci ponownego wykorzystania naszego kodu. Umie\u015b\u0107 \u017c\u0105danie tej nowej cz\u0119\u015bci szablonu w dowolnym miejscu. Umieszcz\u0119 go tu\u017c przed pro\u015bb\u0105 o szablon komentarzy:<\/p>\n<pre><code>...\n    &lt;\/article&gt;\n    &lt;?php \n    get_template_part('related-posts');\n    if (comments_open()) {\n        comments_template();\n    }\n    endwhile;\n...<\/code><\/pre>\n<p>Teraz utw\u00f3rzmy nowy pusty plik w naszym folderze motywu i nazwijmy go <code>related-posts.php<\/code>. Dzi\u0119ki temu plikowi jeste\u015bmy gotowi do zag\u0142\u0119bienia si\u0119 w tworzenie niestandardowego zapytania do posta.<\/p>\n<h2>Niestandardowe zapytanie post<\/h2>\n<p>Je\u015bli chcesz utworzy\u0107 niestandardowe zapytanie o posty, masz kilka opcji, ale polecam przyzwyczai\u0107 si\u0119 do klasy <code>WP_Query<\/code>. Dodaj <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u0119 stron\u0119 dokumentacji<\/a> do zak\u0142adek, poniewa\u017c b\u0119dziesz do niej cz\u0119sto si\u0119 odwo\u0142ywa\u0107, poniewa\u017c jest tak wiele opcji. Poka\u017c\u0119 Ci praktyczny przyk\u0142ad konfiguracji zapytania, odwo\u0142uj\u0105c si\u0119 do dokumentacji dla ka\u017cdej specyfikacji, kt\u00f3r\u0105 chcemy doda\u0107.<\/p>\n<p>Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej o tym, jak wyszukiwa\u0107 posty, mam <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post<\/a>, kt\u00f3ry szczeg\u00f3\u0142owo o tym m\u00f3wi.<\/p>\n<p>Aby utworzy\u0107 niestandardowe zapytanie o post, wywo\u0142amy <code>new WP_Query()<\/code>, przeka\u017cemy do niego tablic\u0119 argument\u00f3w i zapiszemy jego wynik w zmiennej. A potem u\u017cyjemy dok\u0142adnie tej samej p\u0119tli, kt\u00f3rej u\u017cywali\u015bmy wcze\u015bniej w naszych szablonach (<a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-4-accessing-posts-with-the-loop\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sp\u00f3jrz na oryginaln\u0105 p\u0119tl\u0119 tutaj,<\/a> aby por\u00f3wna\u0107). Ale musimy powiedzie\u0107 p\u0119tli, aby przesz\u0142a przez zmienn\u0105, a nie globaln\u0105 (kt\u00f3ra jest pojedynczym postem).<\/p>\n<p>Oto jak b\u0119dzie wygl\u0105da\u0107 p\u0119tla po dodaniu jej do niestandardowego zapytania:<\/p>\n<pre><code>$related_posts = new WP_Query([\n    \/\/ Arguments here\n]);\nif ($related_posts-&gt;have_posts()) {\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        \/\/ Access to each post here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Jak wida\u0107, p\u0119tla jest dok\u0142adnie taka sama, u\u017cywaj\u0105c <code>have_posts<\/code>i <code>the_post<\/code>. R\u00f3\u017cnica polega na tym, \u017ce wywo\u0142ujemy je na <code>$related_posts<\/code>obiekcie. Je\u015bli pominiemy t\u0119 <code>$related_posts<\/code>cz\u0119\u015b\u0107, WordPress automatycznie przyjmie, \u017ce jest to globalne zapytanie o posty.<\/p>\n<p>Mo\u017cesz r\u00f3wnie\u017c zauwa\u017cy\u0107 wywo\u0142anie funkcji <code>wp_reset_postdata()<\/code>zaraz po p\u0119tli. W ten spos\u00f3b \u201esprz\u0105tamy po sobie&quot; po niestandardowym zapytaniu z <code>WP_Query<\/code>. Pami\u0119taj, \u017ce <code>the_post()<\/code>konfigurujemy globalny obiekt post, aby\u015bmy mogli u\u017cywa\u0107 <code>the_title()<\/code>itp. A poniewa\u017c ju\u017c jeste\u015bmy w p\u0119tli (tej w <code>single.php<\/code>), musimy si\u0119 upewni\u0107 sprz\u0105tamy i resetujemy post z powrotem do pojedynczego posta po zako\u0144czeniu. Je\u015bli nie zresetujemy postdata, wszystko po tym b\u0119dzie odnosi\u0107 si\u0119 do ostatniego powi\u0105zanego posta, przez kt\u00f3ry przeszli\u015bmy. To mo\u017ce by\u0107 du\u017cy problem! W naszym przyk\u0142adzie mie\u0107 szablon komentarzy, kt\u00f3ry nast\u0119puje po tym.Pomini\u0119cie resetowania spowoduje, \u017ce szablon komentarza b\u0119dzie wy\u015bwietla\u0142 komentarze z ostatniego powi\u0105zanego posta w p\u0119tli.A nie pojedynczego posta, na kt\u00f3ry faktycznie patrzymy!<\/p>\n<h3>Wdra\u017canie naszej niestandardowej p\u0119tli<\/h3>\n<p>Dobrze, zacznijmy implementowa\u0107 niestandardow\u0105 p\u0119tl\u0119 w naszym <code>related-posts.php<\/code>. Doda\u0142em wrapper i tytu\u0142, ale jak zwykle mo\u017cesz dostosowa\u0107 HTML wed\u0142ug w\u0142asnego uznania:<\/p>\n<pre><code>&lt;div class=\"related-posts\"&gt;\n    &lt;h2&gt;&lt;?php _e('Related posts', 'wptutorial'); ?&gt;&lt;\/h2&gt;\n    &lt;?php\n    $related_posts = new WP_Query([\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n        while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n\u00a0\n        endwhile;\n        wp_reset_postdata();\n    }\n    ?&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Teraz zobaczymy si\u0142\u0119 wielokrotnego u\u017cytku w cz\u0119\u015bciach szablon\u00f3w. Za\u0142\u00f3\u017cmy, \u017ce wewn\u0105trz tej niestandardowej p\u0119tli chcemy pokaza\u0107 dok\u0142adnie tak\u0105 sam\u0105 zawarto\u015b\u0107 jak w naszym <code>content-loop.php<\/code>, kt\u00f3rej u\u017cywamy w naszych szablonach archiwum. Wszystko, co musimy zrobi\u0107, to za\u017c\u0105da\u0107 tej cz\u0119\u015bci szablonu w naszej niestandardowej p\u0119tli, czy wszyscy jeste\u015bmy przygotowani do obs\u0142ugi wyj\u015bcia ka\u017cdego posta!<\/p>\n<pre><code>...\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        get_template_part('content-loop');\n    endwhile;\n...<\/code><\/pre>\n<p>Teraz pozostaje tylko doda\u0107 argumenty do naszego zapytania post, upewniaj\u0105c si\u0119, \u017ce pobieramy to, czego chcemy. Przeanalizujmy argumenty jeden po drugim.<\/p>\n<h2>Budowanie argument\u00f3w do naszego niestandardowego zapytania post<\/h2>\n<p>Chcemy pobra\u0107 nie wi\u0119cej post\u00f3w ni\u017c 3. W dokumentacji (sekcja \u201eParametry paginacji&#8221;) argumentem na to jest <code>posts_per_page<\/code>. Dodajemy wi\u0119c element tablicy:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Chcemy mie\u0107 pewno\u015b\u0107, \u017ce WordPress pobiera posty, a nie strony lub co\u015b innego. W \u201eParametry typu posta&#8221; znajdujemy:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Chcemy zapobiec sytuacji, w kt\u00f3rej pojedynczy post, na kt\u00f3rym si\u0119 znajdujemy, pojawia si\u0119 w naszym zapytaniu o posty, poniewa\u017c to nie ma sensu, prawda? Dokumentacja m\u00f3wi nam w \u201eParametry postu i strony&#8221;, \u017ce mo\u017cemy doda\u0107 identyfikator posta w tablicy dla <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Chcemy r\u00f3wnie\u017c losowa\u0107 posty; poniewa\u017c domy\u015blnie pobierze najnowsze opublikowane posty, co mo\u017ce szybko sta\u0107 si\u0119 do\u015b\u0107 powtarzalne podczas przegl\u0105dania post\u00f3w. Na szcz\u0119\u015bcie WordPress ma do tego funkcj\u0119 w sposobie porz\u0105dkowania post\u00f3w; w \u201eKolejno\u015b\u0107 i porz\u0105dek wed\u0142ug parametr\u00f3w&#8221; znajdujemy:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Na koniec chcemy odpytywa\u0107 posty, kt\u00f3re nale\u017c\u0105 do tych samych kategorii, co post, w kt\u00f3rym si\u0119 znajdujemy. Aby to zrobi\u0107, musimy najpierw, przed argumentami zapytania, pobra\u0107 kategorie do pojedynczego postu, w kt\u00f3rym si\u0119 znajdujemy. W \u201eParametry kategorii&#8221; widzimy, \u017ce mo\u017cemy dostarczy\u0107 tablic\u0119 identyfikator\u00f3w kategorii do <code>category__in<\/code>. Na szcz\u0119\u015bcie WordPress ma funkcj\u0119 pobierania identyfikator\u00f3w kategorii dla posta; <code>wp_get_post_categories()<\/code>kt\u00f3rego mo\u017cemy u\u017cy\u0107 bezpo\u015brednio jako warto\u015bci parametru. Idealny!<\/p>\n<p>Oto ostatnie zapytanie i jego argumenty:<\/p>\n<pre><code>...\n&lt;?php\n    $post_cats = wp_get_post_categories(get_the_ID());\n    $related_posts = new WP_Query([\n        'post_type' =&gt; 'post',\n        'posts_per_page' =&gt; 3,\n        'category__in' =&gt; $post_cats,\n        'post__not_in' =&gt; [get_the_ID()],\n        'orderby' =&gt; 'rand'\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n...<\/code><\/pre>\n<p>Od\u015bwie\u017c i powiniene\u015b zobaczy\u0107 3 posty wymienione na dole pojedynczego widoku. Od\u015bwie\u017caj kilka razy, aby zobaczy\u0107, \u017ce si\u0119 zmieniaj\u0105, poniewa\u017c polecili\u015bmy WordPressowi ich losowanie. Uwaga: Je\u015bli masz mniej ni\u017c 3 posty w tej samej kategorii, otrzymasz mniej ni\u017c 3 posty.<\/p>\n<p>Ot\u00f3\u017c \u200b\u200bto! Teraz wiesz, jak wysy\u0142a\u0107 zapytania do dowolnych post\u00f3w. Strona <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacji WP_Query<\/a> jest niezwykle pomocna w ulepszaniu zapytania, poniewa\u017c ma tu naprawd\u0119 nieograniczone mo\u017cliwo\u015bci. Zach\u0119cam do zabawy z parametrami i by\u0107 mo\u017ce do stworzenia osobnej cz\u0119\u015bci szablonu do wykorzystania w powi\u0105zanych postach.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tej lekcji motywu WordPress dowiesz si\u0119, jak napisa\u0107 w\u0142asne zapytanie o posty i przej\u015b\u0107 przez nie bez przerywania p\u0119tli nadrz\u0119dnej w szablonie.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,919,897,919,1110,836,836,845,929,929,845,866,866],"tags":[1169],"class_list":["post-233924","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-deweloper","category-inny","category-n-a","category-przewodnik-dla-poczatkujacych","category-samouczki","category-tematy","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=233924"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233924\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}