{"id":228417,"date":"2022-10-22T18:50:00","date_gmt":"2022-10-22T15:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228417"},"modified":"2022-11-09T02:20:09","modified_gmt":"2022-11-08T23:20:09","slug":"refaktoryzacja-wtyczek-wordpress-maly-przyklad","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/refaktoryzacja-wtyczek-wordpress-maly-przyklad\/","title":{"rendered":"Refaktoryzacja wtyczek WordPress: ma\u0142y przyk\u0142ad"},"content":{"rendered":"\n<p>Jednym ze sposob\u00f3w, w jaki powstaj\u0105 wtyczki do WordPressa, jest to, \u017ce, przynajmniej w moim przypadku, zaczynaj\u0105 si\u0119 jako zbi\u00f3r funkcji s\u0142u\u017c\u0105cych do pomocy w okre\u015blonym celu dla danego projektu. Od tego momentu my\u015blisz \u201eHej, mo\u017ce kto\u015b inny uzna to za przydatne&quot;.<\/p>\n<p>Przynajmniej takie by\u0142o moje do\u015bwiadczenie cz\u0119\u015bciej ni\u017c nie.<\/p>\n<p>Ale chodzi o to, \u017ce zanim wypu\u015bcisz go, aby inni mogli go wypr\u00f3bowa\u0107, chcesz przej\u015b\u0107 przez proces czyszczenia kodu. Nie m\u00f3wi\u0119 te\u017c o refaktoryzacji wtyczek do WordPressa \u2013 przynajmniej jeszcze nie.<\/p>\n<p>M\u00f3wi\u0119 o wzi\u0119ciu kodu, przekszta\u0142ceniu go w co\u015b, co b\u0119dzie dzia\u0142a\u0107 jako wtyczka do WordPressa, a nast\u0119pnie ewentualnej refaktoryzacji kodu.<\/p>\n<h2>Refaktoryzacja wtyczek WordPress<\/h2>\n<p>Przej\u015bcie przez ca\u0142y proces refaktoryzacji wtyczek WordPress \u2013 nie m\u00f3wi\u0105c ju\u017c o pojedynczej wtyczce WordPress \u2013 mo\u017ce by\u0107 \u017cmudne, ale udost\u0119pnienie sposobu refaktoryzacji cz\u0119\u015bci wtyczki jest czym\u015b, co jest wykonalne.<\/p>\n<p>Wi\u0119c u\u017cyj\u0119 przyk\u0142adu tego, jak ostatnio czego\u015b u\u017cywa\u0142em (z kodem troch\u0119 abstrahowanym, aby nie zawraca\u0107 sobie g\u0142owy szczeg\u00f3\u0142owymi informacjami na temat danego projektu).<\/p>\n<p>Wykres idealnego wyj\u015bcia opcji.<\/p>\n<p>Jednak zanim to zrobi\u0119, my\u015bl\u0119, \u017ce wa\u017cne jest, aby udost\u0119pni\u0107 m\u00f3j proces mo\u017ce r\u00f3\u017cni\u0107 si\u0119 \u2013 lub prawdopodobnie \u2013 r\u00f3\u017cni si\u0119 od twojego (poniewa\u017c wielu z nas ma inne procesy).<\/p>\n<ol>\n<li>Zaprojektuj komponent (tak, nawet pe\u0142n\u0105 wtyczk\u0119) w notatniku,<\/li>\n<li>Wymy\u015bl list\u0119 kontroln\u0105 przypadk\u00f3w u\u017cycia, w kt\u00f3rych powinien przej\u015b\u0107 i kiedy powinien si\u0119 nie uda\u0107,<\/li>\n<li>Napisz, jakie dane s\u0105 potrzebne, jak s\u0105 potrzebne, a kiedy nale\u017cy je zignorowa\u0107<\/li>\n<li>Konwertuj wszystkie powy\u017csze na kod.<\/li>\n<\/ol>\n<p>Oczywi\u015bcie nie konwertuj\u0119 tego wszystkiego dos\u0142ownie na kod, ale masz pomys\u0142. By\u0107 mo\u017ce najbardziej zwi\u0119z\u0142y spos\u00f3b ujmowania tego jest taki:<\/p>\n<ul>\n<li>Zacznij od d\u0142ugiej metody, kt\u00f3ra s\u0142u\u017cy idealnemu przypadkowi u\u017cycia. Nast\u0119pnie zrefaktoryzuj ten kod, aby funkcje by\u0142y mniejsze i uwzgl\u0119dnij przypadki, w kt\u00f3rych wynik nie powiedzie si\u0119.<\/li>\n<\/ul>\n<p>Powiedziawszy to, oto jak mo\u017ce wygl\u0105da\u0107 kod.<\/p>\n<h3>1 Pisanie dla idealnego przypadku u\u017cycia<\/h3>\n<p>W tym przyk\u0142adzie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">idealnym przypadkiem u\u017cycia<\/a> jest sytuacja, gdy u\u017cytkownik \u0142aduje opcje, opcje s\u0105 obecne, a nast\u0119pnie musi wykona\u0107 akcj\u0119, je\u015bli opcje maj\u0105 okre\u015blone warto\u015bci.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Ta cz\u0119\u015b\u0107 powinna by\u0107 \u0142atwa do odczytania, ale nie uwzgl\u0119dnia niczego poza idealn\u0105 \u015bcie\u017ck\u0105 w kodzie.<\/p>\n<h3>2 Zdob\u0105d\u017a troch\u0119 defensywy<\/h3>\n<p>Nast\u0119pnie lubi\u0119 si\u0119 upewni\u0107, \u017ce opcje s\u0105 ustawione, zanim spr\u00f3buj\u0119 je przeczyta\u0107. W niekt\u00f3rych przypadkach mo\u017cesz chcie\u0107 wy\u015bwietli\u0107 powiadomienie, zg\u0142osi\u0107 wyj\u0105tek lub informacje dziennika.<\/p>\n<p>W tym przyk\u0142adzie <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">po prostu wr\u00f3c\u0119<\/a>, poniewa\u017c jest \u0142atwy do odczytania i mo\u017cna go naj\u0142atwiej dostosowa\u0107 do u\u017cytku.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Wi\u0119c to obs\u0142uguje opcje, ale co z przypadkiem, gdy opcje s\u0105 ustawione, ale nie maj\u0105 oczekiwanych warto\u015bci? Oznacza to, \u017ce musimy r\u00f3wnie\u017c zweryfikowa\u0107, czy to robi\u0105. A je\u015bli nie, zignoruj \u200b\u200bje, wr\u00f3\u0107, zarejestruj b\u0142\u0105d, zg\u0142o\u015b wyj\u0105tek i tak dalej.<\/p>\n<p>Wiesz: to samo, co powy\u017cej. Z wyj\u0105tkiem tego, \u017ce w tym przypadku nie podejm\u0119 \u017cadnych dzia\u0142a\u0144, chyba \u017ce kod zawiera idealn\u0105 informacj\u0119.<\/p>\n<h3>3 Troch\u0119 przyd\u0142ugie<\/h3>\n<p>W tym momencie metoda staje si\u0119 nieco d\u0142u\u017csza i trudniejsza do odczytania. Oczywi\u015bcie, je\u015bli jeste\u015b do\u015bwiadczonym programist\u0105, mo\u017cesz stwierdzi\u0107, \u017ce \u201eTo jest kod, to nie jest angielski&#8221;, ale dlaczego nie d\u0105\u017cy\u0107 do tego, aby troch\u0119 \u0142atwiej by\u0142o go \u015bledzi\u0107?<\/p>\n<p>Dodatkowo u\u0142atwia to testowanie. Ale to wykracza poza zakres tego postu. We\u017a ocen\u0119 opcji jako pierwszy przyk\u0142ad kodu.<\/p>\n<ol>\n<li>Jest to co\u015b, co mo\u017cna owin\u0105\u0107 w jego funkcj\u0119, kt\u00f3ra nie tylko izoluje to sprawdzenie, ale tak\u017ce sprawia, \u017ce \u200b\u200bwynikowe wywo\u0142anie jest nieco \u0142atwiejsze.<\/li>\n<li>Nast\u0119pnie we\u017a drugi blok kodu, kt\u00f3ry sprawdza idealne warto\u015bci opcji. Mo\u017cna to r\u00f3wnie\u017c wyabstrahowa\u0107 z tych samych powod\u00f3w powy\u017cej.<\/li>\n<li>Na koniec skonfiguruj funkcj\u0119, aby upewni\u0107 si\u0119, \u017ce oczekiwane warto\u015bci s\u0105 ustawione dla ka\u017cdej z okre\u015blonych <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">warto\u015bci<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>Wi\u0119c teraz masz dwie mniejsze metody, kt\u00f3re zawieraj\u0105 t\u0119 sam\u0105 kontrol\u0119, kt\u00f3r\u0105 robi\u0142e\u015b.<\/p>\n<h3>4 Ostateczna funkcja<\/h3>\n<p>W tym momencie ostateczna funkcja jest znacznie \u0142atwiejsza do odczytania, poniewa\u017c ma dwie funkcje pomocnicze, kt\u00f3re obejmuj\u0105 ich obowi\u0105zki, podczas gdy <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ta powraca do oceny idealnej \u015bcie\u017cki<\/a> w kodzie:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Do\u015b\u0107 powiedzie\u0107, \u017ce je\u015bli chodzi o refaktoryzacj\u0119 wtyczek do WordPressa, to tylko jeden przyk\u0142ad, jak zrobi\u0107 tylko cz\u0119\u015b\u0107 tego. Ale to pocz\u0105tek, prawda?<\/p>\n<h2>Ca\u0142e wtyczki?<\/h2>\n<p>Wiem, prawda? Refaktoryzacja wtyczek WordPress to nie \u017cart. Ale je\u015bli zaczniesz od ma\u0142ych funkcji takich jak ta i stopniowo b\u0119dziesz porusza\u0107 si\u0119 po bazie kodu, stanie si\u0119 to \u0142atwiejsze.<\/p>\n<p>A je\u015bli sp\u0119dzisz czas na planowaniu projektu od samego pocz\u0105tku, mo\u017cesz zaoszcz\u0119dzi\u0107 du\u017co czasu na cofaniu si\u0119 i refaktoryzacji tego rodzaju rzeczy.<\/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>Refaktoryzacja wtyczek WordPress to praca. Ale je\u015bli zaczniesz od ma\u0142ych funkcji i stopniowo b\u0119dziesz porusza\u0107 si\u0119 po bazie kodu, stanie si\u0119 to \u0142atwiejsze.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,752,866,815],"tags":[1169],"class_list":["post-228417","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-otwarte-zrodlo","category-wordpress-7","category-wtyczki","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228417","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=228417"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228417\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}