{"id":230409,"date":"2022-12-12T19:58:00","date_gmt":"2022-12-12T16:58:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230409"},"modified":"2022-12-07T11:19:12","modified_gmt":"2022-12-07T08:19:12","slug":"strategia-inicjowania-ustawien-wtyczek","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/strategia-inicjowania-ustawien-wtyczek\/","title":{"rendered":"Strategia inicjowania ustawie\u0144 wtyczek"},"content":{"rendered":"\n<p>Za ka\u017cdym razem, gdy pracujesz nad wtyczk\u0105, kt\u00f3ra oferuje stron\u0119 ze swoimi ustawieniami, istnieje kilka sposob\u00f3w zapisywania i pobierania informacji.<\/p>\n<p>Mo\u017cesz:<\/p>\n<ul>\n<li>skorzystaj z <strong><a href=\"https:\/\/codex.wordpress.org\/Settings_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">interfejsu API ustawie\u0144<\/a><\/strong> ,<\/li>\n<li>u\u017cyj niestandardowej strony i po\u0142\u0105cze\u0144, kt\u00f3re s\u0105 hybryd\u0105 tych dw\u00f3ch,<\/li>\n<li>u\u017cyj pewnego rodzaju hybrydy mi\u0119dzy <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stron\u0105 podmenu<\/a><\/strong> (lub <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_menu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stron\u0105 menu<\/a><\/strong>) a inn\u0105 funkcjonalno\u015bci\u0105.<\/li>\n<\/ul>\n<p>Im d\u0142u\u017cej pracowa\u0142em z WordPressem, tym mniej zale\u017cy mi na korzystaniu z interfejsu Settings API i decyduj\u0119 si\u0119 na odrobin\u0119 hybrydowego podej\u015bcia.<\/p>\n<p>W zale\u017cno\u015bci od wymaga\u0144 projektu realizacja b\u0119dzie si\u0119 r\u00f3\u017cni\u0107; jednak staram si\u0119 u\u017cywa\u0107 stosunkowo sp\u00f3jnego sposobu tworzenia funkcjonalno\u015bci.<\/p>\n<p>I chocia\u017c ten post nie b\u0119dzie dotyczy\u0142 r\u00f3\u017cnych sposob\u00f3w, w jakie tworz\u0119 moje strony, powi\u0105zane klasy i tak dalej, zaoferuje jeden spos\u00f3b, w jaki mo\u017cesz inicjowa\u0107 ustawienia wtyczki podczas pracy nad swoim projektem lub projektem dla kogo\u015b innego.<\/p>\n<h2>Inicjowanie ustawie\u0144 wtyczki<\/h2>\n<p>W tym po\u015bcie za\u0142\u00f3\u017cmy, \u017ce wymagania wymagaj\u0105 przechowywania warto\u015bci strony jako tablicy asocjacyjnej, kt\u00f3ra jest oczyszczana i serializowana z poziomu wtyczki.<\/p>\n<p>Opr\u00f3cz funkcji odka\u017cania, kt\u00f3rej b\u0119dziesz potrzebowa\u0107, wiesz r\u00f3wnie\u017c, \u017ce b\u0119dziesz pracowa\u0107 z:<\/p>\n<ol>\n<li>tabela opcji,<\/li>\n<li>i jako taki unikalny klucz dla opcji przechowywanych w tabeli opcji<\/li>\n<\/ol>\n<p>Teraz, w kontek\u015bcie programowania obiektowego, zwykle mam kilka klas skonfigurowanych do obs\u0142ugi ca\u0142ej tej funkcjonalno\u015bci, ale przede wszystkim interesuje mnie pokazanie sposobu inicjowania ustawie\u0144 wtyczek.<\/p>\n<h3>Ale dlaczego?<\/h3>\n<p>Je\u015bli za\u0142adujesz stron\u0119, kt\u00f3ra ma pobiera\u0107 opcje z bazy danych, a warto\u015bci nie zosta\u0142y zainicjowane, na ekranie pojawi\u0105 si\u0119 ostrze\u017cenia lub co\u015b pojawi si\u0119 w pliku dziennika debugowania.<\/p>\n<p>Wszystko zale\u017cy od tego, jak masz skonfigurowan\u0105 instalacj\u0119 lokaln\u0105, a tak\u017ce od tego, jak host ma zdefiniowan\u0105 konfiguracj\u0119.<\/p>\n<p>Niezale\u017cnie od tego, chcesz si\u0119 upewni\u0107, \u017ce zainicjalizowa\u0142e\u015b ustawienia wtyczki, aby przynajmniej mie\u0107 ustawiony wiersz w bazie danych i pocz\u0105tkowe warto\u015bci lub puste warto\u015bci ustawione dla wtyczki.<\/p>\n<h3>Jak to zrobi\u0107<\/h3>\n<p>Jak ju\u017c wcze\u015bniej wspomnia\u0142em, poniewa\u017c jestem fanem u\u017cywania klas w mojej pracy, zwykle ustawiam klas\u0119, kt\u00f3ra odpowiada za odczytywanie i zapisywanie warto\u015bci do bazy danych. Obejmuje to inicjowanie ustawie\u0144 wtyczki.<\/p>\n<p>Aby to zrobi\u0107, zazwyczaj pracuj\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ol>\n<li>zainicjowa\u0107 klas\u0119,<\/li>\n<li>sprawdzi\u0107, czy w bazie danych istnieje jaka\u015b opcja,<\/li>\n<li>je\u015bli nie, zainicjuj go,<\/li>\n<li>je\u015bli tak, nic nie r\u00f3b.<\/li>\n<\/ol>\n<p>Pocz\u0105tkowy kod do tego mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-00-initialize-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Initializes the plugin settings fo ruse throughout the rest of the plugin.\n *\/\nprivate function initialize() {\n    $settings = [\n        'username' =&gt; '',\n        'user-info' =&gt; [\n              'location' =&gt; '',\n              'id-number' =&gt; '',\n              'first-name' =&gt; '',\n              'last-name' =&gt; '',\n        ],\n        'short-bio' =&gt; '',\n    ];\n    update_option('acme-plugin-settings', $settings);\n}\n<\/code><\/pre>\n<p>Ale poniewa\u017c ma to swoj\u0105 w\u0142asn\u0105 funkcj\u0119, mo\u017ce by\u0107 wywo\u0142ywane w konstruktorze twojej klasy lub mo\u017cesz oznaczy\u0107 go jako <strong>publiczny<\/strong> i wywo\u0142a\u0107 poza klas\u0105. W tym po\u015bcie jednak zadzwoni\u0119 do niego <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-01-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w konstruktorze<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Intiializes the properties of the class, primarily the array of settings.\n *\/\npublic function __construct() {\n    if (false === get_option('acme-plugin-settings')) {\n        $this-&gt;initialize();\n    }\n    \/\/ More to come...\n}\n<\/code><\/pre>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5a9940d1364b4d15e1de755f78bd0a79#file-02-final-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A po zainicjowaniu warto\u015bci mo\u017cna ustawi\u0107<\/a><\/strong> atrybut w klasie :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Intiializes the properties of the class, primarily the array of settings.\n *\/\npublic function __construct() {\n    if (false === get_option('acme-plugin-settings')) {\n        $this-&gt;initialize();\n    }\n    $this-&gt;settings = get_option('acme-plugin-settings');\n}\n<\/code><\/pre>\n<p>Chocia\u017c istnieje przypadek, w kt\u00f3rym nie powinno si\u0119 tego robi\u0107 w konstruktorze, lubi\u0119 mie\u0107 zainicjowane w\u0142a\u015bciwo\u015bci klasy w konstruktorze wspomnianej klasy.<\/p>\n<p>A poniewa\u017c klasa jest odpowiedzialna za utrzymywanie odniesienia do ustawie\u0144, warto zainicjowa\u0107 ustawienia tutaj.<\/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>Ten post nie obejmuje r\u00f3\u017cnych sposob\u00f3w tworzenia stron opcji, oferuje spos\u00f3b na zainicjowanie ustawie\u0144 wtyczki.<\/p>\n","protected":false},"author":1,"featured_media":234934,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,805,836,866],"tags":[1169],"class_list":["post-230409","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-przewodnik-dla-poczatkujacych","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230409","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=230409"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230409\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/234934"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}