{"id":230578,"date":"2022-12-15T20:04:00","date_gmt":"2022-12-15T17:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230578"},"modified":"2022-12-07T11:39:14","modified_gmt":"2022-12-07T08:39:14","slug":"niestandardowe-szablony-archiwow-krotki-przewodnik","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/niestandardowe-szablony-archiwow-krotki-przewodnik\/","title":{"rendered":"Niestandardowe szablony archiw\u00f3w: kr\u00f3tki przewodnik"},"content":{"rendered":"\n<p>Za ka\u017cdym razem, gdy pracujesz z szablonami archiw\u00f3w w WordPress, posty s\u0105 zazwyczaj sortowane wed\u0142ug dat w porz\u0105dku malej\u0105cym. Oznacza to, \u017ce najnowsze posty s\u0105 wymienione na g\u00f3rze, a nast\u0119pnie zaczynaj\u0105 si\u0119 stamt\u0105d.<\/p>\n<p>Ostatnio pracowa\u0142em nad kilkoma projektami, kt\u00f3re integruj\u0105 si\u0119 z zewn\u0119trznymi API. Te interfejsy API zwracaj\u0105 daty \u2014 czasami dwie daty, dat\u0119 rozpocz\u0119cia i dat\u0119 zako\u0144czenia \u2014 dla danego wydarzenia, a klienci chc\u0105 u\u017cywa\u0107 tych informacji do wy\u015bwietlania post\u00f3w, a nie ich daty. Oznacza to, \u017ce chc\u0105 niestandardowych szablon\u00f3w archiw\u00f3w.<\/p>\n<p>Nie jest to zbyt trudne, ale zanim to zrobisz, my\u015bl\u0119, \u017ce wa\u017cne jest, aby poda\u0107 pewne podstawowe informacje na temat budowy projektu, aby uzyska\u0107 nieco wi\u0119cej kontekstu, dlaczego, powiedzmy, potrzebne jest niestandardowe zapytanie i dlaczego mo\u017cesz lub mo\u017cesz nie trzeba zagl\u0105da\u0107 do <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a>.<\/p>\n<p>Zaczn\u0119 jednak najpierw od TL;DR. W ten spos\u00f3b mo\u017cesz uzyska\u0107 pomys\u0142 przed przeczytaniem ca\u0142o\u015bci.<\/p>\n<h2>Niestandardowe szablony archiwum<\/h2>\n<p>Wi\u0119c TL; DR za tym wszystkim jest tak:<\/p>\n<ul>\n<li>informacje o dacie dostarczone przez zewn\u0119trzne API s\u0105 przechowywane w tabeli metadanych postu,<\/li>\n<li>kluczem jest data rozpocz\u0119cia, a warto\u015b\u0107 rzeczywista data,<\/li>\n<li>Uporz\u0105dkowa\u0142em zawarto\u015b\u0107 w porz\u0105dku malej\u0105cym i wed\u0142ug warto\u015bci meta.<\/li>\n<\/ul>\n<p>Podzia\u0142 na strony mo\u017ce stanowi\u0107 pewien problem, a je\u015bli u\u017cywasz niestandardowego typu postu, b\u0119dziesz potrzebowa\u0107 dodatkowych parametr\u00f3w, ale jest to og\u00f3lna idea.<\/p>\n<p>Teraz ca\u0142a konfiguracja.<\/p>\n<h3>Niestandardowe typy post\u00f3w<\/h3>\n<p>Je\u015bli chodzi o interfejs z zewn\u0119trznymi interfejsami API, jestem wielkim fanem niestandardowych typ\u00f3w post\u00f3w, poniewa\u017c my\u015bl\u0119 o nich jako o hybrydzie mi\u0119dzy modelami i widokami.<\/p>\n<ul>\n<li>Sk\u0142adnik modelu zawiera wszystko, co jest stycznie powi\u0105zane i mo\u017cna je zapisa\u0107 w bazie danych. Oznacza to wszelkie informacje o taksonomii lub post metadane.<\/li>\n<li>Komponent widoku to na og\u00f3\u0142 wszystko, co wchodzi do szablonu, kt\u00f3re mo\u017ce wykorzystywa\u0107 wszelkie wcze\u015bniej istniej\u0105ce znaczniki szablonu, to wszystko, co mo\u017ce wymaga\u0107 utworzenia, a tak\u017ce odczytuje informacje z bazy danych.<\/li>\n<\/ul>\n<p>W tym po\u015bcie <strong>u\u017cyj\u0119 acme-event<\/strong> jako niestandardowego typu posta.<\/p>\n<h3>Opublikuj metadane<\/h3>\n<p>Ustawiam daty w metadanych postu, a nie w samym po\u015bcie, poniewa\u017c je\u015bli co\u015b ma si\u0119 wydarzy\u0107 w przysz\u0142o\u015bci, a dane s\u0105 ustawione w samym rekordzie posta, WordPress potraktuje to jako <strong>zaplanowany<\/strong> post, kt\u00f3ry nie jest opublikowany .<\/p>\n<\/p>\n<p>Zamiast tego wola\u0142bym opublikowa\u0107 post, a nast\u0119pnie zmieni\u0107 spos\u00f3b wy\u015bwietlania metadanych w szablonie.<\/p>\n<h3>Paginacja<\/h3>\n<p>WordPress wprowadza subtelne rozr\u00f3\u017cnienie z paginacj\u0105 w swoim kodzie. Oznacza to, \u017ce zmienna zapytania dla witryn bez statycznej strony g\u0142\u00f3wnej wykorzystuje <strong>paged<\/strong>, a w przeciwnym przypadku \u2014 <strong>page<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.png\" alt=\"Niestandardowe szablony archiw\u00f3w: kr\u00f3tki przewodnik\" ><\/a><\/p>\n<p>Ma to znaczenie, gdy konstruujesz argumenty zapytania, do kt\u00f3rych za chwil\u0119 przejd\u0119.<\/p>\n<h3>Tylko strony archiwum<\/h3>\n<p>Pami\u0119taj, \u017ce za ka\u017cdym razem, gdy wprowadzasz paginacj\u0119, chcesz zmieni\u0107 zapytanie tylko wtedy, gdy jeste\u015b na w\u0142a\u015bciwej stronie archiwum.<\/p>\n<p>Oznacza to, \u017ce nie przejmujesz si\u0119 przypadkami, gdy jeste\u015b w obszarze administracyjnym WordPressa i nie chcesz zmienia\u0107 zapytania dla archiw\u00f3w innych ni\u017c niestandardowe posty. W tym celu upewnij si\u0119, \u017ce poprawnie ustawiasz zmienn\u0105 zapytania w wywo\u0142aniu zwrotnym pre_get_posts.<\/p>\n<p>Zauwa\u017c, \u017ce mog\u0119 pokaza\u0107 funkcj\u0119, jak to zrobi\u0107, ale ze wzgl\u0119du na to, jak piszemy kod w WordPressie \u2013 to znaczy niekt\u00f3rzy pisz\u0105 kod proceduralny, inni pisz\u0105 kod obiektowy \u2013 po prostu wy\u015bwietl\u0119 to w kodzie proceduralnym.<\/p>\n<h3>\u0141\u0105cz\u0105c to wszystko razem<\/h3>\n<p>Najpierw <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zbuduj\u0119 zapytanie:<\/a><\/p>\n<pre><code>&lt;?php\n\n$eventQuery = new WP_Query([\n    'post_type' =&gt; 'acme-events',\n    'post_status' =&gt; 'publish',\n    'orderby' =&gt; 'meta_value',\n    'order' =&gt; 'desc',\n    'meta_key' =&gt; 'acme-event-start-date-time',\n    'posts_per_archive_page' =&gt; 5,\n    'paged' =&gt; get_query_var('paged')? get_query_var('paged'): 1\n]);<\/code><\/pre>\n<p>Zauwa\u017c, \u017ce w powy\u017cszym kodzie znajduje si\u0119 argument <strong>paged<\/strong>. Za chwil\u0119 powiem o kodzie.<\/p>\n<p>Nast\u0119pnie szablon b\u0119dzie zawiera\u0142 wszelkie informacje, kt\u00f3re zdecydujesz si\u0119 wy\u015bwietli\u0107. Zdecydowa\u0142em si\u0119 nie udost\u0119pnia\u0107 kodu do mojego szablonu w tym po\u015bcie, poniewa\u017c nie ma to znaczenia dla wi\u0119kszego pomys\u0142u.<\/p>\n<p>Dodatkowo masz wszystko, czego potrzebujesz do wy\u015bwietlania tre\u015bci.<\/p>\n<p>Nast\u0119pnie ustawi\u0119 paginacj\u0119. Najpierw musz\u0119 to zrobi\u0107 za pomoc\u0105 haka pre_get_posts, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aby upewni\u0107 si\u0119, \u017ce ustawiona jest w\u0142a\u015bciwa zmienna zapytania<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('pre_get_posts', 'setCustomQueryVariable');\npublic function setCustomQueryVariable($query)\n{\n    if (is_admin() || !is_archive()) {\n        return;\n    }\n\n    if ($query-&gt;is_archive('acme-events')) {\n        set_query_var('posts_per_page', 5);\n    }\n}<\/code><\/pre>\n<p>Nast\u0119pnie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zaimplementuj\u0119 paginacj\u0119<\/a> za pomoc\u0105 niestandardowego zapytania:<\/p>\n<pre><code>&lt;?php\n\n&lt;a class=\"next page-numbers\" href=\"&lt;?php echo esc_attr(get_next_posts_page_link($eventQuery-&gt;max_num_pages)); ?&gt;\"&gt;\n    Next Page\n&lt;\/a&gt;\n\n&lt;a class=\"prev page-numbers\" href=\"&lt;?php echo esc_attr(get_previous_posts_page_link()); ?&gt;\"&gt;\n    Previous Page\n&lt;\/a&gt;<\/code><\/pre>\n<p>A potem <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zresetuj\u0119 globaln\u0105 zmienn\u0105 $post<\/a> za pomoc\u0105 wp_reset_postdata() na wypadek, gdyby trzeba by\u0142o u\u017cy\u0107 czegokolwiek z oryginalnego postu.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>Jest to og\u00f3lnie uwa\u017cane za dobre porz\u0105dkowanie za ka\u017cdym razem, gdy u\u017cywasz niestandardowego zapytania.<\/p>\n<h3>Przydatne linki<\/h3>\n<p>Poni\u017cej znajduje si\u0119 lista funkcji, stron i odniesie\u0144, kt\u00f3re mog\u0105 okaza\u0107 si\u0119 przydatne, poniewa\u017c odnosz\u0105 si\u0119 do powy\u017cszego kodu lub jakiejkolwiek przysz\u0142ej pracy, kt\u00f3r\u0105 mo\u017cesz wykona\u0107.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Paginacja<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/set_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">set_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">update_post_meta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_reset_postdata\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_reset_postdata<\/a><\/li>\n<li>Pe\u0142ny <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kod<\/a> w tym po\u015bcie.<\/li>\n<\/ul>\n<p>Je\u015bli pracujesz z WordPressem od d\u0142u\u017cszego czasu, niekt\u00f3re z nich mog\u0105 wydawa\u0107 si\u0119 zb\u0119dne. W innych przypadkach mo\u017ce wydawa\u0107 si\u0119 nowy lub mo\u017ce rzuci\u0107 \u015bwiat\u0142o na obszary API WordPressa, o kt\u00f3rych istnieniu nie wiedzia\u0142e\u015b (przynajmniej tak by\u0142o w moim przypadku).<\/p>\n<h2>Po co zawraca\u0107 sobie g\u0142ow\u0119 tym wszystkim?<\/h2>\n<p>Mo\u017ce si\u0119 to wydawa\u0107 d\u0142ugim postem dla pozornie prostego zadania, ale informacje s\u0105 nieco rozproszone po ca\u0142ej sieci, poniewa\u017c odnosz\u0105 si\u0119 do robienia czego\u015b takiego.<\/p>\n<p>Chcia\u0142em wi\u0119c spr\u00f3bowa\u0107 zebra\u0107 to wszystko razem z obja\u015bnieniami, przyk\u0142adowym kodem i linkami do stron, kt\u00f3re mog\u0105 by\u0107 interesuj\u0105ce w zale\u017cno\u015bci od sposobu wdro\u017cenia.<\/p>\n<p>W ko\u0144cu wielu z nas korzysta obecnie z WordPressa poza podstawowym zarz\u0105dzaniem tre\u015bci\u0105, ale to nie znaczy, \u017ce nie powinni\u015bmy w miar\u0119 mo\u017cliwo\u015bci wykorzystywa\u0107 jego wbudowanych funkcji i interfejs\u00f3w API.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Potraktuj to jako szybki kurs tworzenia niestandardowych szablon\u00f3w archiw\u00f3w i wszystkich funkcji, kt\u00f3re je otaczaj\u0105.<\/p>\n","protected":false},"author":1,"featured_media":236214,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,866],"tags":[1169],"class_list":["post-230578","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230578","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=230578"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230578\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}