WordPress-widgets: Refactoring, del 13
Vi är äntligen vid det sista inlägget i serien om omstrukturering av WordPress Widget Boilerplate. I slutet av det här inlägget kommer vi att ha utvecklingsgrenen av vår kod klar, och vi kommer att vara redo att slå samman allt i huvudgrenen.
Det återstår dock en del att göra. Nämligen :
Det sista vi kommer att titta på efter detta är att skärpa upp en del av den villkorliga logiken tillsammans med ett ord om cachning av data (eftersom vi redan gör lite av det i tidigare inlägg).
Så det är de två sakerna vi kommer att titta på i det här inlägget. Specifikt kommer vi att titta på hantering av villkorlig logik för front-end och sedan hur man implementerar grundläggande cachelagring.
WordPress Widget Boilerplate: Refactoring del 13
Innan vi går in i den sista omgången med detaljer vill jag försäkra mig om att du kör den senaste versionen av koden eftersom det här är en gång då jag tror att det är absolut nödvändigt att ha koden redo för den sista omgången av ändringar.
Så om du inte har koden körd på din maskin är det dags nu. Den sista biten kod som vi behöver arbeta med är ganska liten.
Men det är viktigt att se till att du kör den senaste versionen. Så när du har gjort en dragning av den senaste koden är vi redo att avsluta detta.
1 Rendering av front-end
Minns i det förra inlägget återgav vi allmän widgetinformation – titeln, innehållet och om titeln ska visas eller inte – genom att helt enkelt visa värdena i front-end.
Men nu är det dags att ställa in information för att säkerställa att vi inte bara kommer att rendera information baserat på alternativen i administrationsområdet för widgeten, utan även om det finns någon information alls.
Så vi börjar med det enklaste alternativet: Alternativet som låter oss växla om titeln visas. Med andra ord, vi kommer att anta om värdena är ifyllda och det alternativet är markerat i backend.
Kom ihåg att filen Widget.php för närvarande ser ut så här :
<?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']; ?>-->
Så vi ska först omstrukturera den här delen. Visst är det en relativt enkel sak att introducera, eller hur? Det vill säga, logiken ser ut så här:
- Om alternativet för att visa titeln är markerat visar vi titeln; annars gör vi inte det.
Detta kan lösas med ett enkelt if – uttalande genom att utvärdera värdet av alternativet för visningstitel vi har. På grund av hur vi har byggt funktionen genom hela den här serien, om alternativet är markerat har det alternativet på ; annars är det tomt.
Det betyder att vi kan ställa in en villkorlig sådan här i samma kod som vi har delat ovan :
<?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']; ?>-->
På detta sätt, om alternativet är markerat, kommer titeln att visas.
En följd av detta
En sak som jag tycker är värd att nämna är att det finns tillfällen då människor kan aktivera widgets men väljer att inte ha något innehåll. Visst, du kan argumentera att om de gör det så är det deras fel.
Det ligger sanning i det.
Men jag tror också att det kan hjälpa dem att ta hand om användare som kanske klurar på saker eller som av misstag har gjort något som de inte visste. Kanske gör det oss ansvarsfulla utvecklare (eller kanske gör det oss mer aggressiva – välj själv, jag är med i den förra).
Så i det här fallet tycker jag att det är värt att se till att titeln och innehållet inte är tomma. Om de är det, rendera inte något.
Koden ser då ut så här :
<?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']; ?>-->
Och det kommer att avsluta det här när det gäller front-end. Men hur är det med cachen som vi pratade om i ett tidigare inlägg?
2 Introduktion av cachelagring
Cachning, för en sådan här widget, är något som jag anser vara valfritt, men eftersom vi har byggt in den grundläggande funktionaliteten i Boilerplate för att spola cachen så följer det logiskt att introducera funktionaliteten för att cache data, eller hur?
Så låt oss göra det. Det borde inte vara svårt heller. I verkligheten tar vi helt enkelt titeln, innehållet och kryssrutan och cachelagrar värdena för den givna instansen av widgeten.
För att göra detta måste vi hitta widgetfunktionen och sedan göra följande:
Först introducerar vi en funktion för att cachelagra widgeten :
<?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');
}
Sedan introducerar vi en funktion för att hämta den cachade versionen av widgeten :
<?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 [];
}
Sedan går vi tillbaka till den ursprungliga funktionen för att se till att vi visar det som behövs. Om cachen är tom gör vi inget annat än att visa värdena som de står.
<?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);
}
Och det avslutar funktionaliteten för den helt omstrukturerade Widget Boilerplate.
Slutet
Det här allvarliga har varit länge. Personligen har det varit riktigt bra att återbesöka WordPress Widget Boilerplate och få upp den till modernare standarder.
Det finns fortfarande några saker jag behöver göra, som att uppdatera README-filen och sedan ge några fler instruktioner innan jag slår ihop den i mastergrenen, men om du har följt hela den här serien, är du troligen ombord med allt. Vidare, jag uppskattar din tid att hänga med det, och jag hoppas att det var till nytta för dig på vissa nivåer.
Med det sagt, jag kommer att se över att gå över till kortare premiuminnehåll eftersom den här serien och den senaste var ganska långa. Som vanligt kan du alltid kontakta mig eller erbjuda pull-förfrågningar vid behov – det är öppen källkod och välkomnar förbättringar också.
För nu avslutar detta dock den här serien.