{"id":230804,"date":"2022-12-18T19:32:00","date_gmt":"2022-12-18T16:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230804"},"modified":"2022-12-18T19:35:44","modified_gmt":"2022-12-18T16:35:44","slug":"wordpressi-vidinad-uembertoeoetamine-7-osa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-7-osa\/","title":{"rendered":"WordPressi vidinad: \u00fcmbert\u00f6\u00f6tamine, 7. osa"},"content":{"rendered":"\n<p>Viimastes postitustes oleme teinud palju t\u00f6\u00f6d, et viia kood \u00fcmbert\u00f6\u00f6tamise punktini, mida selles artiklis k\u00e4sitletakse.<\/p>\n<p>T\u00e4psemalt oleme k\u00e4sitlenud j\u00e4rgmist:<\/p>\n<ul>\n<li>konksud,<\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">register<\/a>, _<\/li>\n<li>ja <a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-vidinad-uembertoeoetamine-3-osa\/\" title=\"Abonendid\">Abonendid<\/a>.<\/li>\n<\/ul>\n<p>K\u00f5ik need m\u00e4ngivad rolli selles, mida me t\u00e4na teeme.<\/p>\n<h2>WordPressi vidina katlaplaat: \u00fcmbert\u00f6\u00f6tamine, 7. osa<\/h2>\n<p><a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Need, kes on WordPressi vidinate API<\/a> -ga tuttavad, teavad t\u00f5en\u00e4oliselt, et see pole viimastel aastatel palju muutunud.<\/p>\n<p>Lisaks koosneb see tegelikult ainult neljast funktsioonist (millest \u00fcks on konstruktor):<\/p>\n<ol>\n<li>Konstruktor vastutab vidina mitme atribuudi, k\u00f5ige sagedamini selle nime ja kirjelduse, m\u00e4\u00e4ramise eest.<\/li>\n<li>Vidina funktsioon vastutab vidina sisu renderdamise eest.<\/li>\n<li>Vormi funktsioon vastutab vidinaga t\u00f6\u00f6tamisel vormi kuvamise eest WordPressi haldusalas.<\/li>\n<li>V\u00e4rskendusfunktsioon vastutab andmebaasi salvestatud valikute v\u00e4rskendamise eest (v\u00f5i l\u00e4htestab ja seej\u00e4rel salvestab suvandid, mida andmebaasis veel ei pruugi olla).<\/li>\n<\/ol>\n<p>Tore on see, et see konkreetne l\u00e4henemine saavutatakse <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> klassi funktsionaalsuse p\u00e4rimisega.<\/p>\n<p>Probleem on aga selles, et \u00fche klassi jaoks on see palju t\u00f6\u00f6d.<\/p>\n<p>Selle asemel peaksime eraldama k\u00f5ik funktsioonid oma funktsionaalsusaladeks.<\/p>\n<p>Nagu iga programmeerimise puhul, on ka viise, kuidas m\u00f5ned asjad on selged, kuidas neid saab teha, ja siis on asju, mida saab teha mitmel viisil.<\/p>\n<p>Esitan seda, kuidas ma praegu sellele l\u00e4henen. See v\u00f5ib tulevikus muutuda v\u00f5i v\u00f5ib-olla mitte ja teistel v\u00f5ib see olla erinev.<\/p>\n<p>Sellest hoolimata on rakendamine palju rohkem objektorienteeritud ja annab igale klassile oma kohustused.<\/p>\n<p>Esimene k\u00fcsimus on aga, kuidas jagada nelja funktsiooniga klass, mis p\u00e4rib \u00fclemklassilt?<\/p>\n<h3>Bootstrapi v\u00e4rskendamine<\/h3>\n<p>Esiteks peame pistikprogrammi alglaadimisribas kohandama m\u00f5nda asja. Nimelt peame tegema j\u00e4rgmist:<\/p>\n<ol>\n<li>luua registri ja teha see projekti kaudu k\u00e4ttesaadavaks,<\/li>\n<li>v\u00e4rskendage pluginaklassi, et see aktsepteeriks registrit ja laadiks tellijad,<\/li>\n<li>vaata alglaadimisriba \u00fcle<\/li>\n<\/ol>\n<p>Siin on \u00fclevaade k\u00f5igist kolmest \u00fclaltoodust.<\/p>\n<h3>1 Looge register<\/h3>\n<p>Kuna oleme seda juba sarjas varem k\u00e4sitlenud, peaks olema selge, kuidas seda teha.<\/p>\n<p>Esiteks <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-00-instantiate-the-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vaadake j\u00e4rgmist koodi<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});<\/code><\/pre>\n<p>J\u00e4rgmisena pange t\u00e4hele, et me loome registri (r\u00e4\u00e4gime hetkeks selle nimeruumist) ja \u00fchendame selle kohandatud filtriga, mis v\u00f5imaldab meil sellele pistikprogrammis igal ajal juurde p\u00e4\u00e4seda.<\/p>\n<h3>2 V\u00e4rskendage pluginaklassi<\/h3>\n<p>J\u00e4rgmisena peame v\u00e4rskendama pistikprogrammi p\u00f5hiklassi (mis asub\u00a0 kataloogis <strong>src<\/strong> ), et see viitaks registrile ja laadiks <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-01-update-the-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">k\u00f5ik registreeritud abonendid<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/**\n * The base class for this plugin. Maintains a copy of the registry and starts\n * all of the objects that should hook into WordPress.\n *\/\nclass Plugin\n{\n    \/**\n     * @var Registry a reference to the simple container used to maintain plugin objects\n     *\/\n    private $registry;\n\n    \/**\n     * @param Registry $registry a reference to the simple container used to maintain plugin objects\n     *\/\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\n\n    \/**\n     * Iterates through each of the subscribers maintained in the registry and registers them\n     * to the proper WordPress hook.\n     *\/\n    public function start()\n    {\n        array_map(function ($subscriber) {\n            add_action($subscriber-&gt;getHook(), [$subscriber, 'load']);\n        }, $this-&gt;registry-&gt;getRegisteredSubscribers());\n    }\n}<\/code><\/pre>\n<p>Pange t\u00e4hele, et me pole veel \u00fchtegi tellijat loonud. Alustasime seda sarja varem ja n\u00fc\u00fcd on aeg selle juurde tagasi tulla, kuid teeme seda hiljem.<\/p>\n<p>Peame siiski <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-03-new-registry-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lisama funktsiooni<\/a> \u2013 isegi kui see on ajutine \u2013, et saaksime lisada klasse, mis ei ole konkreetse s\u00fcndmuse tellijad:<\/p>\n<pre><code>&lt;?php\n\/**\n * @return array all of the the objects that aren't subscribers registered with WordPress\n *\/\npublic function getRegisteredObjects()\n{\n    $objects = [];\n    foreach ($this-&gt;registry as $object) {\n        if (!$object instanceof AbstractSubscriber) {\n            $objects[] = $object;\n        }\n    }\n\n    return array_filter($objects);\n}<\/code><\/pre>\n<p>Seda muudetakse hiljem, kuna muudame p\u00f5hiklassid hiljem tellijateks.<\/p>\n<h3>3 Vaadake \u00fcle Bootstrap<\/h3>\n<p>Enne edasiminekut on minu arvates oluline alglaadimisseade \u00fcle vaadata. Kuigi teie p\u00e4is ja dokumentatsioon v\u00f5ivad erineda, on oluline meeles pidada, et teeme j\u00e4rgmist.<\/p>\n<ul>\n<li>alglaadimisriba nimevahe,<\/li>\n<li>failile juurdep\u00e4\u00e4su takistamine,<\/li>\n<li>automaatlaaduri helistamine,<\/li>\n<li>registri seadistamine,<\/li>\n<li>ja pistikprogrammi k\u00e4ivitamine.<\/li>\n<\/ul>\n<p>See k\u00f5lab palju, kuid <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-02-the-current-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kood on \u00fcsna l\u00fchike<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * WordPress Widget Boilerplate\n *\n * The WordPress Widget Boilerplate is an organized, maintainable boilerplate for building\n * widgets using WordPress best practices.\n *\n * @package   WordPressWidgetBoilerplate\n * @author    Your Name &lt;email@example.com&gt;\n * @license   GPL-3.0+\n * @link      http:\/\/example.com\n * @copyright 2018 - 2019 Your Name or Company Name\n *\n * @wordpress-plugin\n * Plugin Name:       WordPress Widget Boilerplate\n * Plugin URI:        https:\/\/github.com\/tommcfarlin\/wordpress-widget-boilerplate\n * Description:       An object-oriented foundation for building WordPress Widgets.\n * Version:           1.0.0\n * Author:            Tom McFarlin\n * Author URI:        https:\/\/tommcfarlin.com\n * Text Domain:       widget-name\n * License:           GPL-3.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n * Domain Path:       \/lang\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\nuse WordPressWidgetBoilerplatePlugin;\n\n\/\/ Prevent this file from being called directly.\ndefined('WPINC') || die;\n\n\/\/ Include the autoloader.\nrequire_once __DIR__. '\/vendor\/autoload.php';\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Start the machine.\n(new Plugin($registry))-&gt;start();\n<\/code><\/pre>\n<p>Siinkohal on aga aeg vaadata, mis tunne on jagada alamklass tavalisest <a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vidinate API<\/a> -st millekski, mis sobib meie kasutatava koodimudeliga.<\/p>\n<h2>Lapse klassi jagamine<\/h2>\n<p>See osa h\u00f5lmab t\u00f5en\u00e4oliselt m\u00f5nda postitust, kuna seal on veel natuke t\u00f6\u00f6d teha, kuid alustame oma vidinaklassi loomisega, mis p\u00e4rib p\u00f5hividinate klassist.<\/p>\n<p>K\u00f5igepealt tehke <strong>src kataloogis<\/strong> <strong>API<\/strong> kataloog ja lisage fail nimega <strong>Widget.php<\/strong>. See on koht, kus asuvad vidina p\u00f5hit\u00f5ed. J\u00e4rgmises postituses k\u00e4sitleme administratiivseid ja avalikke laaditabeleid ning JavaScripti faile.<\/p>\n<p>Siinkohal peaksid faili p\u00f5hit\u00f5ed v\u00e4lja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-04-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4gema j\u00e4rgmised<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateAPI;\n\nuse WP_Widget;\n\nclass Widget extends WP_Widget\n{\n    \/**\n     * @var string unique identifier for your widget\n     *\/\n    protected $widgetSlug;\n\n    \/**\n     * Initializes the plugin by setting its properties and calling the parent class with the description.\n     *\n     * @param mixed $widgetSlug\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\n        \/\/ TODO: update description\n        parent::__construct(\n            $this-&gt;getWidgetSlug(),\n            __('Widget Name', $this-&gt;getWidgetSlug()),\n            [\n                'classname' =&gt; $this-&gt;getWidgetSlug().'-class',\n                'description' =&gt; __('Short description of the widget goes here.', $this-&gt;getWidgetSlug()),\n            ]\n        );\n    }\n\n    \/**\n     * Return the widget slug.\n     *\n     * @return string slug variable\n     *\/\n    public function getWidgetSlug()\n    {\n        return $this-&gt;widgetSlug;\n    }\n\n    \/**\n     * TODO: This is a temporary message to show that the Boilerplate has loaded.\n     *\/\n    public function load()\n    {\n        $html = '&lt;p style=\"text-align:center; background: #fff; padding: 1em; border: 1px dotted gray; margin: 2em 2em 2em 14em;\"&gt;';\n        $html .= 'The Widget Boilerplate is loaded.';\n        $html .= '&lt;\/p&gt;';\n        echo $html;\n    }\n}\n<\/code><\/pre>\n<p>Pange t\u00e4hele, et selleks on vaja \u00fchte argumenti. Olen kasutanud vidina nimi, kuid v\u00f5ite kasutada mida iganes soovite, kui see t\u00e4histab teie vidinat.<\/p>\n<p>Selle eesm\u00e4rk on n\u00e4idata, et klass on pistikprogrammi aktiveerimisel \u00f5igesti instantseeritud ja laaditud. Kui te seda ei n\u00e4e, siis on midagi valesti (selle vaatame kohe \u00fcle).<\/p>\n<p>J\u00e4rgmiseks on oluline veenduda, et see klass on registrisse lisatud. Seega lisage <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-05-add-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">alglaadimisriba j\u00e4rgmised koodiread:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Add the Widget base class to the Registry.\n$registry-&gt;add('widget', new Widget('widget-name'));<\/code><\/pre>\n<p>Ja n\u00fc\u00fcd, kui aktiveerite pistikprogrammi, peaksite n\u00e4gema j\u00e4rgmist:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160983-61e7189c9c671.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-160983-61e7189c9c671.png\" alt=\"WordPressi vidinad: \u00fcmbert\u00f6\u00f6tamine, 7. osa\"><\/a><\/p>\n<p>Kui ei, siis vaadake kindlasti arendusharus olev kood \u00fcle <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ja<\/a> veenduge, et teil on k\u00f5ik selles postituses kirjeldatu olemas.<\/p>\n<h2>Rakendatavad tellijad<\/h2>\n<p>J\u00e4rgmistes postitustes vaatleme, kuidas saaksime tellijaid saidi avalikul k\u00fcljel (st kus kuvatakse vidina sisu) juurutada. Sama teeme ka saidi haldusalaga.<\/p>\n<p>L\u00f5puks p\u00f6\u00f6rame t\u00e4helepanu koodile, mis vastutab andmete turvamise ja serialiseerimise eest (loe: meie vidina v\u00e4rskendamine) ning seej\u00e4rel vaatame, milline n\u00e4eb v\u00e4lja v\u00e4rskendatud katlaplaadi l\u00f5plik versioon.<\/p>\n<p>Selles postituses on aga peamine strateegia, mida me kasutame, alamklassi jagamine, nii et seda saab siiski kasutada teiste klassidega, kasutades liideseid ja baasklasse, mis on koodibaasis juba m\u00e4\u00e4ratletud.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>WP_Widgeti probleem seisneb selles, et \u00fche klassi jaoks on see palju t\u00f6\u00f6d. Nii et me hakkame seda kohe \u00fcmber kujundama.<\/p>\n","protected":false},"author":1,"featured_media":236064,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718],"tags":[1165],"class_list":["post-230804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=230804"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/236064"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}