Widget WordPress: refactoring, parte 13
Siamo finalmente al post finale della serie sul refactoring di WordPress Widget Boilerplate. Entro la fine di questo post, avremo completato il ramo di sviluppo del nostro codice e saremo pronti per unire tutto nel ramo principale.
C’è però ancora un po’ di lavoro da fare. Vale a dire :
L’ultima cosa che esamineremo dopo questo è il rafforzamento di parte della logica condizionale insieme a una parola sulla memorizzazione nella cache dei dati (dal momento che ne stiamo già facendo un po’ nei post precedenti).
Quindi queste sono le due cose che vedremo in questo post. In particolare, esamineremo la gestione della logica condizionale per il front-end e quindi come implementare la memorizzazione nella cache di base.
The WordPress Widget Boilerplate: Refactoring Parte 13
Prima di entrare nel round finale di dettagli, voglio assicurarmi di eseguire l’ultima versione del codice poiché questa è l’unica volta in cui credo sia indispensabile avere il codice pronto per l’ultimo round di modifiche.
Quindi, se non hai il codice in esecuzione sulla tua macchina, ora è il momento. L’ultimo bit di codice su cui dobbiamo lavorare è piuttosto piccolo.
Ma è importante assicurarsi di eseguire l’ultima versione. Quindi, una volta che hai eseguito un pull del codice più recente, siamo pronti per concludere.
1 Rendering del front-end
Ricordiamo nel post precedente, abbiamo reso le informazioni generali sui widget – il titolo, il contenuto e se il titolo dovesse essere visualizzato o meno – semplicemente visualizzando i valori sul front-end.
Ma ora è il momento di impostare le informazioni per assicurarci che non solo renderemo le informazioni in base alle opzioni nell’area di amministrazione del widget, ma anche se ci sono informazioni.
Quindi inizieremo con l’opzione più semplice: l’opzione che ci consente di alternare se il titolo viene visualizzato. In altre parole, assumeremo se i valori sono popolati e tale opzione è selezionata nel back-end.
Ricordiamo, il file Widget.php attualmente è simile a questo :
<?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']; ?>-->
Quindi prima faremo il refactoring di questa parte. Certo, è una cosa relativamente facile da introdurre, giusto? Cioè, la logica va così:
- Se l’opzione per la visualizzazione del titolo è selezionata, mostriamo il titolo; altrimenti, non lo facciamo.
Questo può essere affrontato con una semplice istruzione if valutando il valore dell’opzione display-title che abbiamo. A causa del modo in cui abbiamo costruito la funzione in questa serie, se l’opzione è selezionata, allora ha l’opzione on ; altrimenti è vuoto.
Ciò significa che possiamo impostare un condizionale come questo nello stesso codice che abbiamo condiviso sopra :
<?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']; ?>-->
In questo modo, se l’opzione è selezionata, verrà visualizzato il titolo.
Un corollario a questo
Una cosa che penso valga la pena ricordare è che ci sono momenti in cui le persone possono attivare i widget ma scegliere di non avere contenuti. Certo, puoi obiettare che se lo fanno, allora è colpa loro.
C’è del vero.
Ma penso anche che prendersi cura degli utenti che potrebbero capire le cose o che potrebbero aver fatto accidentalmente qualcosa che non sapevano possa aiutarli. Forse ci rende sviluppatori responsabili (o forse ci rende più aggressivi – fai la tua scelta, io sono con il primo).
Quindi, in questo caso, penso che valga la pena assicurarsi che il titolo e il contenuto non siano vuoti. Se lo sono, non eseguire il rendering di nulla.
Il codice quindi si presenta così :
<?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']; ?>-->
E questo concluderà per quanto riguarda il front-end. Ma che dire della memorizzazione nella cache di cui abbiamo parlato in un post precedente?
2 Introduzione alla memorizzazione nella cache
La memorizzazione nella cache, per un widget come questo, è qualcosa che considero facoltativa, ma poiché abbiamo integrato la funzionalità di base in Boilerplate per svuotare la cache, segue logicamente l’introduzione della funzionalità per la memorizzazione nella cache dei dati, giusto?
Quindi facciamolo. Non dovrebbe essere nemmeno difficile. In realtà, stiamo semplicemente prendendo il titolo, il contenuto e la casella di controllo e memorizzando nella cache i valori per l’istanza data del widget.
Per fare ciò, dobbiamo individuare la funzione widget e quindi eseguire le seguenti operazioni:
Innanzitutto, introdurremo una funzione per memorizzare nella cache il 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');
}
Quindi introdurremo una funzione per recuperare la versione memorizzata nella cache 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 [];
}
Quindi rivisitiamo la funzione originale per assicurarci di visualizzare ciò che è necessario. Se la cache è vuota, non facciamo altro che visualizzare i valori così come sono.
<?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);
}
E questo conclude la funzionalità per Widget Boilerplate completamente rifattorizzato.
La fine
Questo particolare grave è stato lungo. Personalmente, è stato davvero bello rivisitare il WordPress Widget Boilerplate e portarlo a standard più moderni.
Ci sono ancora alcune cose che devo fare come aggiornare il file README e quindi fornire alcune istruzioni in più prima di unirlo al ramo principale, ma se hai seguito l’intera serie, probabilmente sei a bordo con tutto. Inoltre, apprezzo il tempo che ci hai dedicato e spero che sia stato utile per te su alcuni livelli.
Detto questo, cercherò di passare a contenuti premium in forma più breve poiché questa serie e l’ultima erano piuttosto lunghe. Come al solito, puoi sempre contattarmi o offrire richieste pull secondo necessità: è open source e accoglie anche miglioramenti.
Per ora, però, questo avvolge questa serie.