{"id":230855,"date":"2022-12-06T15:25:00","date_gmt":"2022-12-06T12:25:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230855"},"modified":"2022-12-06T15:26:12","modified_gmt":"2022-12-06T12:26:12","slug":"wordpress-tyyppien-naekymien-ja-tilaajien-jaerjestaeminen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-tyyppien-naekymien-ja-tilaajien-jaerjestaeminen\/","title":{"rendered":"WordPress-tyyppien, -n\u00e4kymien ja -tilaajien j\u00e4rjest\u00e4minen"},"content":{"rendered":"\n<p>Yksi asioista, joita yrit\u00e4n tehd\u00e4 s\u00e4\u00e4nn\u00f6llisesti, on virtaviivaistaa WordPress-painotteisten toimintojen rakentamista. <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/yksinkertainen-opas-wordpress-keskeisten-kurssien-jaerjestaemiseen\/\" title=\"Olen \u00e4skett\u00e4in puhunut t\u00e4st\u00e4,\">Olen \u00e4skett\u00e4in puhunut t\u00e4st\u00e4,<\/a><\/strong> mutta ajattelin laajentaa sit\u00e4 hieman enemm\u00e4n.<\/p>\n<p>Toisin sanoen ajattelin esitell\u00e4 l\u00e4hestymistavan, jota k\u00e4yt\u00e4n rakentaessani asioita, kuten mukautettuja viestityyppej\u00e4, taksonomioita, metalaatikoita ja niin edelleen.<\/p>\n<p>Yleens\u00e4 ajattelen t\u00e4t\u00e4 strategiana, jota noudatan rakentaessani sellaisia \u200b\u200bprojektin n\u00e4k\u00f6kohtia, jotka liittyv\u00e4t suoraan WordPressiin, mutta jotka voivat vaatia muutamia komponentteja, kuten:<\/p>\n<ul>\n<li>luokat, jotka rekister\u00f6iv\u00e4t itsens\u00e4 WordPressiin erilaisten koukkujen kautta,<\/li>\n<li>luokat, jotka vaativat kutsuja tiettyihin WordPress-sovellusliittymiin<\/li>\n<li>ja luokat, jotka vaativat mukautetun n\u00e4kym\u00e4n.<\/li>\n<\/ul>\n<p>Kaikki WordPressin kanssa k\u00e4ytt\u00f6liittym\u00e4t eiv\u00e4t tietenk\u00e4\u00e4n tarvitse kaikkia yll\u00e4 olevia (esimerkiksi tarvitseeko mukautettu viestityyppi n\u00e4kym\u00e4\u00e4? Ei. Mutta metalaatikko tarvitsee.)<\/p>\n<h2>WordPress-tyyppien j\u00e4rjest\u00e4minen<\/h2>\n<p>T\u00e4m\u00e4n sanottuani otan osallistuvamman esimerkin, kuten metalaatikon, ja sitten rikon tavan, jolla se voidaan mielest\u00e4ni toteuttaa. Merkitsen ne asiat, jotka ovat mielest\u00e4ni tarpeellisia ja valinnaisia.<\/p>\n<p>Ja kuten sanoin, k\u00e4yt\u00e4n metalaatikkoa esimerkkin\u00e4, koska minulla on aikaisempi viittaus ja se vaatii eniten ty\u00f6t\u00e4, kun taas jokin muu, kuten mukautettu taksonomia, ei v\u00e4ltt\u00e4m\u00e4tt\u00e4 vaadi kaikkia (vain osajoukkoa) kappaleista .<\/p>\n<p>T\u00e4m\u00e4n sanottuani, anna minun esitt\u00e4\u00e4 l\u00e4hestymistapani.<\/p>\n<h3>Tarvitsemme tilaajia<\/h3>\n<p>Olen puhunut t\u00e4st\u00e4 tietyst\u00e4 mallista tarpeeksi siihen pisteeseen, ett\u00e4 aion yksinkertaisesti <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">linkitt\u00e4\u00e4 sen m\u00e4\u00e4ritelm\u00e4\u00e4n<\/a>. Jos luet t\u00e4t\u00e4 sivua, olet todenn\u00e4k\u00f6isesti hyvin tietoinen WordPressin erilaisista koukuista ja niiden k\u00e4ytt\u00e4misest\u00e4.<\/p>\n<p>Kuva: Alexander Andrews Unsplashissa<\/p>\n<p>Mutta syy, miksi haluan mainita sen, johtuu siit\u00e4, ett\u00e4 sen sijaan, ett\u00e4 ajattelet funktion kytkemist\u00e4 k\u00e4ynnistym\u00e4\u00e4n aina, kun jotain tapahtuu, haluan sinun ajattelevan objektia, joka tilaa tapahtuman sen tapahtuessa.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 tarvitsemme tietyn tyyppisen tilaajaluokan.<\/p>\n<h3>WordPress API luokat<\/h3>\n<p>Toiseksi tarvitsemme luokkia, jotka vastaavat suoraan WordPress-liittym\u00e4st\u00e4. N\u00e4m\u00e4 ovat luokat, jotka kutsuvat WordPress API:ta ja rekister\u00f6iv\u00e4t sen, mist\u00e4 he ovat vastuussa.<\/p>\n<p>Eli ehk\u00e4 he m\u00e4\u00e4rittelev\u00e4t mukautetun viestityypin tai kenties, kuten todettiin, he aikovat m\u00e4\u00e4ritell\u00e4 metalaatikon.<\/p>\n<h3>N\u00e4kymien m\u00e4\u00e4ritt\u00e4minen<\/h3>\n<p>Lopuksi on t\u00e4rke\u00e4\u00e4 huomata, ett\u00e4 joihinkin WordPress-hallinta-alueen mukautettuihin toimintoihin (tai jopa julkisiin alueisiin) saatat haluta sis\u00e4llytt\u00e4\u00e4 n\u00e4kym\u00e4n tai mallin tai osan (jota yleens\u00e4 kutsun vain n\u00e4kymiksi), joka ty\u00f6 edustaa metalaatikon tietoja.<\/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=\"WordPress-tyyppien, -n\u00e4kymien ja -tilaajien j\u00e4rjest\u00e4minen\"><\/a><\/p>\n<p>Kuva: Saketh Garuda Unsplashissa<\/p>\n<p>Joskus t\u00e4m\u00e4 on yksinkertaisesti informatiivinen. Joskus t\u00e4m\u00e4 edellytt\u00e4\u00e4, ett\u00e4 se l\u00e4hett\u00e4\u00e4 takaisin palvelimelle ja sarjoittaa tiedot. Vaikka uskon, ett\u00e4 j\u00e4lkimm\u00e4isest\u00e4 puhuminen olisi todella hy\u00f6dyllist\u00e4, se ei kuulu t\u00e4m\u00e4n viestin nykyiseen soveltamisalaan.<\/p>\n<p>Ehk\u00e4 jossain tulevassa postauksessa.<\/p>\n<h2>Luokkien j\u00e4rjest\u00e4minen<\/h2>\n<p>Mit\u00e4 se kaikki sanoi, milt\u00e4 n\u00e4ytt\u00e4isi t\u00e4m\u00e4n kaiken esitt\u00e4minen? Ainakin katsomme:<\/p>\n<ul>\n<li>tilaaja,<\/li>\n<li>WordPress-tyyppinen,<\/li>\n<li>n\u00e4kym\u00e4<\/li>\n<\/ul>\n<p>Ja korkeintaan saatat olla kiinnostunut m\u00e4\u00e4rittelem\u00e4\u00e4n rajapintoja tai abstrakteja luokkia, jotka auttavat toimeenpanemaan sopimusta eri WordPress-tyyppien v\u00e4lill\u00e4. T\u00e4m\u00e4 on my\u00f6s terve oliol\u00e4ht\u00f6inen periaate, josta puhun seuraavassa postauksessa.<\/p>\n<p>Puhutaan nyt kuitenkin siit\u00e4, miten kukin n\u00e4ist\u00e4 m\u00e4\u00e4ritet\u00e4\u00e4n.<\/p>\n<h3>Tilaaja<\/h3>\n<p>Yksinkertaisesti sanottuna tilaaja on vastuussa kuuntelemisesta aina, kun WordPress her\u00e4tt\u00e4\u00e4 tapahtuman (julkaisee tapahtuman). Ja kun se huomaa sen, se k\u00e4ynnist\u00e4\u00e4 toiminnon, joka on koukussa siihen.<\/p>\n<p>T\u00e4m\u00e4 on yleens\u00e4 m\u00e4\u00e4ritelty rekisterimallissa. Jos et ole lukenut t\u00e4t\u00e4 viesti\u00e4, suosittelen sit\u00e4, mutta koodin asettaminen sille <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 melko helppoa:<\/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>Sielt\u00e4 aina, kun tapahtuma nostetaan, toiminto k\u00e4ynnistyy. Asia on kuitenkin t\u00e4ss\u00e4: Funktion on oltava osa tietty\u00e4 luokkaa. N\u00e4in ollen WordPress-tyypin tarve<\/p>\n<h3>WordPress-tyyppi<\/h3>\n<p>Tykk\u00e4\u00e4n pit\u00e4\u00e4 WordPressin kanssa k\u00e4ytt\u00f6liittym\u00e4n tyyppej\u00e4 WordPress-tyypein\u00e4 (kuten ohjelmointikielill\u00e4mme on natiivityyppej\u00e4, kuten merkkijonoja ja kokonaislukuja). WordPressiss\u00e4 on taksonomioita, metaruutuja, valikoita ja niin edelleen.<\/p>\n<p>Jotta tilaajamme toimisi kunnolla, h\u00e4nen tulee olla tietoinen WordPress-tyypist\u00e4mme. Metalaatikkoesimerkin mukaisesti <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se voi n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>Sitten meid\u00e4n on varmistettava, ett\u00e4 rekisteri on tietoinen t\u00e4st\u00e4 luokasta.<\/p>\n<h3>N\u00e4kym\u00e4<\/h3>\n<p>Lopuksi, meid\u00e4n on varmistettava, ett\u00e4 metalaatikossa on n\u00e4kym\u00e4, joka n\u00e4ytt\u00e4\u00e4 ainakin tiedot. Tietojen sarjoittaminen ja sitten n\u00e4kym\u00e4n p\u00e4ivitt\u00e4minen k\u00e4ytt\u00e4j\u00e4lle on hieman erilainen peto.<\/p>\n<p>Mutta milt\u00e4 n\u00e4kym\u00e4 voi n\u00e4ytt\u00e4\u00e4? <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-02-acme-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Helppoa<\/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>Se on vain perusmerkint\u00e4, joka tuottaa tietoa k\u00e4ytt\u00e4j\u00e4lle.<\/p>\n<h2>Sitomalla kaikki yhteen<\/h2>\n<p>Aina kun yhdist\u00e4n t\u00e4m\u00e4n kaiken, minulla on yleens\u00e4 laajennusluokka, joka saa kaiken alkuun. Jos projekti on suuri, niit\u00e4 voi olla useampi kuin yksi, mutta t\u00e4ss\u00e4 tapauksessa mielest\u00e4ni on oikein n\u00e4ytt\u00e4\u00e4, milt\u00e4 se n\u00e4ytt\u00e4\u00e4 yhdell\u00e4 luokalla.<\/p>\n<p>Joten ensinn\u00e4kin p\u00e4\u00e4laajennusluokka <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-03-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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 laajennuksen bootstrap <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-04-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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 sielt\u00e4 kaikki muu l\u00e4htee liikkeelle.<\/p>\n<h2>Ent\u00e4 edistyneemm\u00e4t toiminnot?<\/h2>\n<p>Esit\u00e4n t\u00e4m\u00e4n kysymyksen, koska olen puhunut t\u00e4st\u00e4 jo hieman aiemmin postauksessa. Puhuin nimitt\u00e4in:<\/p>\n<ol>\n<li>ajatus tietojen l\u00e4hett\u00e4misest\u00e4 takaisin palvelimelle (ja luultavasti lukeminen uudelleen),<\/li>\n<li>ja olen puhunut k\u00e4ytt\u00f6liittymien k\u00e4yt\u00f6st\u00e4.<\/li>\n<\/ol>\n<p>N\u00e4m\u00e4 ovat molemmat asioita, joihin mielest\u00e4ni kannattaa tutustua tarkemmin. Mutta ennen kuin teen sen, perustan t\u00e4m\u00e4n tiedon j\u00e4rjest\u00e4miselle on se, ett\u00e4 se on rakennettu erityisesti, koska se perustuu aikaisempiin viesteihin, kuten <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/rekisterimallin-kaeyttaeminen-wordpressissae\/\" title=\"rekisterimalliin, ja WordPress-keskeisten luokkien j\u00e4rjest\u00e4miseen my\u00f6s\">rekisterimalliin, ja WordPress-keskeisten luokkien j\u00e4rjest\u00e4miseen my\u00f6s<\/a><\/strong> <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/yksinkertainen-opas-wordpress-keskeisten-kurssien-jaerjestaemiseen\/\" title=\"metalaatikoiden\">metalaatikoiden<\/a><\/strong> kautta .<\/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>WordPress-tyyppien, n\u00e4kymien, tilaajien ja muun asiaan liittyv\u00e4n materiaalin j\u00e4rjest\u00e4minen voi olla systemaattista. T\u00e4m\u00e4 on hyv\u00e4 asia, koska se antaa meille toistettavan tavan rakentaa erilaisia \u200b\u200bprojekteja asiakkaillemme.<\/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":[864],"tags":[1166],"class_list":["post-230855","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230855"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230855\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/162655"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}