{"id":230170,"date":"2022-12-06T15:39:00","date_gmt":"2022-12-06T12:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230170"},"modified":"2022-12-06T15:39:36","modified_gmt":"2022-12-06T12:39:36","slug":"o-pisaniu-czytelnych-funkcji-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/o-pisaniu-czytelnych-funkcji-wordpress\/","title":{"rendered":"O pisaniu czytelnych funkcji WordPress"},"content":{"rendered":"\n<p>Jedn\u0105 z rzeczy, kt\u00f3re s\u0105 dla mnie niezmiennie interesuj\u0105ce (zar\u00f3wno z punktu widzenia programowania, jak i z punktu widzenia WordPressa), jest to:<\/p>\n<p>Podoba mi si\u0119 oddzielanie kodu w taki spos\u00f3b, \u017ce kod odpowiedzialny za interakcj\u0119 z WordPressem jest przenoszony do jego przestrzeni nazw, podczas gdy reszta naszego kodu ma odpowiedni\u0105 przestrze\u0144 nazw w innym miejscu.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/prosty-przewodnik-po-organizacji-zajec-opartych-na-wordpressie\/\" title=\"My\u015bl\u0119, \u017ce to\">My\u015bl\u0119, \u017ce to<\/a><\/strong> jednak oczywiste.<\/p>\n<p>Je\u015bli chodzi o pisanie kodu, nie oznacza to jednak, \u017ce nale\u017cy pozostawi\u0107 go po prostu temu, jak piszemy nasze klasy, a nast\u0119pnie je organizujemy. A co z rzeczami na nieco bardziej szczeg\u00f3\u0142owym poziomie?<\/p>\n<p>To znaczy, co by by\u0142o, gdyby\u015bmy spojrzeli na metody jako cz\u0119\u015b\u0107 wi\u0119kszej ca\u0142o\u015bci i upewnili si\u0119, \u017ce r\u00f3wnie\u017c dobrze wykonuj\u0105 swoj\u0105 prac\u0119? Jasne, ludzie tacy jak <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> pisali o tego rodzaju rzeczach przez wi\u0119kszo\u015b\u0107 swojej kariery i g\u0142osili to ludziom takim jak my.<\/p>\n<p>Ale te koncepcje s\u0105 czym\u015b, co po prostu zaczynasz robi\u0107, a nast\u0119pnie stosujesz je na dobre. Zmieniaj\u0105 si\u0119 paradygmaty, dzi\u015b jeste\u015bmy lepsi ni\u017c wczoraj i mo\u017ce istnie\u0107 wiele sposob\u00f3w na osi\u0105gni\u0119cie tego samego rodzaju.<\/p>\n<p>Wi\u0119c je\u015bli chodzi o tworzenie czytelnych funkcji WordPress dla okre\u015blonej domeny, jak to mo\u017ce wygl\u0105da\u0107?<\/p>\n<h2>Czytelne funkcje WordPress<\/h2>\n<p>Dla tych, kt\u00f3rzy znaj\u0105 zasady <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> lub cokolwiek, co m\u00f3wi o pisaniu dobrego kodu, jedn\u0105 z rzeczy, o kt\u00f3rych pisze wiele z tych os\u00f3b, jest d\u0142ugo\u015b\u0107, jak\u0105 powinna by\u0107 metoda.<\/p>\n<p>Zwykle traktuj\u0119 je jako zasady, a nie prawo, poniewa\u017c czasami metody po prostu nie mog\u0105 by\u0107 tak kr\u00f3tkie. To znaczy, my\u015bl\u0119, \u017ce mogliby, ale w pewnym momencie wydaje si\u0119 to jak mikrozarz\u0105dzanie kodem, prawda?<\/p>\n<p>Robienie czego\u015b dla samego robienia to jedno, ale robienie czego\u015b dla sensownego programowania to co innego. Za ka\u017cdym razem wybior\u0119 p\u00f3\u017aniej.<\/p>\n<p>W ka\u017cdym razie, oto przyk\u0142ad: Powiedzmy, \u017ce masz jaki\u015b kod, kt\u00f3ry jest wywo\u0142ywany przez Ajax i zanim przejdziesz do operacji, musisz wiedzie\u0107, czy istnieje niestandardowy typ postu.<\/p>\n<p>Kroki, aby zrobi\u0107 co\u015b takiego, mog\u0105 wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n<ul>\n<li>zainicjowa\u0107 wywo\u0142anie Ajax,<\/li>\n<li>sprawd\u017a bezpiecze\u0144stwo nonce, aby upewni\u0107 si\u0119, \u017ce jest to poprawna pro\u015bba,<\/li>\n<li>sprawd\u017a, czy dane istniej\u0105,<\/li>\n<li>je\u015bli tak, zwr\u00f3\u0107 komunikat o powodzeniu; je\u015bli nie, zwr\u00f3\u0107 komunikat o b\u0142\u0119dzie.<\/li>\n<\/ul>\n<p>Wszystko to mo\u017cna oczywi\u015bcie zrobi\u0107 w jednej wiadomo\u015bci, ale za\u0142\u00f3\u017cmy, \u017ce chcemy napisa\u0107 to w serii \u0142atwych do odczytania wywo\u0142a\u0144, w kt\u00f3rych kod jest do pewnego stopnia samodokumentuj\u0105cy (nie oznacza to, \u017ce Jestem przeciwko komentarzom \u2013 wcale nie, ale to nie znaczy, \u017ce chcemy, aby nasz kod by\u0142 niejasny, prawda?).<\/p>\n<p>Najpierw <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wywo\u0142anie Ajaksu<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Nast\u0119pnie <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mamy funkcj\u0119<\/a><\/strong> po stronie serwera do jawnej weryfikacji nonce bezpiecze\u0144stwa (to oczywi\u015bcie zak\u0142ada, \u017ce \u200b\u200bpoprawnie konfigurujesz go na interfejsie):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>Nast\u0119pnie chcemy <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprawdzi\u0107, czy dane istniej\u0105:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>St\u0105d jeste\u015bmy w stanie pracowa\u0107 z obiektem odpowiedzi Ajax, oceniaj\u0105c jego w\u0142a\u015bciwo\u015b\u0107 success i odpowiednio reaguj\u0105c.<\/p>\n<h2>Krok dalej<\/h2>\n<p>P\u00f3jd\u017amy jednak o krok dalej i powiedzmy, \u017ce produkty istniej\u0105 i chcemy odzyska\u0107 wszystkie ich identyfikatory post\u00f3w. Robienie tego za pomoc\u0105 WP_Query jest do\u015b\u0107 \u0142atwe, ale powiedzmy, dla wykop\u00f3w, chcemy bezpo\u015brednio po\u0142\u0105czy\u0107 si\u0119 z baz\u0105 danych.<\/p>\n<p>Zauwa\u017c, \u017ce jest to bardziej \u0107wiczenie polegaj\u0105ce na pokazaniu sposobu na zrobienie czego\u015b, a nie argumentowaniu za u\u017cywaniem <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> przez <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. To jest tre\u015b\u0107 na ca\u0142y inny post.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.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-162675-61e7429944302.png\" alt=\"O pisaniu czytelnych funkcji WordPress\"><\/a><\/p>\n<p>W ka\u017cdym razie ustalili\u015bmy, \u017ce dane istniej\u0105. Wi\u0119c we\u017amy tablic\u0119 wszystkich identyfikator\u00f3w post\u00f3w i zwr\u00f3\u0107my j\u0105 lub pust\u0105 tablic\u0119. By\u0107 mo\u017ce wygl\u0105da\u0142oby to <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mniej wi\u0119cej tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>Gdy warto\u015bci zostan\u0105 zwr\u00f3cone, mo\u017cemy na nich operowa\u0107 w dowolny spos\u00f3b.<\/p>\n<h2>Jaki jest cel tego wszystkiego?<\/h2>\n<p>Og\u00f3lnie rzecz bior\u0105c, ma nam pom\u00f3c my\u015ble\u0107 o kodzie w taki spos\u00f3b, aby\u015bmy byli w stanie odczyta\u0107 go prawie tak blisko s\u0142owa pisanego, jak to tylko mo\u017cliwe. Oznacza to, \u017ce jeste\u015bmy w stanie wskaza\u0107 fragment kodu, jak powiedzmy:<\/p>\n<blockquote>\n<p>Najpierw zobaczymy, czy co\u015b istnieje. Je\u015bli nie, wy\u015blemy b\u0142\u0105d; w przeciwnym razie przechwycimy dane i b\u0119dziemy nad nimi pracowa\u0107.<\/p>\n<\/blockquote>\n<p>To prawda, m\u00f3wi\u0119 tutaj mniej konkretnie, ale to dlatego, \u017ce niekoniecznie wiem, z czym pracujesz, tak samo jak ty o mojej pracy. Ale masz pomys\u0142, prawda?<\/p>\n<p>Co wi\u0119cej, je\u015bli szukasz kodu test\u00f3w jednostkowych, kt\u00f3ry jest oddzielony od WordPressa, mo\u017cesz to zrobi\u0107 za pomoc\u0105 interfejs\u00f3w, kt\u00f3re symuluj\u0105 funkcje, a nawet uruchamiaj\u0105 bezpo\u015brednie zapytania w bazie danych bez konieczno\u015bci korzystania z WordPressa.<\/p>\n<p>Ale, podobnie jak w przypadku niekt\u00f3rych punkt\u00f3w wymienionych powy\u017cej, jest to temat na inny post.<\/p>\n<p>Obecnie pisz\u0119 e-booka (wraz z wieloma innymi tre\u015bciami premium). Je\u015bli jeste\u015b zainteresowany, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprawd\u017a co otrzymujesz<\/a>.<\/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>Co w\u0142a\u015bciwie oznacza pisanie czytelnych funkcji WordPressa? Nie ma jednej, idealnej i dok\u0142adnej w\u0142a\u015bciwej odpowiedzi, ale mo\u017ce takie podej\u015bcie pomo\u017ce.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[866],"tags":[1169],"class_list":["post-230170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230170","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=230170"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230170\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}