Widgets de WordPress: Refactorización, Parte 13
Finalmente estamos en la publicación final de la serie sobre la refactorización de WordPress Widget Boilerplate. Al final de esta publicación, habremos terminado la rama de desarrollo de nuestro código y estaremos listos para fusionar todo en la rama maestra.
Sin embargo, todavía queda un poco de trabajo por hacer. A saber :
Lo último que vamos a ver después de esto es reforzar algo de la lógica condicional junto con una palabra sobre el almacenamiento en caché de datos (ya que ya estamos haciendo un poco de eso en publicaciones anteriores).
Esas son las dos cosas que vamos a ver en esta publicación. Específicamente, veremos el manejo de la lógica condicional para el front-end y luego cómo implementar el almacenamiento en caché básico.
El modelo de widget de WordPress: Refactorización Parte 13
Antes de entrar en la ronda final de detalles, quiero asegurarme de que está ejecutando la última versión del código, ya que esta es la única vez en la que creo que es imperativo tener el código listo para la ronda final de cambios.
Entonces, si no tiene el código ejecutándose en su máquina, ahora es el momento. El último fragmento de código en el que tenemos que trabajar es bastante pequeño.
Pero es importante asegurarse de que está ejecutando la última versión. Entonces, una vez que haya extraído el código más reciente, estamos listos para terminar con esto.
1 Representación del front-end
Recuerde que en la publicación anterior, presentamos información general del widget (el título, el contenido y si el título debe mostrarse o no) simplemente mostrando los valores en el front-end.
Pero ahora es el momento de configurar la información para asegurarnos de que no solo vamos a presentar información en función de las opciones en el área de administración del widget, sino también si hay alguna información.
Entonces, comenzaremos con la opción más simple: la opción que nos permite alternar si se muestra el título. En otras palabras, vamos a asumir si los valores están poblados y esa opción está marcada en el backend.
Recuerde, el archivo Widget.php actualmente se ve así :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<div id="<?php echo $args['id']; ?>">
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<p><?php echo $instance['content']; ?></p>
<pre><?php echo $instance['display-title']; ?></pre>
</div><!-- #<?php echo $args['id']; ?>-->
Así que vamos a refactorizar esta parte, primero. Por supuesto, es algo relativamente fácil de introducir, ¿verdad? Es decir, la lógica es así:
- Si la opción para mostrar el título está marcada, mostramos el título; de lo contrario, no lo hacemos.
Esto se puede abordar con una declaración if simple evaluando el valor de la opción de título de visualización que tenemos. Debido a la forma en que hemos construido la función a lo largo de esta serie, si la opción está marcada, entonces tiene la opción de encendido ; de lo contrario, está vacío.
Esto significa que podemos configurar un condicional como este en el mismo código que hemos compartido anteriormente :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<div id="<?php echo $args['id']; ?>">
<?php if (isset($instance['display-title']) && 'on' === $instance['display-title']): ?>
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<?php endif; ?>
<p><?php echo $instance['content']; ?></p>
</div><!-- #<?php echo $args['id']; ?>-->
De esta forma, si la opción está marcada, se mostrará el título.
Un corolario de esto
Una cosa que creo que vale la pena mencionar es que hay ocasiones en las que las personas pueden activar widgets pero optar por no tener contenido. Claro, puedes argumentar que si hacen eso, entonces es su culpa.
Hay verdad en eso.
Pero también creo que cuidar a los usuarios que pueden estar averiguando cosas o que pueden haber hecho algo accidentalmente que no sabían puede ayudarlos. Tal vez nos haga desarrolladores responsables (o tal vez nos haga más agresivos, elige, estoy con el primero).
Entonces, en este caso, creo que vale la pena asegurarse de que el título y el contenido no estén vacíos. Si lo son, entonces no renderices nada.
El código entonces se ve así :
<?php
/*
* This file is part of WordPress Widget Boilerplate
* (c) Tom McFarlin <tom@tommcfarlin.com>
*
* This source file is subject to the GPL license that is bundled
* with this source code in the file LICENSE.
*/
?>
<?php if (empty($instance['title']) && empty($instance['content'])): return;
endif; ?>
<div id="<?php echo $args['id']; ?>">
<?php if (isset($instance['display-title']) && 'on' === $instance['display-title']): ?>
<h3 class="widget-title"><?php echo $instance['title']; ?></h3>
<?php endif; ?>
<p><?php echo $instance['content']; ?></p>
</div><!-- #<?php echo $args['id']; ?>-->
Y eso terminará con esto en lo que respecta al front-end. Pero, ¿qué pasa con el almacenamiento en caché del que hablamos en una publicación anterior?
2 Introducción al almacenamiento en caché
El almacenamiento en caché, para un widget como este, es algo que considero opcional, pero dado que hemos incorporado la funcionalidad básica en Boilerplate para vaciar el caché, lógicamente sigue para introducir la funcionalidad para almacenar datos en caché, ¿verdad?
Así que hagamos eso. Tampoco debería ser difícil. En realidad, simplemente estamos tomando el título, el contenido y la casilla de verificación y almacenando en caché los valores para la instancia dada del widget.
Para hacer esto, necesitamos ubicar la función del widget y luego hacer lo siguiente:
Primero, presentaremos una función para almacenar en caché el widget :
<?php
/**
* Caches the values for the instance of this widget.
*
* @param array $args argument provided by WordPress that may be useful in rendering the widget
* @param array $instance the values of the widget
*/
private function cacheWidget($args, $instance)
{
$cache = [];
$cache['widget_id'] = $args['widget_id'];
$cache['title'] = empty($instance['title'])? '': $instance['title'];
$cache['content'] = empty($instance['content'])? '': $instance['content'];
$instance['display-title'] = isset($instance['display-title'])? $instance['display-title']: '';
$cache['display-title'] = $instance['display-title'];
wp_cache_set($this->getWidgetSlug(), $cache, 'widget');
}
Luego, presentaremos una función para recuperar la versión en caché del widget :
<?php
/**
* @return array the cached instance of this widget if it's not empty
*/
private function getCachedWidget()
{
$cache = wp_cache_get($this->getWidgetSlug(), 'widget');
if (!empty($cache)) {
return $cache;
}
return [];
}
Luego revisamos la función original para asegurarnos de mostrar lo que se necesita. Si la memoria caché está vacía, no hacemos nada más que mostrar los valores tal como están.
<?php
/**
* Displays the widget based on the contents of the included template.
*
* @param array $args argument provided by WordPress that may be useful in rendering the widget
* @param array $instance the values of the widget
*/
public function widget($args, $instance)
{
// Get a cached version of the widget. If it's empty, cache what we have.
$cache = $this->getCachedWidget();
if (empty($cache)) {
$this->cacheWidget($args, $instance);
}
return $this->widgetDisplay->show($args, $instance);
}
Y eso concluye la funcionalidad para el rediseño completo de Widget Boilerplate.
El fin
Este serio en particular ha sido largo. Personalmente, ha sido realmente bueno volver a visitar el modelo estándar de widgets de WordPress y actualizarlo a estándares más modernos.
Todavía hay algunas cosas que debo hacer, como actualizar el archivo README y luego proporcionar algunas instrucciones más antes de fusionarlo con la rama maestra, pero si ha estado siguiendo toda esta serie, es probable que esté a bordo. con todo. Además, agradezco el tiempo dedicado a esto y espero que haya sido beneficioso para usted en algunos niveles.
Dicho esto, buscaré pasar a contenido premium de forma más corta ya que esta serie y la última fueron bastante largas. Como de costumbre, siempre puede ponerse en contacto conmigo u ofrecer solicitudes de extracción según sea necesario: es de código abierto y también admite mejoras.
Por ahora, sin embargo, esto envuelve esta serie.