{"id":233689,"date":"2023-02-19T15:24:00","date_gmt":"2023-02-19T12:24:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233689"},"modified":"2022-11-11T08:52:52","modified_gmt":"2022-11-11T05:52:52","slug":"przewodnik-zmodyfikuj-globalne-zapytanie-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/przewodnik-zmodyfikuj-globalne-zapytanie-wordpress\/","title":{"rendered":"Przewodnik: Zmodyfikuj globalne zapytanie WordPress"},"content":{"rendered":"\n<p>W niekt\u00f3rych przypadkach mo\u017ce zaj\u015b\u0107 potrzeba zmodyfikowania globalnego zapytania o posty, kt\u00f3re WordPress wykonuje na ka\u017cdej odwiedzanej stronie \u2013 zar\u00f3wno admin, jak i frontend. W tym przewodniku przyjrzymy si\u0119, kt\u00f3rego haka u\u017cy\u0107 i jak zmieni\u0107 argumenty zapytania wed\u0142ug w\u0142asnych upodoba\u0144.<\/p>\n<h2>Kt\u00f3rego haka u\u017cy\u0107?<\/h2>\n<p>Najpierw musisz wiedzie\u0107, do kt\u00f3rego hooka doda\u0107 sw\u00f3j kod. Potrzebujemy podpi\u0119cia, kt\u00f3re dzieje si\u0119 zaraz po tym, jak WordPress ustawi wszystkie argumenty, ale przed faktycznym uruchomieniem zapytania. Do tego u\u017cywamy akcji <code>pre_get_posts<\/code>.<\/p>\n<p>W tym haczyku otrzymujesz jeden parametr; czyli <code>WP_Query<\/code>obiekt, za pomoc\u0105 kt\u00f3rego WordPress b\u0119dzie p\u00f3\u017aniej uruchamia\u0142 zapytanie. Wprowadzasz zmiany w obiekcie \u2013 ale nie musisz go zwraca\u0107, poniewa\u017c WordPress uruchomi zapytanie ze zmodyfikowanym obiektem.<\/p>\n<pre><code>add_action('pre_get_posts', function($query) {\n    \/\/ Add your code here\n});<\/code><\/pre>\n<p>Modyfikowanie zapytania najprawdopodobniej wymaga u\u017cycia pewnych tag\u00f3w warunkowych w celu okre\u015blenia przypadk\u00f3w, w kt\u00f3rych chcesz je zmieni\u0107. Na przyk\u0142ad mo\u017cesz chcie\u0107 kierowa\u0107 zapytanie tylko na wyniki wyszukiwania lub widoki kategorii.<\/p>\n<h2>Tagi warunkowe<\/h2>\n<p>WordPress ma kilka <a href=\"https:\/\/codex.wordpress.org\/Conditional_Tags\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tag\u00f3w warunkowych<\/a>, kt\u00f3rych mo\u017cesz u\u017cy\u0107 do okre\u015blenia przypadk\u00f3w, w kt\u00f3rych chcesz doda\u0107 sw\u00f3j kod. Znacznik warunkowy to po prostu funkcja, kt\u00f3ra zwraca prawd\u0119 lub fa\u0142sz, w zale\u017cno\u015bci od tego, w jakim stanie jest WordPress. Przyk\u0142ady typowych tag\u00f3w warunkowych s\u0142u\u017c\u0105 <code>is_admin()<\/code>do sprawdzania, czy aktualnie jeste\u015bmy w admin czy frontend, <code>is_singular()<\/code>czy jeste\u015bmy na pojedynczym po\u015bcie lub stronie w interfejsie, oraz <code>is_search()<\/code>je\u015bli jeste\u015bmy na stronie wynik\u00f3w wyszukiwania.<\/p>\n<p>Pami\u0119taj, \u017ce hook <code>pre_get_posts<\/code>jest uruchamiany zar\u00f3wno dla administratora, jak i frontendu. Je\u015bli chcesz tylko wp\u0142yn\u0105\u0107 na globalne zapytanie w interfejsie u\u017cytkownika, musisz owin\u0105\u0107 sw\u00f3j kod wewn\u0105trz znacznika warunkowego if-check <code>is_admin()<\/code>.<\/p>\n<h3>Uwaga o tagach warunkowych w<code>pre_get_posts<\/code><\/h3>\n<p>Tagi warunkowe s\u0105 \u015bwietne i w og\u00f3le, ale nale\u017cy pami\u0119ta\u0107 o kilku rzeczach, korzystaj\u0105c z nich w <code>pre_get_posts<\/code>.<\/p>\n<p>Najpierw musisz zapozna\u0107 si\u0119 z tagiem <code>is_main_query()<\/code>. Akcja <code>pre_get_posts<\/code>jest faktycznie uruchamiana wiele razy przy ka\u017cdym wczytaniu strony. Na przyk\u0142ad <code>pre_get_posts<\/code>jest uruchamiany podczas generowania ka\u017cdego menu (w tym w wid\u017cetach). Aby zmodyfikowa\u0107 rzeczywiste zapytanie globalne, np. posty do archiwum kategorii lub wyniki wyszukiwania, nale\u017cy kierowa\u0107 na \u201eg\u0142\u00f3wne zapytanie&quot; za pomoc\u0105 <code>is_main_query()<\/code>.<\/p>\n<p>Po drugie, musisz by\u0107 \u015bwiadomy przypadk\u00f3w, w kt\u00f3rych musisz sprawdzi\u0107 tagi warunkowe na dostarczonym obiekcie zamiast wywo\u0142ywa\u0107 funkcj\u0119 \u201eniezale\u017cnie&#8221;. Zwykle, gdy u\u017cywasz tag\u00f3w warunkowych, piszesz to tak:<\/p>\n<pre><code>if (is_main_query()) {\n    \/\/ Do stuff\n}<\/code><\/pre>\n<p>Jednak podczas korzystania z <code>pre_get_posts<\/code>obiektu istnieje kilka tag\u00f3w warunkowych, kt\u00f3re nale\u017cy zastosowa\u0107 do obiektu. Na przyk\u0142ad:<\/p>\n<pre><code>add_action('pre_get_posts', function($query) {\n    if ($query-&gt;is_main_query()) {\n        \/\/ Add your code here\n    }\n});<\/code><\/pre>\n<p>Nale\u017cy zawsze zameldowa\u0107 <code>is_main_query()<\/code>si\u0119 w obiekcie podanym w <code>pre_get_posts<\/code>. Przeczytaj <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacj\u0119 pre_get_posts<\/a>, aby uzyska\u0107 wi\u0119cej informacji.<\/p>\n<p>Oto przyk\u0142ad sprawdzenia, czy nie jeste\u015bmy w adminie, a czy jeste\u015bmy przy g\u0142\u00f3wnym zapytaniu postu:<\/p>\n<pre><code>add_action('pre_get_posts', function($query) {\n    if (!is_admin() &amp;&amp; $query-&gt;is_main_query()) {\n        \/\/ Add your code here\n    }\n});<\/code><\/pre>\n<h2>Zmiana lub dodanie argument\u00f3w<\/h2>\n<p>Poniewa\u017c pracujemy z <code>WP_Query<\/code>obiektem, mo\u017cesz zapozna\u0107 si\u0119 <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z dokumentacj\u0105 WP_Query,<\/a> aby dowiedzie\u0107 si\u0119, jak zbudowa\u0107 swoje argumenty, aby dostosowa\u0107 zapytanie posts. Pami\u0119taj, \u017ce argumenty s\u0105 ju\u017c wype\u0142nione. W takim przypadku musisz do\u0142\u0105czy\u0107 lub zmieni\u0107 istniej\u0105ce warto\u015bci. Lub usu\u0144 te, kt\u00f3re chcesz usun\u0105\u0107.<\/p>\n<p>U\u017cywasz <code>set()<\/code>funkcji na <code>WP_Query<\/code>obiekcie, aby ustawi\u0107 argumenty. Metoda przyjmuje dwa argumenty, klucz argumentu, a po drugie warto\u015b\u0107. Na przyk\u0142ad ustawienie <code>posts_per_page<\/code>argumentu wygl\u0105da\u0142oby tak:<\/p>\n<pre><code>add_action('pre_get_posts', function($query) {\n    if (!is_admin() &amp;&amp; $query-&gt;is_main_query()) {\n        $query-&gt;set('posts_per_page', 20);\n    }\n});<\/code><\/pre>\n<p>W przypadkach, w kt\u00f3rych chcesz do\u0142\u0105czy\u0107 lub zmieni\u0107 istniej\u0105cy wcze\u015bniej argument, zwykle robisz to, najpierw zapisuj\u0105c istniej\u0105cy argument w zmiennej. Mo\u017cesz u\u017cy\u0107 do tego metody <code>get()<\/code>. Nast\u0119pnie modyfikujesz zmienn\u0105, do\u0142\u0105czaj\u0105c lub scalaj\u0105c tablice lub cokolwiek. I na koniec u\u017cywasz <code>set()<\/code>do zamiany zmodyfikowanej zmiennej z powrotem na obiekt zapytania. Polecam u\u017cy\u0107 <code>var_dump()<\/code>na obiekcie, aby zobaczy\u0107, co zawiera, a jest to r\u00f3wnie\u017c dobry spos\u00f3b na sprawdzenie, czy tagi warunkowe s\u0105 poprawne.<\/p>\n<p>Oto kr\u00f3tki przyk\u0142ad u\u017cycia <code>get()<\/code>(po prostu sprawd\u017a, czy jest pusty), a je\u015bli tak, dodaj w\u0142asne argumenty za pomoc\u0105 <code>set()<\/code>.<\/p>\n<pre><code>add_action('pre_get_posts', function($query) {\n    if (!is_admin() &amp;&amp; $query-&gt;is_main_query()) {\n        if (!$query-&gt;get('meta_query')) {\n            $query-&gt;set('meta_query', [\/ your arguments here \/]);\n        }\n    }\n});<\/code><\/pre>\n<h3>Uwaga dotycz\u0105ca zapytania_podatkowego<\/h3>\n<p>WordPress ma oddzielne podklasy do obs\u0142ugi cz\u0119\u015bci taksonomii (<code>WP_Tax_Query<\/code>) w ramach <code>WP_Query<\/code>. Je\u015bli musisz wykona\u0107 bardziej z\u0142o\u017cone modyfikacje zapyta\u0144 taksonomicznych, <code>pre_get_posts<\/code>akcja mo\u017ce by\u0107 zbyt wczesna. Niekt\u00f3re warto\u015bci mog\u0105 by\u0107 puste, poniewa\u017c s\u0105 wype\u0142niane p\u00f3\u017aniej. W takim przypadku mo\u017ce by\u0107 lepiej, je\u015bli u\u017cyjesz akcji <code>parse_tax_query<\/code>zamiast <code>pre_get_posts<\/code>. Przeczytaj <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/parse_tax_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dokumentacj\u0119 tego haka<\/a>, aby sprawdzi\u0107, czy to jest dla Ciebie.<\/p>\n<h2>Wniosek<\/h2>\n<p>Argumenty, kt\u00f3re dodajesz lub zmieniasz, zale\u017c\u0105 wy\u0142\u0105cznie od tego, co chcesz zrobi\u0107, ale powiniene\u015b mie\u0107 teraz pewien wgl\u0105d w strategie, aby zrozumie\u0107 zapytanie globalne. Je\u015bli chcesz uzyska\u0107 wgl\u0105d w <code>WP_Query<\/code>obiekt i jak u\u017cywa\u0107 jego argument\u00f3w, m\u00f3j post o <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tym, jak wyszukiwa\u0107 posty<\/a>, mo\u017ce by\u0107 interesuj\u0105cy.<\/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 tym po\u015bcie dowiemy si\u0119, jak modyfikowa\u0107 globalne zapytanie WordPress, jakiego haka u\u017cy\u0107 i jak modyfikowa\u0107 argumenty wed\u0142ug w\u0142asnych upodoba\u0144.<\/p>\n","protected":false},"author":1,"featured_media":152576,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,919,897,919,1110,836,836,845,845,866,866],"tags":[1169],"class_list":["post-233689","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-inny","category-n-a","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233689","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=233689"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233689\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/152576"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}