{"id":230269,"date":"2022-12-06T14:53:00","date_gmt":"2022-12-06T11:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230269"},"modified":"2022-12-06T15:02:52","modified_gmt":"2022-12-06T12:02:52","slug":"wordpressi-tueuepide-vaadete-ja-tellijate-korraldamine","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-tueuepide-vaadete-ja-tellijate-korraldamine\/","title":{"rendered":"WordPressi t\u00fc\u00fcpide, vaadete ja tellijate korraldamine"},"content":{"rendered":"\n<p>\u00dcks asi, mida ma proovin regulaarselt teha, on WordPressile keskendunud funktsioonide loomise sujuvamaks muutmine. <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/lihtne-juhend-wordpressi-kesksete-tundide-korraldamiseks\/\" title=\"Olen sellest hiljuti r\u00e4\u00e4kinud,\">Olen sellest hiljuti r\u00e4\u00e4kinud,<\/a><\/strong> kuid m\u00f5tlesin, et r\u00e4\u00e4gin sellest veidi rohkem.<\/p>\n<p>See t\u00e4hendab, et ma m\u00f5tlesin, et kirjeldan l\u00e4henemisviisi, mida kasutan selliste asjade loomisel nagu kohandatud postitust\u00fc\u00fcbid, taksonoomiad, metakastid jne.<\/p>\n<p>\u00dcldiselt m\u00f5elge sellele kui strateegiale, mida j\u00e4rgin sellise projekti aspektide v\u00e4ljat\u00f6\u00f6tamisel, mis liidestuvad otse WordPressiga, kuid mis v\u00f5ib n\u00f5uda m\u00f5nda komponenti, n\u00e4iteks:<\/p>\n<ul>\n<li>klassid, kes registreerivad end WordPressis erinevate konksude kaudu,<\/li>\n<li>klassid, mis n\u00f5uavad teatud WordPressi API-de k\u00f5nesid<\/li>\n<li>ja klassid, mis n\u00f5uavad kohandatud vaadet.<\/li>\n<\/ul>\n<p>Muidugi ei vaja k\u00f5ik WordPressiga liidestavad asjad k\u00f5ike \u00fclaltoodut (nt kas kohandatud postituse t\u00fc\u00fcp vajab vaadet? Ei. Aga metakast seda vajab).<\/p>\n<h2>WordPressi t\u00fc\u00fcpide korraldamine<\/h2>\n<p>Seda silmas pidades v\u00f5tan ma kaasavama n\u00e4ite, n\u00e4iteks metakasti, ja seej\u00e4rel kirjeldan viisi, kuidas seda minu arvates saab rakendada. M\u00e4rgin \u00fcles asjad, mida pean vajalikuks, ja asjad, mis on valikulised.<\/p>\n<p>Ja nagu ma \u00fctlesin, kasutan n\u00e4itena metakasti, kuna mul on eelmine viide ja see n\u00f5uab k\u00f5ige rohkem t\u00f6\u00f6d, samas kui midagi muud, n\u00e4iteks kohandatud taksonoomia, ei pruugi n\u00f5uda k\u00f5iki (ainult alamhulka) t\u00fckke. .<\/p>\n<p>Seda \u00f6eldes lubage mul kirjeldada oma l\u00e4henemisviisi.<\/p>\n<h3>Vajame tellijaid<\/h3>\n<p>Olen sellest konkreetsest mustrist piisavalt r\u00e4\u00e4kinud kuni punktini, kus ma lihtsalt lingin <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selle definitsiooniga<\/a>. Kui loete seda lehte, olete t\u00f5en\u00e4oliselt h\u00e4sti teadlik erinevatest konksudest ja nende kasutamisest WordPressis.<\/p>\n<p>Foto autor Alexander Andrews saidil Unsplash<\/p>\n<p>Kuid p\u00f5hjus, miks ma seda mainida tahan, on see, et selle asemel, et m\u00f5elda funktsiooni k\u00e4ivitamisele, kui midagi juhtub, tahan, et m\u00f5tleksite objektile, mis registreerib s\u00fcndmuse, kui see juhtub.<\/p>\n<p>See t\u00e4hendab, et vajame teatud t\u00fc\u00fcpi abonendiklassi.<\/p>\n<h3>WordPressi API klassid<\/h3>\n<p>Teiseks vajame klasse, mis vastutavad otse WordPressiga liidestamise eest. Need on klassid, mis helistavad WordPressi API-le ja registreerivad k\u00f5ik, mille eest nad vastutavad.<\/p>\n<p>See t\u00e4hendab, et v\u00f5ib-olla hakkavad nad m\u00e4\u00e4ratlema kohandatud postituse t\u00fc\u00fcbi v\u00f5i, nagu \u00f6eldud, metakasti.<\/p>\n<h3>Vaadete m\u00e4\u00e4ratlemine<\/h3>\n<p>L\u00f5petuseks on oluline m\u00e4rkida, et m\u00f5ne WordPressi haldusala (v\u00f5i isegi avalike alade) kohandatud funktsioonide jaoks v\u00f5iksite lisada vaate v\u00f5i malli v\u00f5i osalise (ma \u00fcldiselt nimetan neid lihtsalt vaadeteks), mis t\u00f6\u00f6d metakasti andmete esitamiseks.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162654-61e741fa06c63.jpg\" 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-162654-61e741fa06c63.jpg\" alt=\"WordPressi t\u00fc\u00fcpide, vaadete ja tellijate korraldamine\"><\/a><\/p>\n<p>Saketh Garuda foto saidil Unsplash<\/p>\n<p>M\u00f5nikord on see lihtsalt informatiivne. M\u00f5nikord n\u00f5uab see, et see postitaks tagasi serverisse ja j\u00e4rjestaks andmed. Kuigi ma arvan, et viimasest r\u00e4\u00e4kimine oleks t\u00f5esti kasulik, j\u00e4\u00e4b see selle postituse praegusest ulatusest v\u00e4lja.<\/p>\n<p>V\u00f5ib-olla m\u00f5nes tulevases postituses.<\/p>\n<h2>Klasside korraldamine<\/h2>\n<p>Mida see k\u00f5ik \u00fctles, kuidas n\u00e4eks v\u00e4lja seda k\u00f5ike v\u00e4lja panna? V\u00e4hemalt me \u200b\u200bvaatame:<\/p>\n<ul>\n<li>tellija,<\/li>\n<li>WordPressi t\u00fc\u00fcpi,<\/li>\n<li>vaade<\/li>\n<\/ul>\n<p>Ja k\u00f5ige rohkem v\u00f5ite olla huvitatud liideste v\u00f5i abstraktsete klasside m\u00e4\u00e4ratlemisest, mis aitavad erinevate WordPressi t\u00fc\u00fcpide vahel lepinguid j\u00f5ustada. See on ka tervislik objektorienteeritud p\u00f5him\u00f5te, millest r\u00e4\u00e4gin tulevases postituses.<\/p>\n<p>Praegu aga r\u00e4\u00e4gime sellest, kuidas neid k\u00f5iki seadistada.<\/p>\n<h3>Tellija<\/h3>\n<p>Lihtsamalt \u00f6eldes vastutab tellija selle kuulamise eest, kui WordPress s\u00fcndmuse t\u00f5statab (s\u00fcndmuse avaldab). Ja kui ta seda m\u00e4rkab, k\u00e4ivitab see funktsiooni, mis on sellega \u00fchendatud.<\/p>\n<p>See on \u00fcldiselt m\u00e4\u00e4ratletud registri mustris. Kui te pole seda postitust lugenud, siis soovitan seda, kuid selle koodi seadistamine <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-00-acme-meta-box-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">on \u00fcsna lihtne:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBoxSubscriber extends AbstractSubscriber\n{\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    public function load()\n    {\n        (new AcmeMetaBox())-&gt;render();\n    }\n}\n<\/code><\/pre>\n<p>Sealt alates k\u00e4ivitub funktsioon alati, kui s\u00fcndmus t\u00f5statatakse. Siin on aga asi: funktsioon peab olema teatud klassi osa. Seega on vaja WordPress-t\u00fc\u00fcpi<\/p>\n<h3>WordPressi t\u00fc\u00fcp<\/h3>\n<p>Mulle meeldib k\u00e4sitleda WordPressiga liidestavaid asju WordPressi t\u00fc\u00fcpidena (sarnaselt meie programmeerimiskeelte algt\u00fc\u00fcpidega, nagu stringid ja t\u00e4isarvud). WordPressil on taksonoomiad, metakastid, men\u00fc\u00fcd ja nii edasi.<\/p>\n<p>Selleks, et meie tellija korralikult t\u00f6\u00f6taks, peab ta olema teadlik meie WordPressi t\u00fc\u00fcbist. Koosk\u00f5las metakasti n\u00e4itega <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00f5ib see v\u00e4lja n\u00e4ha j\u00e4rgmine:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBox extends AbstractMetaBox\n{\n    public function render()\n    {\n        add_meta_box(\n            'acme-data',\n            'Acme Data',\n            [$this, 'display'],\n            $this-&gt;postType,\n            'normal',\n            'high'\n        );\n    }\n\n    public function display()\n    {\n        include_once plugin_dir_path(__FILE__).'Views\/acme-data.php';\n    }\n}\n<\/code><\/pre>\n<p>Seej\u00e4rel peame veenduma, et register on sellest klassist teadlik.<\/p>\n<h3>Vaade<\/h3>\n<p>L\u00f5puks peame metakasti puhul tagama, et seal oleks vaade, mis kuvab v\u00e4hemalt teavet. Teabe j\u00e4rjestamine ja seej\u00e4rel kasutaja jaoks vaate v\u00e4rskendamine on veidi erinev loom.<\/p>\n<p>Aga milline v\u00f5iks vaade v\u00e4lja n\u00e4ha? <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-02-acme-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lihtne<\/a><\/strong> :<\/p>\n<pre><code>&lt;div class=\"acme-data-metabox\"&gt;\n  &lt;?php echo __('Acme Data', 'acme-meta-box'); ?&gt;\n  &lt;p class=\"description\"&gt;\n    This is the content of the metabox.\n  &lt;\/p&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>See on lihtsalt p\u00f5him\u00e4rgistus, mis annab kasutajale teavet.<\/p>\n<h2>Sidudes k\u00f5ik koos<\/h2>\n<p>Kui ma selle k\u00f5ik kokku panen, on mul tavaliselt pistikprogrammide klass, millest see k\u00f5ik alguse saab. Kui projekt on suur, v\u00f5ib neid olla rohkem kui \u00fcks, kuid sel juhul on minu arvates okei n\u00e4idata, kuidas see v\u00e4lja n\u00e4eb, kasutades \u00fchte klassi.<\/p>\n<p>Niisiis, esiteks n\u00e4eb peamine pistikprogrammi klass <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-03-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e4lja selline:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    private $registry;\n\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\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}\n<\/code><\/pre>\n<p>Ja pistikprogrammi alglaadimine <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-04-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4eb v\u00e4lja selline:<\/a><\/strong><\/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('acmeApiRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Register all of our objects with a basic registry.\n$registry-&gt;add('acmeMetaBoxSubscriber', new AcmeMetaBoxSubscriber('add_meta_boxes'));\n\n$plugin = new Plugin($registry);\n$plugin-&gt;start();<\/code><\/pre>\n<p>Ja sealt edasi l\u00e4heb k\u00f5ik muu liikuma.<\/p>\n<h2>Aga t\u00e4iustatud funktsionaalsus?<\/h2>\n<p>Ma t\u00f5statan selle k\u00fcsimuse, kuna olen sellest postituses juba natuke r\u00e4\u00e4kinud. Nimelt r\u00e4\u00e4kisin sellest:<\/p>\n<ol>\n<li>idee postitada andmed tagasi serverisse (ja t\u00f5en\u00e4oliselt neid uuesti lugeda),<\/li>\n<li>ja olen r\u00e4\u00e4kinud liideste kasutamisest.<\/li>\n<\/ol>\n<p>Need on m\u00f5lemad asjad, mida minu arvates tasub p\u00f5hjalikumalt uurida. Kuid enne seda panen selle teabe korraldamise aluse sellele, et see on \u00fcles ehitatud, eriti arvestades, et see p\u00f5hineb varasematel postitustel, nagu <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/registri-mustri-kasutamine-wordpressis\/\" title=\"registri muster,\">registri muster,<\/a><\/strong> ja WordPressi-kesksete klasside korraldamine metakastide <strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/lihtne-juhend-wordpressi-kesksete-tundide-korraldamiseks\/\" title=\"kaudu\">kaudu<\/a><\/strong>.<\/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>WordPressi t\u00fc\u00fcpide, vaadete, tellijate ja muu seotud materjali korraldamine v\u00f5ib olla s\u00fcstemaatiline. See on hea, kuna see annab meile korratava v\u00f5imaluse klientide jaoks erinevaid projekte ehitada.<\/p>\n","protected":false},"author":1,"featured_media":162655,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[863],"tags":[1165],"class_list":["post-230269","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230269","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=230269"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230269\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/162655"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}