{"id":230265,"date":"2022-12-06T14:36:00","date_gmt":"2022-12-06T11:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230265"},"modified":"2022-12-06T14:39:38","modified_gmt":"2022-12-06T11:39:38","slug":"organisera-wordpress-typer-vyer-och-prenumeranter","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/organisera-wordpress-typer-vyer-och-prenumeranter\/","title":{"rendered":"Organisera WordPress-typer, vyer och prenumeranter"},"content":{"rendered":"\n<p>En av de saker som jag kommer p\u00e5 mig sj\u00e4lv f\u00f6rs\u00f6ker g\u00f6ra regelbundet \u00e4r att effektivisera hur jag bygger WordPress-fokuserad funktionalitet. <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/en-enkel-guide-foer-att-organisera-wordpress-centrerade-klasser\/\" title=\"Jag har nyligen pratat om detta\">Jag har nyligen pratat om detta<\/a><\/strong> men t\u00e4nkte att jag skulle utveckla det lite mer.<\/p>\n<p>Det vill s\u00e4ga, jag t\u00e4nkte att jag skulle l\u00e4gga upp det tillv\u00e4gag\u00e5ngss\u00e4tt jag tar n\u00e4r jag bygger saker som anpassade inl\u00e4ggstyper, taxonomier, metaboxar och s\u00e5 vidare.<\/p>\n<p>T\u00e4nk generellt p\u00e5 detta som en strategi som jag f\u00f6ljer f\u00f6r att bygga ut aspekter av ett projekt som gr\u00e4nssnitt direkt med WordPress men kan kr\u00e4va n\u00e5gra komponenter som:<\/p>\n<ul>\n<li>klasser som registrerar sig med WordPress genom olika krokar,<\/li>\n<li>klasser som kr\u00e4ver anrop till vissa WordPress-API:er<\/li>\n<li>och klasser som kr\u00e4ver en anpassad vy.<\/li>\n<\/ul>\n<p>Visst, inte alla saker som har gr\u00e4nssnitt med WordPress beh\u00f6ver allt ovanst\u00e5ende (beh\u00f6ver till exempel en anpassad inl\u00e4ggstyp en vy? Nej. Men en metabox g\u00f6r det.)<\/p>\n<h2>Organisera WordPress-typer<\/h2>\n<p>Med det sagt ska jag ta ett mer involverat exempel som en metabox och sedan bryta ner ett s\u00e4tt p\u00e5 vilket jag tror att det kan implementeras. Jag kommer att notera de saker jag tycker \u00e4r n\u00f6dv\u00e4ndiga och de saker som \u00e4r valfria.<\/p>\n<p>Och, som jag sa, jag anv\u00e4nder en metabox som exempel eftersom jag har en tidigare referens och den kr\u00e4ver mest arbete medan n\u00e5got annat som en anpassad taxonomi kanske inte kr\u00e4ver alla (bara en delm\u00e4ngd) av bitarna .<\/p>\n<p>Med det sagt, l\u00e5t mig l\u00e4gga ut min strategi.<\/p>\n<h3>Vi beh\u00f6ver prenumeranter<\/h3>\n<p>Jag har pratat tillr\u00e4ckligt om det h\u00e4r m\u00f6nstret till en punkt d\u00e4r jag helt enkelt ska <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l\u00e4nka till en definition av det<\/a>. Om du l\u00e4ser den h\u00e4r sidan \u00e4r du f\u00f6rmodligen v\u00e4l medveten om de olika krokarna och hur du anv\u00e4nder dem i WordPress.<\/p>\n<p>Foto av Alexander Andrews p\u00e5 Unsplash<\/p>\n<p>Men anledningen till att jag vill n\u00e4mna det \u00e4r att snarare \u00e4n att t\u00e4nka p\u00e5 att koppla upp en funktion f\u00f6r att avfyra n\u00e4r n\u00e5got h\u00e4nder, vill jag att du t\u00e4nker p\u00e5 ett objekt som prenumererar p\u00e5 en h\u00e4ndelse n\u00e4r den intr\u00e4ffar.<\/p>\n<p>Det betyder att vi beh\u00f6ver en typ av abonnentklass.<\/p>\n<h3>WordPress API-klasser<\/h3>\n<p>F\u00f6r det andra beh\u00f6ver vi klasser som ansvarar f\u00f6r gr\u00e4nssnitt direkt med WordPress. Det h\u00e4r \u00e4r klasserna som anropar WordPress API och registrerar vad det \u00e4n \u00e4r de ansvarar f\u00f6r att g\u00f6ra.<\/p>\n<p>Det vill s\u00e4ga, kanske kommer de att definiera en anpassad posttyp eller kanske, som sagt, de kommer att definiera en metabox.<\/p>\n<h3>Definiera vyer<\/h3>\n<p>Slutligen \u00e4r det viktigt att notera att f\u00f6r viss anpassad funktionalitet f\u00f6r WordPress-administrationsomr\u00e5det (eller till och med offentliga omr\u00e5den), kanske du vill inkludera en vy eller en mall eller en del (jag brukar bara kalla dem vyer) som arbeta f\u00f6r att representera data f\u00f6r en metabox.<\/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=\"Organisera WordPress-typer, vyer och prenumeranter\"><\/a><\/p>\n<p>Foto av Saketh Garuda p\u00e5 Unsplash<\/p>\n<p>Ibland \u00e4r detta helt enkelt informativt. Ibland kr\u00e4ver detta att den skickar tillbaka till servern och serialiserar data. \u00c4ven om jag tror att det skulle vara riktigt f\u00f6rdelaktigt att prata om det senare, ligger det utanf\u00f6r det h\u00e4r inl\u00e4ggets nuvarande omfattning.<\/p>\n<p>Kanske i ett framtida inl\u00e4gg.<\/p>\n<h2>Organisera klasser<\/h2>\n<p>Vad allt detta sa, hur skulle det se ut att l\u00e4gga ut allt detta? Vi tittar \u00e5tminstone p\u00e5:<\/p>\n<ul>\n<li>en prenumerant,<\/li>\n<li>en WordPress-typ,<\/li>\n<li>En utsikt<\/li>\n<\/ul>\n<p>Och som mest kan du vara intresserad av att definiera gr\u00e4nssnitt eller abstrakta klasser f\u00f6r att hj\u00e4lpa till att genomdriva ett kontrakt mellan de olika WordPress-typerna. Detta \u00e4r ocks\u00e5 en sund objektorienterad princip som jag kommer att prata om i ett framtida inl\u00e4gg.<\/p>\n<p>F\u00f6r nu, men l\u00e5t oss prata om hur man st\u00e4ller in var och en av dessa.<\/p>\n<h3>Abonnenten<\/h3>\n<p>Enkelt uttryckt \u00e4r prenumeranten ansvarig f\u00f6r att lyssna p\u00e5 n\u00e4r WordPress tar upp ett evenemang (publicerar ett evenemang). Och n\u00e4r den m\u00e4rker att den g\u00f6r det, aktiverar den en funktion som \u00e4r kopplad till den.<\/p>\n<p>Detta definieras i allm\u00e4nhet i registerm\u00f6nstret. Om du inte har l\u00e4st det inl\u00e4gget rekommenderar jag det, men att st\u00e4lla in koden f\u00f6r det <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\">\u00e4r ganska enkelt:<\/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>D\u00e4rifr\u00e5n, n\u00e4rhelst eventet h\u00f6js, kommer funktionen att aktiveras. Men h\u00e4r \u00e4r grejen: Funktionen m\u00e5ste vara en del av en viss klass. Allts\u00e5 behovet av WordPress-typ<\/p>\n<h3>WordPress-typen<\/h3>\n<p>Jag gillar att betrakta de typer av saker som gr\u00e4nssnitt med WordPress som WordPress-typer (ungef\u00e4r som v\u00e5ra programmeringsspr\u00e5k har inhemska typer som str\u00e4ngar och heltal). WordPress har taxonomier, metaboxar, menyer och s\u00e5 vidare.<\/p>\n<p>F\u00f6r att v\u00e5r prenumerant ska kunna fungera korrekt m\u00e5ste den g\u00f6ras medveten om v\u00e5r WordPress-typ. I enlighet med metabox-exemplet <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kan det se ut s\u00e5 h\u00e4r:<\/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>Sedan m\u00e5ste vi se till att registret \u00e4r medvetet om denna klass.<\/p>\n<h3>Vyn<\/h3>\n<p>Slutligen, f\u00f6r en metabox m\u00e5ste vi se till att det finns en vy som \u00e5tminstone visar information. Att serialisera information och sedan uppdatera vyn f\u00f6r anv\u00e4ndaren \u00e4r lite av en annan best.<\/p>\n<p>Men hur kan en utsikt se ut? <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-02-acme-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">L\u00e4tt<\/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>Det \u00e4r bara grundl\u00e4ggande uppm\u00e4rkning som \u00e5terger information till anv\u00e4ndaren.<\/p>\n<h2>Att knyta ihop allt<\/h2>\n<p>N\u00e4r jag s\u00e4tter ihop allt detta brukar jag ha en plugin-klass som s\u00e4tter ig\u00e5ng det hela. Om ett projekt \u00e4r stort kan det finnas fler \u00e4n ett, men i det h\u00e4r fallet tycker jag att det \u00e4r okej att visa hur det ser ut med en enda klass.<\/p>\n<p>S\u00e5 f\u00f6r det f\u00f6rsta ser huvudpluginklassen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-03-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r:<\/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>Och startbandet f\u00f6r pluginet <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-04-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ser ut s\u00e5 h\u00e4r:<\/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>Och d\u00e4rifr\u00e5n s\u00e4tts allt annat ig\u00e5ng.<\/p>\n<h2>Vad s\u00e4gs om mer avancerad funktionalitet?<\/h2>\n<p>Jag st\u00e4ller denna fr\u00e5ga eftersom jag redan har pratat lite om detta tidigare i inl\u00e4gget. Jag pratade n\u00e4mligen om:<\/p>\n<ol>\n<li>id\u00e9n att skicka tillbaka data till servern (och f\u00f6rmodligen l\u00e4sa den igen),<\/li>\n<li>och jag har pratat om anv\u00e4ndningen av gr\u00e4nssnitt.<\/li>\n<\/ol>\n<p>Det h\u00e4r \u00e4r b\u00e5da saker som jag tycker \u00e4r v\u00e4rda att utforska n\u00e4rmare. Men innan jag g\u00f6r det, l\u00e4gger grunden f\u00f6r hur jag organiserar denna information, att den \u00e4r byggd speciellt med tanke p\u00e5 att den bygger p\u00e5 tidigare inl\u00e4gg som <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/anvaenda-registermoenstret-i-wordpress\/\" title=\"Registry Pattern\">Registry Pattern<\/a><\/strong> och organiserar WordPress-centrerade klasser via <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/en-enkel-guide-foer-att-organisera-wordpress-centrerade-klasser\/\" title=\"metaboxar\">metaboxar<\/a><\/strong> ocks\u00e5.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Organisering av WordPress-typer, vyer, prenumeranter och annat relaterat material kan vara systematiskt. Detta \u00e4r bra eftersom det ger oss ett repeterbart s\u00e4tt att bygga olika projekt f\u00f6r v\u00e5ra kunder.<\/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":[868],"tags":[1173],"class_list":["post-230265","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=230265"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230265\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/162655"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}