{"id":229001,"date":"2022-11-01T11:51:00","date_gmt":"2022-11-01T08:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229001"},"modified":"2022-11-09T05:08:28","modified_gmt":"2022-11-09T02:08:28","slug":"los-constructores-de-complementos-de-wordpress-no-deberian-definir-ganchos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/los-constructores-de-complementos-de-wordpress-no-deberian-definir-ganchos\/","title":{"rendered":"Los constructores de complementos de WordPress no deber\u00edan definir ganchos"},"content":{"rendered":"\n<p>Los constructores de complementos de WordPress parecen ser cada vez m\u00e1s un tema de debate cuando se trata de lo que deben definir. Ya he hablado de eso antes, pero est\u00e1 bien volver a tratar un tema como este de vez en cuando, \u00bfverdad?<\/p>\n<p>Despu\u00e9s de todo, hay cosas que aprendemos y cosas que cambiamos a medida que ganamos m\u00e1s experiencia.<\/p>\n<p>No es nada raro ver complementos que definan ganchos y otros comportamientos, pero no soy un fan\u00e1tico de este enfoque. En cambio, creo que el manejo del registro de ganchos debe hacerse en su propia funci\u00f3n o, incluso m\u00e1s dr\u00e1sticamente, debe ser manejado por un conjunto de clases.<\/p>\n<p>Pero antes de entrar en eso, quiero explicar qu\u00e9 debe ir en un constructor de complementos de WordPress, por qu\u00e9 debe ir en un constructor y c\u00f3mo se puede manejar esto cuando se trabaja en sus complementos.<\/p>\n<h2>Constructores de complementos de WordPress<\/h2>\n<p>Desde el principio, creo que los constructores deber\u00edan usarse para una cosa:<\/p>\n<ul>\n<li>Inicializar el estado de un objeto.<\/li>\n<\/ul>\n<p>Lo que define el estado inicial de un objeto puede depender de si se crea &quot;desde cero&quot; o si se carga con informaci\u00f3n de un conjunto anterior (como una sesi\u00f3n que se serializa). La forma en que lo veo:<\/p>\n<ul>\n<li>los atributos son sustantivos que describen un objeto,<\/li>\n<li>Las funciones son verbos que describen lo que el objeto puede hacer.<\/li>\n<\/ul>\n<p>Las funciones, por supuesto, hacen el trabajo que el objeto es capaz de hacer. Pueden modificar el estado del objeto cuando se les llama, o pueden trabajar con los argumentos pasados \u200b\u200ba las funciones.<\/p>\n<h3>\u00bfQu\u00e9 debe ir en un constructor?<\/h3>\n<p>Cuando se construye un objeto, simplemente debe configurarse de tal manera que sus atributos est\u00e9n configurados y sus funciones est\u00e9n listas para funcionar.<\/p>\n<p>Si hay algo en el constructor que no afecta el estado inicial de un objeto, no deber\u00eda estar all\u00ed.<\/p>\n<h3>\u00bfPor qu\u00e9 los atributos deben estar en un constructor?<\/h3>\n<p>Quiz\u00e1s una mejor manera de hacer esta pregunta es:<\/p>\n<p>\u00bfPor qu\u00e9 no deber\u00edan definirse los ganchos en el constructor?<\/p>\n<p>El sistema de ganchos de WordPress es parte del <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">patr\u00f3n de dise\u00f1o basado en eventos<\/a> (del cual soy fan\u00e1tico), pero registrar ganchos no describe el estado del objeto. En cambio, en el nivel m\u00e1s fundamental, es algo que crea una relaci\u00f3n con el objeto y WordPress.<\/p>\n<p>No es necesario que el estado inicial del objeto conozca WordPress, que ninguna de sus funciones est\u00e9 configurada para combinarse con WordPress o que necesite realizar alg\u00fan procesamiento con WordPress.<\/p>\n<p>Recuerde, los atributos se inicializan en un constructor. WordPress no es un atributo. es una dependencia Crear una dependencia es realizar una acci\u00f3n que es la definici\u00f3n de un verbo.<\/p>\n<p>Por lo tanto, todos los registros de ganchos deben realizarse en una funci\u00f3n.<\/p>\n<h3>\u00bfC\u00f3mo podemos manejar el registro de anzuelos?<\/h3>\n<p>Este es uno de esos temas que pueden ser una publicaci\u00f3n o una serie de publicaciones propias.<\/p>\n<ul>\n<li>Es posible crear una clase que mantenga un registro de objetos y los ganchos con WordPress.<\/li>\n<li>Tambi\u00e9n es posible definir el registro de ganchos dentro de una funci\u00f3n en la clase.<\/li>\n<li>Tambi\u00e9n podemos hacer varias cosas con <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la inversi\u00f3n de dependencia<\/a>.<\/li>\n<\/ul>\n<p>Todo lo anterior son cosas que est\u00e1n m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n, pero en aras de la simplicidad, mostrar\u00e9 un ejemplo de c\u00f3mo una clase puede registrar sus funciones con WordPress <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en una funci\u00f3n de inicio<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>De esta manera, podemos instanciar el objeto, probarlo, usarlo, etc., pero no tenemos que lidiar con nada relacionado con WordPress sin llamar expl\u00edcitamente a la\u00a0 funci\u00f3n <strong>init<\/strong>.<\/p>\n<p>Una vez que se llama, se crea la dependencia, se necesita WordPress y las cosas se complican m\u00e1s.<\/p>\n<h2>Ah, y esa cosa de prueba<\/h2>\n<p>Quiero mencionar un punto m\u00e1s que est\u00e1 un poco m\u00e1s all\u00e1 del alcance y el objetivo de esta publicaci\u00f3n, pero que sigue siendo relevante: cuando se trata de probar una clase, deber\u00edamos poder:<\/p>\n<ol>\n<li>crear una instancia de la clase,<\/li>\n<li>probando su l\u00f3gica llamando a funciones,<\/li>\n<li>pas\u00e1ndole par\u00e1metros y evaluando sus valores de retorno.<\/li>\n<\/ol>\n<p>Y deber\u00edamos poder hacer tanto de esto como sea posible de forma aislada. Si se definen ganchos en el constructor, se crea una dependencia inmediata de WordPress que no deber\u00eda ser necesaria.<\/p>\n<p>WordPress no describe el estado de un objeto. Es una dependencia del objeto.<\/p>\n<p>De todos modos, el punto que estoy tratando de hacer es que los constructores de complementos de WordPress no deben manejar el registro de ganchos porque los ganchos no describen su estado. Est\u00e1n relacionados con algo que hace la clase y nos impiden poder probar un objeto de forma aislada.<\/p>\n<p>Entonces tienen su lugar, pero no est\u00e1 en el constructor.<\/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>Los constructores de complementos de WordPress no deben manejar el registro de ganchos porque los ganchos no describen su estado.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,810,716,800,840,861],"tags":[1172],"class_list":["post-229001","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229001","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=229001"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229001\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229001"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}