{"id":231055,"date":"2022-12-20T18:28:00","date_gmt":"2022-12-20T15:28:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231055"},"modified":"2022-12-07T10:15:35","modified_gmt":"2022-12-07T07:15:35","slug":"widgets-de-wordpress-refactorizacion-parte-12","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/widgets-de-wordpress-refactorizacion-parte-12\/","title":{"rendered":"Widgets de WordPress: Refactorizaci\u00f3n, Parte 12"},"content":{"rendered":"\n<p>En lo que respecta a la refactorizaci\u00f3n de WordPress Widget Boilerplate, especialmente dado lo lejos que hemos llegado desde que comenz\u00f3 el proyecto hace ocho a\u00f1os, hemos trabajado mucho.<\/p>\n<p>Lo hemos llevado a un est\u00e1ndar mucho m\u00e1s moderno y estamos haciendo que sea mucho m\u00e1s f\u00e1cil trabajar con \u00e9l, de modo que la creaci\u00f3n de widgets futuros deber\u00eda ser m\u00e1s f\u00e1cil. Y esto no es solo desde el est\u00e1ndar del repetitivo sino desde un est\u00e1ndar orientado a objetos para que el mantenimiento y la calidad del c\u00f3digo sea mayor.<\/p>\n<p>En la \u00faltima publicaci\u00f3n, terminamos gran parte del trabajo para el \u00e1rea de administraci\u00f3n y estamos listos para comenzar nuestro trabajo en el c\u00f3digo para el front-end.<\/p>\n<p>Dijimos:<\/p>\n<blockquote>\n<p>A continuaci\u00f3n, veremos la representaci\u00f3n de contenido en el front-end. Nos acercamos al final de la refactorizaci\u00f3n de Boilerplate, pero queda un poco m\u00e1s por hacer antes de que estemos listos para fusionarlo en la rama maestra de la base de c\u00f3digo.<\/p>\n<\/blockquote>\n<p>Entonces, en esta publicaci\u00f3n, vamos a continuar all\u00ed. Ahora, si ha estado siguiendo hasta este punto, deber\u00eda tener todo lo que necesita de la rama de desarrollo.<\/p>\n<p>De lo contrario, aseg\u00farese de tirar de \u00e9l, ya que es donde vamos a continuar en el resto de la publicaci\u00f3n.<\/p>\n<h2>El modelo de widget de WordPress: Refactorizaci\u00f3n Parte 12<\/h2>\n<p>Ahora, cuando se trata del front-end, es f\u00e1cil pensar en el front-end como algo que el usuario ve frente a \u00e9l, independientemente de si est\u00e1 en el \u00e1rea administrativa o no.<\/p>\n<p>Sin embargo, esta serie ha dejado claro que estamos dividiendo lo que el usuario ve entre el \u00e1rea administrativa y el \u00e1rea p\u00fablica del sitio.<\/p>\n<p>Entonces, lo que vamos a hacer es trabajar en el \u00e1rea del c\u00f3digo que brinda informaci\u00f3n para el usuario en el \u00e1rea p\u00fablica del sitio. Vamos a empezar simplemente leyendo la informaci\u00f3n y mostr\u00e1ndola.<\/p>\n<p>Luego, en la pr\u00f3xima publicaci\u00f3n, veremos c\u00f3mo trabajar con l\u00f3gica condicional con respecto a algunas de las opciones para ver si hay algo que debamos hacer.<\/p>\n<p>Dicho esto, pasemos al c\u00f3digo.<\/p>\n<h3>Sobre los datos que mostraremos<\/h3>\n<p>Recuerde, el widget, en este punto, tiene tres cosas que influyen en su visualizaci\u00f3n:<\/p>\n<ol>\n<li>el t\u00edtulo del widget,<\/li>\n<li>el contenido del widget,<\/li>\n<li>una alternancia en cuanto a si debemos o no mostrar el t\u00edtulo<\/li>\n<\/ol>\n<p>La tercera opci\u00f3n es principalmente para mostrar c\u00f3mo usar un tipo diferente de elemento. Porque, t\u00e9cnicamente, si no quisi\u00e9ramos mostrar el t\u00edtulo del widget, simplemente no pondr\u00edamos nada en el widget.<\/p>\n<p>Pero creo que ayuda mostrar el uso de diferentes tipos de elementos y sus valores de una manera pr\u00e1ctica (o semi-pr\u00e1ctica).<\/p>\n<p>De todos modos, dicho esto, sabemos que para cada instancia dada del widget, los datos se almacenan con el <strong>t\u00edtulo<\/strong> ,\u00a0 el <strong>contenido<\/strong> y\u00a0 el nombre <strong>del t\u00edtulo para mostrar<\/strong> y las ID proporcionadas por WordPress.<\/p>\n<p>Por lo tanto, los usaremos en nuestro c\u00f3digo frontal para mostrar los valores.<\/p>\n<h3>Preparaci\u00f3n de las funciones de visualizaci\u00f3n<\/h3>\n<p>Normalmente, la\u00a0 funci\u00f3n de <strong>widget<\/strong> es responsable de mostrar la salida del widget. Pero una de las cosas que hemos estado tratando de hacer es separar las preocupaciones de nuestro widget en un conjunto de clases y funciones m\u00e1s enfocado.<\/p>\n<p>Lo primero que queremos hacer es escribir una\u00a0 clase <strong>WidgetDisplay<\/strong> que se encargar\u00e1, como seguramente es evidente, de mostrar el contenido del widget.<\/p>\n<p>Por ahora, esto incluir\u00e1 incondicionalmente el t\u00edtulo, el contenido y el valor de incluir o no el t\u00edtulo. WordPress tambi\u00e9n pone a disposici\u00f3n cierto contenido, como el marcado, que debe aparecer antes y despu\u00e9s del widget, por lo que nos aseguraremos de incluirlo tambi\u00e9n.<\/p>\n<p>Pero primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-00-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apaguemos la clase<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace WordPressWidgetBoilerplateWordPress;\n\nclass WidgetDisplay\n{\n  private $widgetSlug;\n\n  public function __construct(string $widgetSlug)\n  {\n      $this-&gt;widgetSlug = $widgetSlug;\n  }\n\n  public function show($args, $instance)\n  {\n    \/\/ More to come\n  }\n}\n<\/code><\/pre>\n<p>Despu\u00e9s de eso, debemos asegurarnos de que tambi\u00e9n lo estamos escribiendo para las otras clases. Primero, nos aseguraremos de incluirlo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-01-widget-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en nuestra clase Widget<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function widget($args, $instance)\n{\n    return $this-&gt;widgetDisplay-&gt;show($args, $instance);\n}<\/code><\/pre>\n<p>Y luego lo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-02-widget-admin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">agregaremos a la clase WidgetAdmin<\/a> (ya que aqu\u00ed es donde residen las funciones principales de la API de Widget; simplemente delega la responsabilidad a la clase adecuada):<\/p>\n<pre><code>&lt;?php\n\npublic function __construct($widgetSlug)\n{\n    parent::__construct($widgetSlug);\n    $this-&gt;widgetSerializer = new WidgetSerializer($this-&gt;getWidgetSlug());\n    $this-&gt;widgetDisplay = new WidgetDisplay($this-&gt;getWidgetSlug());\n}<\/code><\/pre>\n<p>En este punto, no estamos mostrando nada todav\u00eda. Estamos cerca y nos centraremos en eso pronto.<\/p>\n<h3>Visualizaci\u00f3n de los datos<\/h3>\n<p>Suponiendo que pueda agregar el c\u00f3digo anterior sin errores, es hora de mostrar el contenido del widget.<\/p>\n<p>Podemos hacer esto de muchas maneras, desde un simple <strong>var_dump<\/strong> hasta trabajar para mostrar el contenido de una manera m\u00e1s f\u00e1cil de usar. Y yo soy mucho m\u00e1s fan de este \u00faltimo.<\/p>\n<p>As\u00ed que hagamos eso.<\/p>\n<p>En la\u00a0 funci\u00f3n <strong>show<\/strong> de su\u00a0 clase <strong>WidgetDisplay<\/strong>, agregue <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-04-widget-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el siguiente c\u00f3digo<\/a> :<\/p>\n<pre><code>&lt;?php\npublic function show($args, $instance)\n{\n    include_once 'Views\/Widget.php';\n}<\/code><\/pre>\n<p>Y luego la vista de la plantilla puede ser tan simple <a href=\"https:\/\/gist.github.com\/tommcfarlin\/caf46620cf110e5d55f4a302f1d5a471#file-03-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto<\/a> :<\/p>\n<pre><code>&lt;div id=\"&lt;?php echo $args['id']; ?&gt;\"&gt;\n    &lt;h3 class=\"widget-title\"&gt;&lt;?php echo $instance['title']; ?&gt;&lt;\/h3&gt;\n    &lt;p&gt;&lt;?php echo $instance['content']; ?&gt;&lt;\/p&gt;\n    &lt;pre&gt;&lt;?php echo $instance['display-title']; ?&gt;&lt;\/pre&gt;\n&lt;\/div&gt;&lt;!-- #&lt;?php echo $args['id']; ?&gt;--&gt;<\/code><\/pre>\n<p>Esto asegurar\u00e1 que el marcado adecuado para todo el contenido antes del widget, el contenido del widget y el contenido se represente correctamente.<\/p>\n<p>Una vez m\u00e1s, recuerde que estamos mostrando contenido que no estar\u00e1 en la versi\u00f3n final de esto, pero nos estamos acercando y lo abordaremos en la pr\u00f3xima publicaci\u00f3n.<\/p>\n<p>Recomendar\u00eda jugar con la\u00a0 opci\u00f3n <strong>Mostrar t\u00edtulo<\/strong> para ver c\u00f3mo se representa en el front-end dado el marcado que proporcionamos.<\/p>\n<p>Por ahora, la salida del widget deber\u00eda verse as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160763-61e7125f80aab.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-160763-61e7125f80aab.png\" alt=\"Widgets de WordPress: Refactorizaci\u00f3n, Parte 12\" ><\/a><\/p>\n<p>Pero eso es todo lo que hay que cubrir en esta publicaci\u00f3n.<\/p>\n<h2>Hacia el refactor final<\/h2>\n<p>Lo \u00faltimo que vamos a ver despu\u00e9s de esto es reforzar algo de la l\u00f3gica condicional junto con una palabra sobre el almacenamiento en cach\u00e9 de datos (ya que ya estamos haciendo un poco de eso en publicaciones anteriores).<\/p>\n<p>Sin embargo, por ahora, si\u00e9ntase libre de jugar con lo que tenemos aqu\u00ed junto con el c\u00f3digo que no hemos incluido (como lo que se puede mostrar antes o despu\u00e9s del widget).<\/p>\n<p>Se han dejado deliberadamente fuera de este ejemplo, pero es posible que no siempre se omitan seg\u00fan el trabajo que est\u00e9 haciendo.<\/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>Vamos a trabajar en el \u00e1rea del c\u00f3digo que brinda informaci\u00f3n para el usuario en el \u00e1rea p\u00fablica del sitio.<\/p>\n","protected":false},"author":1,"featured_media":234986,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[716,840,861],"tags":[1172],"class_list":["post-231055","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231055","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=231055"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231055\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/234986"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}