{"id":231749,"date":"2023-01-08T09:50:00","date_gmt":"2023-01-08T06:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231749"},"modified":"2023-01-08T09:51:20","modified_gmt":"2023-01-08T06:51:20","slug":"uso-de-un-registro-suscriptores-y-servicios-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/uso-de-un-registro-suscriptores-y-servicios-en-wordpress\/","title":{"rendered":"Uso de un registro, suscriptores y servicios en WordPress"},"content":{"rendered":"\n<p><strong>TL; DR:<\/strong> Encuentro que el uso de un registro, suscriptores y servicios es muy \u00fatil al crear complementos y utilidades centrados en el back-end para WordPress. Esta publicaci\u00f3n explica c\u00f3mo hacerlo.<\/p>\n<hr \/>\n<p>Despu\u00e9s de trabajar con patrones de dise\u00f1o, programaci\u00f3n orientada a objetos y WordPress durante a\u00f1os, es probable que surjan formas comunes de resolver problemas.<\/p>\n<p>As\u00ed es como obtuvimos patrones de dise\u00f1o orientados a objetos para empezar, as\u00ed que tal vez esta sea una variaci\u00f3n centrada en WordPress de eso.<\/p>\n<p>Aunque he escrito sobre cosas como los registros en art\u00edculos anteriores (y algunos que ni siquiera son <a href=\"https:\/\/wordpress.mediadoma.com\/es\/usando-el-patron-de-registro-en-wordpress\/\" title=\"tan antiguos\">tan antiguos<\/a> ), nunca es una mala idea volver a visitar el mismo tema, especialmente cuando hay algo que seguir agregando a la toma anterior.<\/p>\n<h2>Un Registro, Suscriptores y Servicios<\/h2>\n<p>Todo lo que se describe a continuaci\u00f3n debe entenderse dentro del contexto del complemento de WordPress. Es decir, esto no est\u00e1 destinado a ser le\u00eddo como una forma de trabajar con otros marcos, lenguajes, aplicaciones o cuando se usa con otros patrones.<\/p>\n<p>Recuerda eso al leer esto.<\/p>\n<hr \/>\n<p>De todos modos, la idea general detr\u00e1s de la combinaci\u00f3n de estos tipos de objetos es la siguiente:<\/p>\n<ol>\n<li>El registro maneja todos los suscriptores,<\/li>\n<li>Los suscriptores escuchan ganchos dentro de WordPress (los que existen o incluso ganchos personalizados),<\/li>\n<li>Los servicios hacen el trabajo real cada vez que el suscriptor los env\u00eda.<\/li>\n<\/ol>\n<p>El objetivo es que haya un lugar \u00fanico para registrar las clases responsables de enviar el trabajo. Eso es todo.<\/p>\n<p>Adem\u00e1s, esto tambi\u00e9n facilita mantener las cosas separadas, de modo que si desea probar sus servicios de forma aislada, es mucho m\u00e1s f\u00e1cil porque no est\u00e1n necesariamente acoplados estrechamente a WordPress. Y si lo son, puede simular los datos que deben pasarse a una funci\u00f3n determinada y luego evaluar el resultado.<\/p>\n<p>Sin embargo, este no es un art\u00edculo sobre pruebas, as\u00ed que volvamos a las clases reales.<\/p>\n<h3>Registro<\/h3>\n<p>Por definici\u00f3n, el prop\u00f3sito de un registro es hacer un seguimiento de las cosas. Cuando se trata de implementar este patr\u00f3n en WordPress, la idea es que el registro pueda realizar un seguimiento de los suscriptores (que definir\u00e9 m\u00e1s adelante en este art\u00edculo).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Uso de un registro, suscriptores y servicios en WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> en <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Adem\u00e1s, la idea es que cuando llegue el momento, que probablemente ser\u00e1 diferente seg\u00fan la estructura de su complemento, todos los suscriptores ser\u00e1n instanciados. Sin embargo, hasta ese punto, es probable que desee hacerlo al principio del ciclo de vida de WordPress.<\/p>\n<p>Dicho esto, aqu\u00ed tienes un ejemplo de c\u00f3mo hacer el c\u00f3digo para dar de alta a los suscriptores:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>A continuaci\u00f3n, aqu\u00ed hay una funci\u00f3n para instanciar a los suscriptores.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Estos bloques pueden ser parte de la misma funci\u00f3n o pueden estar separados seg\u00fan sus necesidades.<\/p>\n<h3>Suscriptores<\/h3>\n<p>Como se mencion\u00f3, los suscriptores son la manera de:<\/p>\n<ol>\n<li>Escuche un cierto gancho en WordPress<\/li>\n<li>Env\u00ede un Servicio para hacer cualquier trabajo que est\u00e9 destinado para el gancho dado.<\/li>\n<\/ol>\n<p>As\u00ed que suponga por un momento que desea hacer algo cada vez que se elimine un usuario. Desea crear una instancia de un servicio a trav\u00e9s del suscriptor siempre que ocurra este gancho.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Uso de un registro, suscriptores y servicios en WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbell<\/a> en <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Como ejemplo:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Tenga en cuenta que el suscriptor conoce el servicio (aunque no depende de \u00e9l, ya que es simplemente un intermediario entre WordPress y el servicio) y especifica el gancho en el servicio que est\u00e1 instanciando.<\/p>\n<h3>Servicios<\/h3>\n<p>Finalmente, los servicios son los objetos que hacen todo el trabajo pesado en un complemento. Esto significa que si necesitan leer o escribir en la base de datos, el sistema de archivos, la red, procesar datos, etc., todo sucede dentro de su contexto.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Uso de un registro, suscriptores y servicios en WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik Mclean<\/a> en <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Pueden ser conscientes de otras clases, pueden no serlo. Pueden implementar una interfaz o una clase abstracta o no. Eso est\u00e1 realmente m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n. Pero el punto es que, usando el gancho de arriba como ejemplo, si quieres hacer algo cuando se elimina un usuario, lo haces dentro del servicio.<\/p>\n<p>Por ejemplo:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>Y ese es el final. Una vez que se ejecute el servicio, el control volver\u00e1 a WordPress y la aplicaci\u00f3n continuar\u00e1 ejecut\u00e1ndose normalmente.<\/p>\n<h3>Todos juntos ahora<\/h3>\n<p>Suponiendo que tiene un archivo de arranque para su complemento, que la mayor\u00eda hace, ya que aqu\u00ed es donde se define el complemento requerido, se requiere un cargador autom\u00e1tico y se produce la creaci\u00f3n de instancias del complemento en s\u00ed.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El uso de un Registro, Suscriptores y Servicios es \u00fatil al crear complementos y utilidades centrados en el back-end para WordPress. Esta publicaci\u00f3n explica c\u00f3mo hacerlo.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,831,800,840,861],"tags":[1172],"class_list":["post-231749","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=231749"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231749\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}