{"id":230925,"date":"2022-12-17T09:29:00","date_gmt":"2022-12-17T06:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230925"},"modified":"2022-12-07T11:44:00","modified_gmt":"2022-12-07T08:44:00","slug":"widgets-de-wordpress-refactorizacion-parte-5","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-refactorizacion-parte-5\/","title":{"rendered":"Widgets de WordPress: Refactorizaci\u00f3n, Parte 5"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">En la publicaci\u00f3n anterior<\/a><\/strong>, creamos un Registro que se usar\u00e1 para almacenar todas las diversas clases responsables de darle su funcionalidad a nuestro widget.<\/p>\n<p>Para hacer esto, se presentar\u00e1n una variedad de otras clases, pero antes de ir all\u00ed, debemos agregar el Registro al programa de arranque del complemento (y mucho menos crear un programa de arranque para el complemento).<\/p>\n<p>Espec\u00edficamente, aqu\u00ed es donde lo dejamos:<\/p>\n<blockquote>\n<p>Como se mencion\u00f3 anteriormente en la publicaci\u00f3n, debemos agregar esto al arranque del complemento. Sin embargo, para hacer esto, necesitamos definir nuestro propio filtro para que podamos pasar f\u00e1cilmente el registro por el resto del complemento (cuando llegue el momento de hacerlo).<\/p>\n<\/blockquote>\n<p>Entonces, en esta publicaci\u00f3n, nos enfocaremos en hacer exactamente eso.<\/p>\n<h2>El modelo de widget de WordPress: refactorizaci\u00f3n, parte 5<\/h2>\n<p>Si ha estado siguiendo la serie hasta este punto, entonces deber\u00eda estar en una buena posici\u00f3n espec\u00edficamente para agregar el Registro para que tengamos acceso a \u00e9l a trav\u00e9s del complemento.<\/p>\n<p>Sin embargo, para hacer esto, se supone que sabe c\u00f3mo definir sus filtros. En WordPress, <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usamos acciones y filtros todo el tiempo<\/a>.<\/p>\n<p>Sin embargo, lo que pasa con estos ganchos es que ya est\u00e1n definidos. Entonces, \u00bfc\u00f3mo definimos nuestro filtro?<\/p>\n<p>Echemos un vistazo a hacer exactamente eso.<\/p>\n<h3>1 Definici\u00f3n de nuestro filtro<\/h3>\n<p>Primero, necesitamos entender algunos conceptos:<\/p>\n<ul>\n<li>que es un filtro<\/li>\n<li>como agregar un filtro,<\/li>\n<li>como introducir nuestro registro en el filtro<\/li>\n<li>c\u00f3mo recuperar la clase del filtro.<\/li>\n<\/ul>\n<p>Afortunadamente, todo lo anterior es f\u00e1cil de explicar.<\/p>\n<h4>\u00bfQu\u00e9 es un filtro?<\/h4>\n<p>En pocas palabras, los ganchos nos permiten llamar a WordPress en momentos espec\u00edficos durante la ejecuci\u00f3n del programa. Las acciones generalmente se reservan para el comportamiento; Los filtros est\u00e1n reservados para los datos.<\/p>\n<p>Adem\u00e1s, los filtros nos permiten trabajar con datos espec\u00edficos en la aplicaci\u00f3n, pueden ser datos preexistentes o incluso datos nuevos. Y en nuestro caso, ser\u00e1 la clase Registry la que contenga referencias a otros datos.<\/p>\n<h4>Agregar un filtro<\/h4>\n<p>Agregar un filtro es f\u00e1cil. Tiene tres partes:<\/p>\n<ol>\n<li>llamando a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">agregar_filtro<\/a> ,<\/li>\n<li>definir un identificador \u00fanico para el filtro,<\/li>\n<li>pasando informaci\u00f3n al filtro que se puede devolver cada vez que se llama.<\/li>\n<\/ol>\n<p>Para nosotros, identificar\u00e9 nuestro registro como el filtro <strong>wpWidgetRegistry<\/strong>. Tenga en cuenta, sin embargo, que es importante que elija un nombre \u00fanico para su implementaci\u00f3n porque si no lo hace, podr\u00eda terminar con colisiones con otros datos si otro complemento usa el mismo identificado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc432bb7.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-161108-61e71bc432bb7.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 5\" ><\/a><\/p>\n<p>De todos modos, agregar un filtro realiza una tarea simple:<\/p>\n<blockquote>\n<p>Enganche una funci\u00f3n o m\u00e9todo a una acci\u00f3n de filtro espec\u00edfica.<\/p>\n<\/blockquote>\n<p>Entonces esto significa que necesitamos definir un m\u00e9todo con nuestra ID. Debido a la naturaleza de PHP, no necesitamos usar una funci\u00f3n separada.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161108-61e71bc81c90d.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-161108-61e71bc81c90d.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 5\" ><\/a><\/p>\n<p>En su lugar, podemos usar <a href=\"https:\/\/secure.php.net\/manual\/en\/functions.anonymous.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una funci\u00f3n an\u00f3nima<\/a>.<\/p>\n<blockquote>\n<p>Las funciones an\u00f3nimas, tambi\u00e9n conocidas como cierres, permiten la creaci\u00f3n de funciones que no tienen un nombre espec\u00edfico. Son m\u00e1s \u00fatiles como el valor de los par\u00e1metros de devoluci\u00f3n de llamada, pero tienen muchos otros usos.<\/p>\n<\/blockquote>\n<p>La funci\u00f3n an\u00f3nima que vamos a definir aceptar\u00e1 una referencia al complemento como argumento y luego la devolver\u00e1 cada vez que se llame al filtro (que se mostrar\u00e1 m\u00e1s adelante en este art\u00edculo).<\/p>\n<h4>Pasar informaci\u00f3n a nuestro filtro<\/h4>\n<p>Ahora que tenemos todo eso cubierto, podemos pasar por el proceso de crear una instancia de nuestro Registro, definir un filtro y luego agregar el registro, para que sea accesible en toda la aplicaci\u00f3n.<\/p>\n<p>Entonces, dentro del archivo del complemento principal, que es el archivo <strong>wordpress-widget-boilerplate.php<\/strong>, agregamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-00-bootstrap-namespace-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">las siguientes l\u00edneas de c\u00f3digo<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/\/ More to come...\n<\/code><\/pre>\n<p>Lo anterior declara el espacio de nombres en el que reside el Registro. Luego <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-01-bootstrap-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">agregamos el siguiente bloque de c\u00f3digo debajo del cargador autom\u00e1tico:<\/a><\/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('wpWidgetRegistry', function() use ($registry) {\n    return $registry;\n});\n<\/code><\/pre>\n<p>Tenga en cuenta que cuando intenta activar el complemento, no se activar\u00e1 y arrojar\u00e1 un error. Esto se debe a la falta de un cargador autom\u00e1tico que se discutir\u00e1 en la pr\u00f3xima publicaci\u00f3n.<\/p>\n<h3>2 Recuperando Nuestro Registro<\/h3>\n<p>Dado que el registro se define en el arranque del complemento y se realiza mediante el uso de un filtro, podemos acceder al registro en cualquier lugar de nuestro complemento llamando a nuestro filtro personalizado.<\/p>\n<p>Por ejemplo, digamos que estamos en otra clase y necesitamos obtener una referencia al registro. Para ello, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c3617efbbfd2a47c432f69dd41ce312c#file-02-retrieve-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">podemos hacer esta llamada<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Retrieve the registry anywhere in the plugin.\n$registry = apply_filters('wpWidgetRegistry', null);\n<\/code><\/pre>\n<p>Y eso es. F\u00e1cil, \u00bfverdad? Siempre que todo se haya agregado correctamente al registro, que se cubrir\u00e1 pronto, podremos acceder a todos ellos a trav\u00e9s de los identificadores \u00fanicos que usamos en <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la publicaci\u00f3n anterior.<\/a><\/p>\n<h2>El cargador autom\u00e1tico<\/h2>\n<p>Ahora estamos comenzando a usar espacios de nombres y usar otras clases. Esto significa que vamos a necesitar usar cargadores autom\u00e1ticos.<\/p>\n<p>Entonces, antes de refactorizar toda la clase tal como est\u00e1 ahora, vamos a desviarnos un poco hacia algunas de las caracter\u00edsticas de Composer para ver c\u00f3mo se usa para generar un cargador autom\u00e1tico (adem\u00e1s de las cosas que ya estamos us\u00e1ndolo para manejar la calidad de nuestro c\u00f3digo fuente).<\/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>Una vez que tenemos un Registro, debemos poder acceder a \u00e9l a trav\u00e9s de nuestro complemento y lo hacemos con enlaces personalizados.<\/p>\n","protected":false},"author":1,"featured_media":236152,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,800,861],"tags":[1172],"class_list":["post-230925","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230925","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=230925"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230925\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236152"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230925"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230925"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}