WordPress-Widgets: Refactoring, Teil 13
Wir sind endlich beim letzten Beitrag der Serie über das Refactoring des WordPress Widget Boilerplate. Am Ende dieses Beitrags haben wir den Entwicklungszweig unseres Codes fertig und sind bereit, alles in den Master-Zweig zusammenzuführen.
Es bleibt aber noch ein bisschen zu tun. Nämlich :
Das letzte, was wir uns danach ansehen werden, ist die Verschärfung der bedingten Logik zusammen mit einem Wort zum Zwischenspeichern von Daten (da wir uns bereits in früheren Posts ein wenig damit beschäftigt haben).
Das sind also die beiden Dinge, die wir uns in diesem Beitrag ansehen werden. Insbesondere werden wir uns mit dem Umgang mit bedingter Logik für das Front-End befassen und dann, wie grundlegendes Caching implementiert wird.
Das WordPress-Widget Boilerplate: Refactoring Teil 13
Bevor wir in die letzte Runde der Details kommen, möchte ich sicherstellen, dass Sie die neueste Version des Codes ausführen, da dies das einzige Mal ist, in dem ich glaube, dass es unerlässlich ist, den Code für die letzte Runde der Änderungen bereit zu haben.
Wenn Sie also den Code nicht auf Ihrem Computer ausführen, ist es jetzt an der Zeit. Das letzte Stück Code, an dem wir arbeiten müssen, ist ziemlich klein.
Es ist jedoch wichtig sicherzustellen, dass Sie die neueste Version verwenden. Sobald Sie also den neuesten Code abgerufen haben, sind wir bereit, dies abzuschließen.
1 Rendern des Frontends
Erinnern Sie sich, dass wir im vorherigen Beitrag allgemeine Widget-Informationen – den Titel, den Inhalt und ob der Titel angezeigt werden soll oder nicht – gerendert haben, indem wir einfach die Werte im Frontend angezeigt haben.
Aber jetzt ist es an der Zeit, Informationen einzurichten, um sicherzustellen, dass wir Informationen nicht nur basierend auf den Optionen im Verwaltungsbereich des Widgets rendern, sondern auch, ob überhaupt Informationen vorhanden sind.
Wir beginnen also mit der einfachsten Option: Die Option, mit der wir umschalten können, ob der Titel angezeigt wird. Mit anderen Worten, wir gehen davon aus, dass die Werte ausgefüllt sind und diese Option im Backend aktiviert ist.
Erinnern Sie sich, die Widget.php -Datei sieht derzeit so aus :
<?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']; ?>-->
Also werden wir diesen Teil zuerst umgestalten. Natürlich ist es relativ einfach, es einzuführen, oder? Das heißt, die Logik geht so:
- Wenn die Option zum Anzeigen des Titels aktiviert ist, zeigen wir den Titel an; ansonsten nicht.
Dies kann mit einer einfachen if – Anweisung angegangen werden, indem der Wert der Option display-title ausgewertet wird, die wir haben. Aufgrund der Art und Weise, wie wir die Funktion in dieser Serie aufgebaut haben, hat sie, wenn die Option aktiviert ist, die Option on ; andernfalls ist es leer.
Das bedeutet, dass wir eine Bedingung wie diese in genau demselben Code einrichten können, den wir oben geteilt haben :
<?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']; ?>-->
Auf diese Weise wird bei aktivierter Option der Titel angezeigt.
Eine Folge davon
Eine Sache, die ich erwähnenswert finde, ist, dass es Zeiten gibt, in denen Leute Widgets aktivieren können, sich aber dafür entscheiden, keinen Inhalt zu haben. Sicher, man kann argumentieren, dass es ihre Schuld ist, wenn sie das tun.
Daran ist Wahres dran.
Aber ich denke auch, dass es ihnen helfen kann, sich um Benutzer zu kümmern, die vielleicht Dinge herausfinden oder versehentlich etwas getan haben, von dem sie nicht wussten, dass sie es tun können. Vielleicht macht es uns zu verantwortungsbewussten Entwicklern (oder vielleicht macht es uns aggressiver – treffen Sie Ihre Wahl, ich gehöre zu ersterem).
In diesem Fall denke ich, dass es sich lohnt, darauf zu achten, dass der Titel und der Inhalt nicht leer sind. Wenn dies der Fall ist, rendern Sie nichts.
Der Code sieht dann so aus :
<?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']; ?>-->
Und damit ist das Frontend abgeschlossen. Aber was ist mit dem Caching, über das wir in einem früheren Beitrag gesprochen haben?
2 Einführung in das Caching
Caching ist für ein Widget wie dieses etwas, das ich als optional betrachte, aber da wir die grundlegende Funktionalität zum Leeren des Caches in die Boilerplate eingebaut haben, folgt es logischerweise, die Funktionalität zum Caching von Daten einzuführen, richtig?
Also lass uns das tun. Es sollte auch nicht schwer sein. In Wirklichkeit nehmen wir einfach den Titel, den Inhalt und das Kontrollkästchen und cachen die Werte für die gegebene Instanz des Widgets.
Dazu müssen wir die Widget- Funktion suchen und dann Folgendes tun:
Zuerst führen wir eine Funktion zum Zwischenspeichern des Widgets ein :
<?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');
}
Dann führen wir eine Funktion zum Abrufen der zwischengespeicherten Version des Widgets ein :
<?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 [];
}
Dann besuchen wir die ursprüngliche Funktion erneut, um sicherzustellen, dass wir das anzeigen, was benötigt wird. Wenn der Cache leer ist, dann tun wir nichts anderes, als die Werte so anzuzeigen, wie sie stehen.
<?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);
}
Und damit ist die Funktionalität für das vollständig umgestaltete Widget Boilerplate abgeschlossen.
Das Ende
Diese besondere ernste hat lange gedauert. Persönlich war es wirklich gut, das WordPress Widget Boilerplate noch einmal zu besuchen und es auf modernere Standards zu bringen.
Es gibt noch ein paar Dinge, die ich tun muss, wie z. B. die README-Datei aktualisieren und dann ein paar weitere Anweisungen geben, bevor ich sie in den Master- Zweig zusammenführe, aber wenn Sie diese gesamte Serie verfolgt haben, dann sind Sie wahrscheinlich an Bord Mit allem. Außerdem schätze ich Ihre Zeit, in der Sie sich daran gehalten haben, und ich hoffe, dass es für Sie auf einigen Ebenen von Vorteil war.
Nachdem dies gesagt wurde, werde ich versuchen, Premium-Inhalte in kürzerer Form zu erstellen, da diese und die letzte Serie ziemlich lang waren. Wie üblich können Sie mich jederzeit kontaktieren oder bei Bedarf Pull Requests anbieten – es ist Open Source und begrüßt auch Verbesserungen.
Vorerst schließt dies diese Serie jedoch ab.