{"id":228879,"date":"2022-11-01T10:09:00","date_gmt":"2022-11-01T07:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228879"},"modified":"2022-11-09T04:38:11","modified_gmt":"2022-11-09T01:38:11","slug":"wordpressi-konksude-registreerimine-teise-klassi-abil","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-konksude-registreerimine-teise-klassi-abil\/","title":{"rendered":"WordPressi konksude registreerimine teise klassi abil"},"content":{"rendered":"\n<p>Eilses <a href=\"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-pistikprogrammide-konstruktorid-ei-tohiks-konkse-maeaeratleda\/\" title=\"postituses\" >postituses<\/a> r\u00e4\u00e4kisin WordPressi pistikprogrammi konstruktoritest ja p\u00f5hjendusest, miks konksud ei tohiks konstruktoris olla.<\/p>\n<p>Kuigi mainisin mitmeid viise konksude registreerimise k\u00e4sitlemiseks, ei vaevunud ma iga strateegia \u00fcksikasjadesse laskuma. Minu arvates v\u00e4\u00e4rivad nad oma artiklit, et anda v\u00f5imalikult palju \u00fcksikasjalikku teavet selle kohta, kuidas midagi seadistada.<\/p>\n<p>N\u00e4iteks \u00fctles \u00fcks meetoditest, mida jagasin:<\/p>\n<ul>\n<li>WordPressiga on v\u00f5imalik luua klass, mis haldab objektide ja konksude registrit.<\/li>\n<\/ul>\n<p>Teisis\u00f5nu, see puudutab WordPressi konksude registreerimist objektorienteeritud l\u00e4henemisviisi abil, et v\u00e4hendada pistikprogrammi komponentide sidusust ja suurendada sidusust.<\/p>\n<p>Aga mida see \u00fcldse t\u00e4hendab? Millised on selle eelised, kuidas seda seadistatakse ja kuidas seda kasutatakse?<\/p>\n<h2>WordPressi konksude registreerimine<\/h2>\n<p>Kui loete seda, olete t\u00f5en\u00e4oliselt tuttav WordPressi <a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Hooks:_Actions_and_Filters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">konksus\u00fcsteemiga<\/a>, nende k\u00e4ivitamise j\u00e4rjekorraga ja sellega, kuidas funktsioon v\u00f5i klass saab oma funktsioone WordPressis registreerida, et nad saaksid teha mis tahes t\u00f6id, mida neil vaja on.<\/p>\n<p>Ja sageli n\u00e4eme, et klassid teevad seda \u00fcksinda. Olenevalt projektist teen seda ise. Neile, kes pole tuttavad, n\u00e4eb see \u00fcldiselt v\u00e4lja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-00-plugins-loaded-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">umbes selline<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action( 'plugins_loaded', 'acme_start' );\n\/**\n * Start the machine.\n * https:\/\/www.youtube.com\/watch?v=ysoMOefPyRs\n *\/\nfunction acme_start() {\n    $plugin = new AcmeColumn();\n}\n<\/code><\/pre>\n<p>Kuid k\u00f5ike seda saab jagada sidusamateks klassideks, et anda neile klassidele veelgi v\u00e4hem vastutust (hea asi) ja v\u00e4hendada klassi v\u00f5i klasside komplekti seost WordPressiga.<\/p>\n<p>N\u00e4ide kujundusest, mille ma selles postituses lahti r\u00e4\u00e4gin.<\/p>\n<p>Selle intuitiivne olemus seisneb aga selles, et selleks on vaja v\u00e4hemalt \u00fcht teist klassi. Aga see toimib j\u00e4rgmiselt.<\/p>\n<h2>Seadistamine<\/h2>\n<p>Selle n\u00e4ite jaoks kasutame lihtsalt lihtsat klassi, mis registreerib WordPressis teatud t\u00fc\u00fcpi toimingu. Arhitektuuri idee t\u00f6\u00f6tab umbes nii:<\/p>\n<ol>\n<li>Seal on p\u00f5hiklass, millel on funktsioon, mille tahame WordPressiga siduda.<\/li>\n<li>Seal on klass, mis vastutab klassi funktsiooni WordPressiga \u00fchendamise eest.<\/li>\n<\/ol>\n<p>Piisavalt lihtne, eks? Kuid siin on konks: klass, mis vastutab antud klassi funktsioonide WordPressis registreerimise eest, on punkt, mis n\u00f5uab disainiotsust.<\/p>\n<p>Esmalt nimetame klassi <strong>HookRegistry<\/strong>, et saaksime sellele \u00f5igesti viidata. J\u00e4rgmiseks nimetame klassi koos funktsioonidega, mida tahame siduda, <strong>AcmeColumniks<\/strong> lihtsalt selleks, et esindada klassi, mis lisab uue veeru, WordPressi administraatorialal lehe armatuurlauaks.<\/p>\n<p>Kui see on paigas, taandub disainiotsus j\u00e4rgmisele:<\/p>\n<ol>\n<li>Kas\u00a0 HookRegistery peaks <strong>AcmeColumnist<\/strong> teadma<strong>?<\/strong><\/li>\n<li>Kas <strong>AcmeColumn<\/strong> peaks teadma <strong>HookRegistryst<\/strong>? <\/li>\n<\/ol>\n<p>Ma tean, et selle korraldamiseks on muid viise ja on ka strateegiaid, kuidas sellega toime tulla (nt <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">juhtimise \u00fcmberp\u00f6\u00f6ramine<\/a>) ja need on teemad, mida tasub uurida, kuid et see esialgne idee oleks v\u00f5imalikult lihtne, esitan selle. tulevane postitus.<\/p>\n<h3>Klassi kasutamine<\/h3>\n<p>Arvestades \u00fclaltoodud valikuid, edastame AcmeColumni eksemplari <strong>HookRegistrysse<\/strong><strong>,<\/strong> kui klassid on WordPressi pistikprogrammi algse k\u00e4ivitamise k\u00e4igus instantseeritud. See v\u00f5ib v\u00e4lja n\u00e4ha umbes <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-startup-process-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selline<\/a> :<a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-startup-process-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<pre><code>&lt;?php\n\nadd_action( 'plugins_loaded', 'acme_start' );\n\/**\n * Start the machine.\n * https:\/\/www.youtube.com\/watch?v=ysoMOefPyRs\n *\/\nfunction acme_start() {\n\n  $registry    = new HookRegistry();\n\n  $acme_column = new AcmeColumn( $registry );\n  $acme_column-&gt;start();\n}\n<\/code><\/pre>\n<p>J\u00e4rgmiseks, kui on aeg lasta <strong>AcmeColumnil\u00a0<\/strong> WordPressis oma funktsioonid registreerida, helistame <strong>HookRegistryle<\/strong> ja juhendame seda tegema.<\/p>\n<p>Esiteks, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-acme-column-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">AcmeColumn<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass AcmeColumn {\n\n    private $registry;\n\n    public function __construct( $registry) {\n        $this-&gt;registry = $registry;\n    }\n\n    public function start() {\n        $registry-&gt;add_hook( 'filter', 'manage_edit-page_columns', $this, 'add_page_column' );\n    }\n\n    public function add_page_column( $page_columns) {\n\n        $page_columns['template'] = 'Acme Column';\n        return $page_columns;\n    } \n}\n<\/code><\/pre>\n<p>Siis <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-02-hook-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HookRegistry<\/a> :<\/strong><\/p>\n<pre><code>&lt;?php\n\nclass HookRegistry {\n\n  public add_hook( $type, $name, $object, $method) {\n\n    $type = strtolower( $type );\n    if ('filter' !== $type || 'action' !== $type) {\n      return new WP_Error( '1', 'No proper hook type defined.' );\n    }\n  }\n\n  private function add_filter( $name, $object, $method) {\n    add_filter( $name, array( $object, $method) );\n  }\n\n  private function add_action( $name, $object, $method) {\n    add_action( $name, array( $object, $method) );\n  }\n}\n<\/code><\/pre>\n<p>Soovi korral saame pidada ka nimekirja erinevatest registreeritud klassidest ja konksudest. See v\u00f5ib olenevalt teie rakendusest olla kasulik, kuid ei pruugi, nii et jagan ainult kui &quot;siin on midagi, mida v\u00f5iksite teha&quot;.<\/p>\n<p>Ja see v\u00f5iks <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-03-hook-registry-improved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e4lja n\u00e4ha selline<\/a> (kasutades lihtsat assotsiatiivset massiivi):<\/p>\n<pre><code>&lt;?php\n\nclass HookRegistry {\n\n  private $registry;\n\n  public function __construct() {\n    $this-&gt;registery = array(); \n  }\n\n  public add_hook( $id, $type, $name, $object, $method) {\n\n    $type = strtolower( $type );\n    if ('filter' !== $type || 'action' !== $type) {\n      return new WP_Error( '1', 'No proper hook type defined.' );\n    }\n\n    if ('filter' === $type) {\n      $this-&gt;add_filter( $name, $object, $method );\n    } else {\n      $this-&gt;add_action( $name, $object, $method );\n    }\n\n    $hook_info = array(\n      $type,\n      $name,\n      $object,\n      $method,\n    );\n    $this-&gt;registry[ $id ] = $hook_info;\n  }\n\n  private function add_filter( $name, $object, $method) {\n    add_filter( $name, array( $object, $method) );\n  }\n\n  private function add_action( $name, $object, $method) {\n    add_action( $name, array( $object, $method) );\n  }\n}\n<\/code><\/pre>\n<p>Pange t\u00e4hele, et \u00fclaltoodud klassis aktsepteerib see n\u00fc\u00fcd parameetrina <strong>$id .<\/strong> Registrisse siseneva teabe tuvastamiseks on mitu v\u00f5imalust, millest k\u00f5ige lihtsam on ID ise luua.<\/p>\n<p>Kui aga soovite kasutada midagi sellist, nagu konksu nimi v\u00f5i klassi nimi, toimiks ka see. Pange t\u00e4hele, et kuna tegemist on assotsiatiivse massiiviga, v\u00f5ib see s\u00e4ilitada ainult \u00fche v\u00e4\u00e4rtuse v\u00f5tme kohta, nii et kui te ei ole ettevaatlik, v\u00f5ite varasemad andmed pr\u00fcgikasti visata.<\/p>\n<p>Sellest hoolimata pean seda valikuliseks, kuid kui see on rakendatud, on oluline veenduda, et teil on \u00f5iged funktsioonid objekti eksemplari v\u00f5tme abil toomiseks.<\/p>\n<h2>\u00dcks paljudest<\/h2>\n<p>Nagu iga seda t\u00fc\u00fcpi t\u00f6\u00f6ga seotud puhul, on ka seda v\u00f5imalik \u00fcmber kujundada v\u00f5i \u00fcmber suunata viisil, mis toimib teisiti v\u00f5i vastab teie vajadustele. Eesm\u00e4rk ei ole n\u00e4idata kindlat mustrit, kuidas midagi teha, vaid viisi, kuidas sellele l\u00e4heneda ja seda kohandada (nagu iga disainimustri puhul).<\/p>\n<p>Lisaks on selle eesm\u00e4rk tagada, et meie klassid s\u00e4ilitaksid kohustused, mille jaoks nad on loodud, v\u00f5imaldades neil end WordPressis vastavalt vajadusele registreerida. Seekord aga ei pea klass seda ise tegema.<\/p>\n<p>Selle asemel annab see vastutuse klassile, kellel on ainuvastutus nimetatud konksude registreerimise eest. Ehkki see toob sisse rohkem klasse, suurendab see \u00fchtekuuluvust ja v\u00e4hendab sidumist.<\/p>\n<p>See pakub eeliseid hoolduses, testimises ja \u00fcldises disainis.<\/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>See puudutab WordPressi konksude registreerimist objektorienteeritud l\u00e4henemisviisi abil, et v\u00e4hendada sidumist ja suurendada pistikprogrammi sidusust.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,916,812,863],"tags":[1165],"class_list":["post-228879","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-muud","category-pistikprogrammid","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228879","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=228879"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/228879\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=228879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=228879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=228879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}