{"id":228910,"date":"2022-11-05T17:19:00","date_gmt":"2022-11-05T14:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228910"},"modified":"2022-11-09T04:45:47","modified_gmt":"2022-11-09T01:45:47","slug":"ulepszenia-czytelnosci-wp_query-do-konserwacji","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/ulepszenia-czytelnosci-wp_query-do-konserwacji\/","title":{"rendered":"Ulepszenia czytelno\u015bci WP_Query (do konserwacji)"},"content":{"rendered":"\n<p>Praca z <a href=\"https:\/\/tommcfarlin.com\/passing-variables-in-wordpress-wp-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>, zw\u0142aszcza gdy wykonujesz niestandardow\u0105 prac\u0119 poza zwyk\u0142ym \u201ezdob\u0105d\u017a posty i wy\u015bwietl je w szablonie&quot;, mo\u017ce by\u0107 pot\u0119\u017cna. Dotyczy to szczeg\u00f3lnie niekt\u00f3rych zaawansowanych argument\u00f3w (takich jak na przyk\u0142ad u\u017cywanie <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a>) .<\/p>\n<p>Fajnie jest te\u017c, \u017ce konfiguracja procesu ma standardowy spos\u00f3b robienia rzeczy. Mianowicie:<\/p>\n<ol>\n<li>Zdefiniuj argumenty,<\/li>\n<li>Utw\u00f3rz wyst\u0105pienie WP_Query,<\/li>\n<li>Sprawd\u017a, czy s\u0105 posty,<\/li>\n<li>Przejd\u017a przez nie,<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=g2JNxeWO_wA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zako\u0144cz je<\/a>.<\/li>\n<\/ol>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/g2JNxeWO_wA\" frameborder=\"0\"><\/iframe><\/div>\n<p>Ale je\u015bli dojdziesz do miejsca, w kt\u00f3rym wykonujesz zaawansowan\u0105 prac\u0119, tak\u0105 jak praca z niestandardowym typem posta z rozwi\u0105zania innej firmy, konieczno\u015b\u0107 sideload no\u015bnika, ustalenia, czy co\u015b istnieje przed wykonaniem jakiejkolwiek pracy z tym, mo\u017ce to by\u0107 troch\u0119 bardziej skomplikowana w pracy, prawda?<\/p>\n<p>Odkry\u0142em, \u017ce podobnie jak w przypadku wszystkiego w programowaniu, rozbicie go na znacznie bardziej czytelne modu\u0142y (lub funkcje, elementy lub jakkolwiek chcesz je nazwa\u0107) mo\u017ce znacznie u\u0142atwi\u0107 prac\u0119.<\/p>\n<p>Oto jeden ze sposob\u00f3w, w jaki pracuj\u0119 nad popraw\u0105 czytelno\u015bci WP_Query w r\u00f3\u017cnych rzeczach, kt\u00f3re ostatnio zrobi\u0142em.<\/p>\n<h2>Ulepszenia czytelno\u015bci WP_Query<\/h2>\n<p>Zanim przejdziemy przez jakikolwiek przyk\u0142ad, warto wskaza\u0107, \u017ce s\u0105 pewne rzeczy, w kt\u00f3rych konfiguracja WP_Query jest konfigurowana, a kt\u00f3rych nie mo\u017cemy zrobi\u0107.<\/p>\n<p>Na przyk\u0142ad po utworzeniu instancji zapytania mo\u017cemy nie by\u0107 w stanie zrobi\u0107 z nim znacznie bardziej zaawansowanych rzeczy (mam na my\u015bli, skonfigurowanie test\u00f3w jednostkowych, kt\u00f3re nie wymagaj\u0105 rdzenia WordPressa, b\u0119dzie niemo\u017cliwe).<\/p>\n<p>To jest twarz kogo\u015b, kto nie mo\u017ce pod\u0105\u017ca\u0107 za twoim kodem.<\/p>\n<p>Maj\u0105c to na uwadze, oto przyk\u0142ad tego, jak mo\u017ce wygl\u0105da\u0107, gdy zaczynasz, a nast\u0119pnie jak mo\u017cna go zrefaktoryzowa\u0107, aby mie\u0107 mniejsze funkcje, z kt\u00f3rych ka\u017cda jest bardziej celowa ni\u017c jedna d\u0142uga metoda.<\/p>\n<h3>Przyk\u0142ad<\/h3>\n<p>W przypadku tego posta, powiedzmy, \u017ce musz\u0119 przeszuka\u0107 baz\u0119 danych dla wszystkich opublikowanych post\u00f3w i post\u00f3w i chc\u0119 je uporz\u0105dkowa\u0107 wed\u0142ug identyfikatora.<\/p>\n<p>Nast\u0119pnie chc\u0119 ustali\u0107, czy jakie\u015b narz\u0119dzie innej firmy przypisa\u0142o do niego pewne metadane, kt\u00f3re odpowiadaj\u0105 szablonowi, kt\u00f3ry mog\u0119 p\u00f3\u017aniej programowo przypisa\u0107 do danego motywu, kt\u00f3ry mam.<\/p>\n<p>By\u0107 mo\u017ce pocz\u0105tkowa wersja kodu mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-00-wp-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Assume this is defined within the context of a class.\nconst MAPPING = [\n        'employers'       =&gt; 'page-past-word.php',\n        'biography'       =&gt; 'page-biography.php',\n        'accomplishments' =&gt; 'page-csv.php',\n    ];\n\n\/* Snip the rest of the class for brevity *\/\n\npublic function map_templates() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $template_query = new WP_Query( $args );\n\n    if ($template_query-&gt;have_posts()) {\n        while ($template_query-&gt;have_posts()) {\n            $template_query-&gt;the_post();\n\n            $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n            if ('' === $template_id) {\n                continue;\n            }\n\n                \/\/ The third-party's template post name can be used to map our custom template.\n            $template_info = get_post( $template_id );\n            $template_name = $template_info-&gt;post_name;\n\n            if (isset( self::MAPPING[ $template_name ])) {\n\n                $template_file = self::MAPPING[ $template_name ];\n                update_post_meta( $post_id, '_wp_page_template', $template_file );\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>To du\u017co kodu do wykonania sporej ilo\u015bci pracy dla jednej funkcji. Przynajmniej zawiera wszystko, co musi si\u0119 wydarzy\u0107, prawda?<\/p>\n<p>Zanim zaczniesz czyta\u0107 dalej, zauwa\u017c, \u017ce tablica mapowania jest tylko przyk\u0142adem, ale klucze reprezentuj\u0105 klucz meta do <strong>mapowania<\/strong>, a to pomaga nam zmapowa\u0107 definicj\u0119\u00a0 warto\u015bci <strong>_wp_page_template<\/strong>, gdy nadejdzie czas na mapowanie jej do rzeczywistych plik\u00f3w szablon\u00f3w WordPress.<\/p>\n<p>Jak wi\u0119c mo\u017cna to rozbi\u0107?<\/p>\n<h3>1 Wyrzu\u0107 ca\u0142o\u015b\u0107<\/h3>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 chcemy zrobi\u0107, to stworzy\u0107 funkcj\u0119, kt\u00f3ra wprawi ca\u0142o\u015b\u0107 w ruch. Mo\u017cesz to zrobi\u0107 na kilka sposob\u00f3w.<\/p>\n<p>Oto jak zdecydowa\u0142em <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-01-map-page-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">si\u0119 to zrobi\u0107<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>M\u00f3wi\u0105c najpro\u015bciej, u\u017cyje kilku funkcji pomocniczych \u2013 wszystkie z nich udokumentuj\u0119 poni\u017cej \u2013 a nast\u0119pnie przypisze szablony, kt\u00f3re mamy w tablicy mapowania zdefiniowanej powy\u017cej.<\/p>\n<h3>2 Za\u0142aduj posty i strony<\/h3>\n<p>Oczywi\u015bcie pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 chcemy zrobi\u0107, jest ustawienie funkcji do wywo\u0142ania, kt\u00f3ra zwr\u00f3ci wyniki zapytania:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_posts_and_pages() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $posts = new WP_Query( $args );\n\n  return $posts;\n}\n<\/code><\/pre>\n<p>Zwraca wyniki zapytania. W ten spos\u00f3b mo\u017cemy okre\u015bli\u0107, czy musimy wykona\u0107 dodatkow\u0105 prac\u0119, o kt\u00f3rej m\u00f3wimy w sednie w poprzednim kroku:<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>Je\u015bli nie, to koniec. W przeciwnym razie oczywi\u015bcie idziemy dalej.<\/p>\n<h3>3 Pobierz identyfikator szablonu innej firmy<\/h3>\n<p>Nast\u0119pnie pomys\u0142 przypisywania szablon\u00f3w \u2013 jak pokazano w powy\u017cszym kodzie \u2013 wydaje si\u0119 do\u015b\u0107 prosty, ale najpierw musimy zrobi\u0107 kilka rzeczy:<\/p>\n<ol>\n<li>iterowa\u0107 przez posty,<\/li>\n<li>pobierz zewn\u0119trzny identyfikator szablonu,<\/li>\n<li>pobierz nazw\u0119 szablonu innej firmy,<\/li>\n<li>przypisz szablon ze sta\u0142ej mapowania zdefiniowanej wcze\u015bniej w klasie.<\/li>\n<\/ol>\n<p>Pocz\u0105tkowa iteracja funkcji mo\u017ce wygl\u0105da\u0107 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-03-assign-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_templates( WP_Query $posts) {\n\n  while ($posts-&gt;have_posts()) {\n    $posts-&gt;the_post();\n\n    $template_id = $this-&gt;get_template_id( get_the_ID() );\n    if ('' === $template_id) {\n      continue;\n    }\n\n    $template_name = $this-&gt;get_template_name( $template_id );\n    if (null === $template_name) {\n      continue;\n    }\n\n    $this-&gt;assign_template( get_the_ID(), $template_name );\n  }\n  wp_reset_postdata();\n}\n<\/code><\/pre>\n<p>Ale jak wida\u0107, nadal istniej\u0105 funkcje pomocnicze, kt\u00f3re wymagaj\u0105 definicji. Rzeczy takie jak mo\u017cliwo\u015b\u0107 uzyskania identyfikatora szablonu, nazwy szablonu i ostatecznie przypisania szablonu.<\/p>\n<p>Zauwa\u017c jednak, \u017ce je\u015bli kt\u00f3ra\u015b z funkcji pomocniczych nie zwr\u00f3ci u\u017cytecznej warto\u015bci, kontynuujemy p\u0119tl\u0119. Jest to konieczne, chocia\u017cby nie z innego powodu ni\u017c po to, aby upewni\u0107 si\u0119, \u017ce nie pr\u00f3bujemy mapowa\u0107 szablon\u00f3w, kt\u00f3re nie istniej\u0105 (ale uwa\u017cam, \u017ce jest to r\u00f3wnie\u017c nieco \u0142atwiejsze do odczytania).<\/p>\n<h3>4 Znajd\u017a plik, do kt\u00f3rego mapowane s\u0105 identyfikatory szablonu<\/h3>\n<p>Nast\u0119pnie mo\u017cna u\u017cy\u0107 niewielkiej funkcji do sprawdzenia identyfikatora szablonu innej firmy i okre\u015blenia, czy mo\u017cemy zmapowa\u0107 t\u0119 warto\u015b\u0107 na strony istniej\u0105ce <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-04-get-template-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w naszej bazie danych<\/a>.<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_id( $post_id) {\n\n  $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n  return $template_id;\n}\n<\/code><\/pre>\n<p>Je\u015bli tak si\u0119 nie stanie, mo\u017cemy zwr\u00f3ci\u0107 pusty ci\u0105g, a nast\u0119pnie wywo\u0142a\u0107 funkcj\u0119, kt\u00f3ra wywo\u0142a\u0142a to konkretne sprawdzenie, aby zobaczy\u0107, czy warto kontynuowa\u0107 ze zdefiniowan\u0105 p\u0119tl\u0105.<\/p>\n<h3>5 Chwy\u0107 nazw\u0119 szablonu<\/h3>\n<p>Zak\u0142adaj\u0105c, \u017ce mamy poprawny identyfikator posta, teraz musimy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-05-get-template-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pobra\u0107 nazw\u0119 szablonu<\/a> z tablicy mapowania zdefiniowanej wcze\u015bniej w po\u015bcie:<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_name( $template_id) {\n\n  $template_info = get_post( $template_id );\n  $template_name = $template_info-&gt;post_name;\n\n  if (isset( self::MAPPING[ $template_name ])) {\n    return $template_name;\n  } else {\n    return null;\n  }\n}\n<\/code><\/pre>\n<p>Oto rzecz: albo zwr\u00f3cimy nazw\u0119 szablonu, albo zwr\u00f3cimy warto\u015b\u0107 null. Ponownie, jest to po to, aby\u015bmy mogli okre\u015bli\u0107, czy musimy kontynuowa\u0107 p\u0119tl\u0119 przypisywania szablon\u00f3w, czy nie.<\/p>\n<h3>6 Przypisz szablon<\/h3>\n<p>Na koniec mo\u017cemy pobra\u0107 identyfikator szablonu dostarczony przez stron\u0119 trzeci\u0105 i u\u017cy\u0107 go do <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-06-assign-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">zmapowania do pliku<\/a>, kt\u00f3ry do\u0142\u0105czyli\u015bmy do naszej pracy, jak opisano wcze\u015bniej w po\u015bcie:<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_template( $post_id, $template_name) {\n\n  $template_file = self::MAPPING[ $template_name ];\n  update_post_meta( $post_id, '_wp_page_template', $template_file );\n}\n<\/code><\/pre>\n<p>I to jest ostatecznie spos\u00f3b, w jaki mo\u017cna stworzy\u0107 znacznie mniejszy, \u0142atwiejszy do odczytania i \u0142atwiejszy w u\u017cyciu kod i funkcje podczas pracy z nieco bardziej skomplikowanymi zapytaniami.<\/p>\n<h2>A zatem poprawa czytelno\u015bci<\/h2>\n<p>Dla os\u00f3b przyzwyczajonych do pisania d\u0142ugich metod czytania lub robienia rzeczy w spos\u00f3b, w jaki wi\u0119kszo\u015b\u0107 samouczk\u00f3w w Internecie pokazuje, jak robi\u0107 rzeczy w WordPressie, mo\u017ce to wygl\u0105da\u0107 na du\u017co bezsensownego kodu.<\/p>\n<p>Ale rozwa\u017c to:<\/p>\n<ol>\n<li>D\u0142u\u017csze metody s\u0105 trudniejsze do odczytania,<\/li>\n<li>Mog\u0105 by\u0107 trudniejsze do debugowania,<\/li>\n<li>I nie rozk\u0142adaj\u0105 problemu na \u0142atwiejsze do opanowania cz\u0119\u015bci.<\/li>\n<\/ol>\n<p>Jasne, chcia\u0142bym podzieli\u0107 to na jeszcze wi\u0119cej klas z ich obowi\u0105zkami i wierz\u0119, \u017ce mo\u017cna to zrobi\u0107, ale bior\u0105c pod uwag\u0119 natur\u0119 WP_Query, wymaga\u0142oby to troch\u0119 wi\u0119cej pracy.<\/p>\n<p>Wi\u0119c stara\u0142em si\u0119 znale\u017a\u0107 jak najwi\u0119cej \u015brodka.<\/p>\n<p>Je\u015bli pracujesz z nawet nieco bardziej zaawansowanymi zastosowaniami WP_Query, polecam przynajmniej rozwa\u017cenie podzielenia go na mniejsze cz\u0119\u015bci.<\/p>\n<p>Pomaga to zadba\u0107 o czytelno\u015b\u0107, potencjalnie ka\u017cd\u0105 \u0142atwo\u015b\u0107 konserwacji i pisa\u0107 czystszy kod zamiast jednej d\u0142ugiej metody ze zbyt wieloma warunkami warunkowymi i poleganiem na r\u00f3\u017cnych innych danych.<\/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>Praca z czytelno\u015bci\u0105 WP_Query mo\u017ce by\u0107 trudna. Oto przyk\u0142ad, w jaki spos\u00f3b rozbijam u\u017cycie API w mojej w\u0142asnej pracy.<\/p>\n","protected":false},"author":1,"featured_media":220946,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,866],"tags":[1169],"class_list":["post-228910","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228910","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=228910"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228910\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/220946"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}