{"id":229596,"date":"2022-11-23T13:57:00","date_gmt":"2022-11-23T10:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229596"},"modified":"2022-11-09T08:37:41","modified_gmt":"2022-11-09T05:37:41","slug":"szablonowanie-i-logika-warunkowa-z-oop-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/szablonowanie-i-logika-warunkowa-z-oop-w-wordpress\/","title":{"rendered":"Szablonowanie i logika warunkowa z OOP w WordPress"},"content":{"rendered":"\n<p>Szablonowanie staje si\u0119 coraz bardziej powszechne w WordPressie i uwa\u017cam to za dobr\u0105 rzecz.<\/p>\n<p>Ale to nie znaczy, \u017ce nie ma projekt\u00f3w, kt\u00f3rymi zarz\u0105dzamy, kt\u00f3re stosuj\u0105 bardziej tradycyjne podej\u015bcie do wy\u015bwietlania szablon\u00f3w lub podszablon\u00f3w. Co wi\u0119cej, nie oznacza to r\u00f3wnie\u017c, \u017ce jeste\u015bmy zwolnieni z utrzymywania baz kodu, kt\u00f3re u\u017cywaj\u0105 kodu, kt\u00f3ry nie korzysta z silnika szablon\u00f3w.<\/p>\n<p>Chocia\u017c uwa\u017cam, \u017ce tworzenie szablon\u00f3w jest dobre, nie s\u0105dz\u0119, \u017ce zawsze jest konieczne. To jednak tre\u015b\u0107 na kolejny post.<\/p>\n<p>Zamiast tego chc\u0119 przej\u015b\u0107 przez proces u\u017cywania logiki warunkowej, czy wy\u015bwietli\u0107 cz\u0119\u015bci w szablonie i zrobi\u0107 to za pomoc\u0105 programowania obiektowego.<\/p>\n<h2>Szablonowanie i logika warunkowa z OOP<\/h2>\n<p>Aby to zrobi\u0107, za\u0142\u00f3\u017cmy, \u017ce:<\/p>\n<ol>\n<li>Mamy jedn\u0105 wtyczk\u0119, kt\u00f3ra jest zale\u017cna od innej wtyczki dla funkcji.<\/li>\n<li>Druga wtyczka jest opcjonalna.<\/li>\n<li>Je\u015bli go nie ma, wy\u015bwietlimy powiadomienie. Je\u015bli jest obecny, wy\u015bwietlimy cz\u0119\u015bciowy.<\/li>\n<\/ol>\n<p>Wystarczaj\u0105co prosto, prawda?<\/p>\n<p>Jedyn\u0105 rzecz\u0105, na kt\u00f3r\u0105 nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, jest to, \u017ce ca\u0142a ta logika zostanie zachowana w g\u0142\u00f3wnej wtyczce (czyli tej, kt\u00f3ra b\u0119dzie sprawdza\u0107 obecno\u015b\u0107 drugiej wtyczki).<\/p>\n<h3>1 Warunkowa logika szablonu<\/h3>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 nale\u017cy zrobi\u0107, jest posiadanie funkcji, kt\u00f3ra sprawdzi obecno\u015b\u0107 dodatkowej wtyczki. Powodem tego jest to, \u017ce szablon wygl\u0105da mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-00-template-example-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;div class=\"wrap\"&gt;\n    &lt;!-- Snipping out irrelevant code in this file --&gt;\n    &lt;form id=\"yhd-upload-new-item-settings\"&gt;\n        &lt;?php if (!$this-&gt;hasSecondaryPlugin()) { ?&gt;\n            &lt;?php include_once 'partials\/error-inactive-plugin.php'; ?&gt;\n        &lt;?php } else { ?&gt;\n            &lt;h2&gt;Secondary Plugin Settings&lt;\/h2&gt;\n            &lt;p class=\"description\"&gt;The Secondary Plugin is installed and active.&lt;\/p&gt;\n            &lt;form method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"&gt;\n                &lt;label for=\"acme-secondary-plugin\"&gt;\n                    &lt;input type=\"checkbox\" name=\"acme-secondary-plugin\" value=\"true\"\/&gt;\n                    Would you like to automatically use the secondary plugin?\n                &lt;\/label&gt;\n                &lt;!-- Snipping out irrelevant code in this file --&gt;\n            &lt;\/form&gt;\n        &lt;?php } ?&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>A wtedy podszablona mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-01-error-inactive-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a><\/strong> (to zale\u017cy od twojej implementacji):<\/p>\n<pre><code>&lt;?php\n\/**\n * This is the partial displayed when the Secondary Plugin is not active.\n *\/\n?&gt;\n&lt;div id=\"inactive-importer-message\" class=\"error notice is-dismissible\"&gt;\n    &lt;p&gt;[The message you want to display here.]&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;&lt;!-- #inactive-importer-message --&gt;<\/code><\/pre>\n<p>Ze wzgl\u0119du na spos\u00f3b, w jaki szablony s\u0105 zawarte w WordPress, funkcja b\u0119dzie dzia\u0142a\u0107 w klasie, a klasa b\u0119dzie sprawdza\u0107 obecno\u015b\u0107 wtyczki.<\/p>\n<p>Je\u015bli u\u017cyjesz dowolnego sniffera kodu, prawdopodobnie wywo\u0142a to ostrze\u017cenie, \u017ce metoda nie jest u\u017cywana, ale metoda jest u\u017cywana, po prostu jest u\u017cywana w pliku szablonu. Uwaga w klasie. Trzeba powiedzie\u0107, \u017ce niekt\u00f3rzy z naszych w\u0105chaj\u0105cych nie s\u0105 a\u017c tak inteligentni. Ju\u017c.<\/p>\n<h3>2 Kod po stronie serwera wtyczki<\/h3>\n<p>Kiedy ju\u017c masz og\u00f3lny pomys\u0142, jak to b\u0119dzie dzia\u0142a\u0107, nadszed\u0142 czas na napisanie kodu w twojej klasie.<\/p>\n<p>Pami\u0119taj, to prosta funkcja: wystarczy sprawdzi\u0107 obecno\u015b\u0107 wtyczki. Mo\u017cesz to zrobi\u0107 na kilka sposob\u00f3w, ale najcz\u0119stszym mo\u017ce by\u0107 u\u017cycie funkcji API <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_plugin_active\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_active_plugin .<\/a><\/strong><\/p>\n<p>Zwr\u00f3\u0107 uwag\u0119, \u017ce podczas korzystania z tej funkcji opiera si\u0119 ona na za\u0142o\u017ceniu, \u017ce znasz nazw\u0119 wtyczki, kt\u00f3rej u\u017cywasz. Je\u015bli nie, istniej\u0105 inne sposoby, ale to wykracza poza zakres tego postu.<\/p>\n<p>W ka\u017cdym razie, poniewa\u017c logika jest warunkowa, musi zwr\u00f3ci\u0107 warto\u015b\u0107 logiczn\u0105 i to jest dok\u0142adnie to, co robi powy\u017csza funkcja API. Tak wi\u0119c funkcja po stronie serwera mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-02-hassecondaryplugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Determines if the Secondary Importer is is activated.\n *\n * @return bool True if the the pklugin is active; false, otherwise.\n *\/\nprivate function hasSecondaryPlugin()\n{\n    return in_array(\n        'secondary-plugin\/secondary-plugin.php',\n        get_option('active_plugins')\n    );\n}\n<\/code><\/pre>\n<p>A poniewa\u017c kod szablonu wywo\u0142uje t\u0119 funkcj\u0119 (kt\u00f3r\u0105 widzisz powy\u017cej), okre\u015bli, czy musi pokaza\u0107 cz\u0119\u015b\u0107, czy nie.<\/p>\n<h2>Wystarczaj\u0105co \u0142atwe<\/h2>\n<p>Dla niekt\u00f3rych jest to naprawd\u0119 prosta sprawa; dla innych jest to zupe\u0142nie inne podej\u015bcie, poniewa\u017c dotyczy wi\u0119kszego oddzielenia obaw.<\/p>\n<p>A poniewa\u017c nadal pracuj\u0119 nad <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podstawami OOP<\/a><\/strong> z cz\u0142onkami witryny, my\u015bl\u0119, \u017ce wa\u017cne jest r\u00f3wnie\u017c dzielenie si\u0119 niekt\u00f3rymi lepszymi praktykami z tymi, kt\u00f3rzy mog\u0105 nie by\u0107 cz\u0142onkami, ale chc\u0105 pisa\u0107 bardziej zorganizowany kod.<\/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>U\u017cyj programowania obiektowego i logiki warunkowej, aby oddzieli\u0107 problemy mi\u0119dzy cz\u0119\u015bciami, szablonami i kodem po stronie serwera.<\/p>\n","protected":false},"author":1,"featured_media":164710,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-229596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229596","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=229596"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/164710"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}