W końcu jesteśmy w ostatnim poście z serii o refaktoryzacji WordPress Widget Boilerplate. Pod koniec tego posta będziemy mieć skończoną gałąź deweloperską naszego kodu i będziemy gotowi do scalenia wszystkiego w gałąź master.
Jest jednak jeszcze trochę do zrobienia. Mianowicie :
Ostatnią rzeczą, na którą spojrzymy po tym, jest zaostrzenie niektórych logiki warunkowej wraz ze słowem o buforowaniu danych (ponieważ robiliśmy już trochę tego we wcześniejszych postach).
To są dwie rzeczy, którym będziemy się przyglądać w tym poście. W szczególności przyjrzymy się obsłudze logiki warunkowej dla frontonu, a następnie jak zaimplementować podstawowe buforowanie.
Szablon WordPress Widget: Refaktoryzacja, część 13
Zanim przejdziemy do ostatniej rundy szczegółów, chcę się upewnić, że korzystasz z najnowszej wersji kodu, ponieważ jest to jedyny raz, kiedy uważam, że konieczne jest przygotowanie kodu do ostatniej rundy zmian.
Więc jeśli nie masz kodu uruchomionego na swoim komputerze, nadszedł czas. Ostatni fragment kodu, nad którym musimy popracować, jest dość mały.
Ale ważne jest, aby upewnić się, że korzystasz z najnowszej wersji. Więc kiedy już zrobisz pobranie najnowszego kodu, jesteśmy gotowi, aby to zakończyć.
1 Renderowanie front-endu
Przypomnijmy w poprzednim poście, że wyrenderowaliśmy ogólne informacje o widżecie – tytuł, treść i czy tytuł powinien być wyświetlany – po prostu wyświetlając wartości na interfejsie użytkownika.
Ale teraz nadszedł czas, aby skonfigurować informacje, aby upewnić się, że nie tylko będziemy renderować informacje na podstawie opcji w obszarze administracyjnym widżetu, ale także czy w ogóle są jakieś informacje.
Zaczniemy więc od najprostszej opcji: opcji, która pozwala nam przełączać, czy tytuł jest wyświetlany. Innymi słowy, założymy, że wartości są wypełnione, a opcja jest zaznaczona w backendzie.
Przypomnijmy, plik Widget.php obecnie wygląda tak :
<?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']; ?>-->
Więc najpierw dokonamy refaktoryzacji tej części. Oczywiście jest to stosunkowo łatwe do wprowadzenia, prawda? Oznacza to, że logika wygląda tak:
- Jeśli zaznaczona jest opcja wyświetlania tytułu, pokazujemy tytuł; w przeciwnym razie nie.
Można się z tym uporać za pomocą prostej instrukcji if, oceniając wartość opcji display-title, którą mamy. Ze względu na sposób, w jaki zbudowaliśmy tę funkcję w tej serii, jeśli ta opcja jest zaznaczona, ma ona opcję on ; w przeciwnym razie jest pusty.
Oznacza to, że możemy ustawić taki warunek w tym samym kodzie, który udostępniliśmy powyżej :
<?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']; ?>-->
W ten sposób, jeśli opcja jest zaznaczona, tytuł zostanie wyświetlony.
Następstwem tego
Myślę, że warto wspomnieć o tym, że czasami ludzie mogą aktywować widżety, ale nie chcą mieć żadnych treści. Jasne, możesz argumentować, że jeśli to robią, to ich wina.
Jest w tym prawda.
Ale myślę też, że dbanie o użytkowników, którzy mogą coś rozgryźć lub którzy przypadkowo zrobili coś, o czym nie wiedzieli, że mogą im pomóc. Być może czyni nas to odpowiedzialnymi programistami (a może czyni nas bardziej agresywnymi – wybieraj, ja jestem z tym pierwszym).
Myślę więc, że w tym przypadku warto upewnić się, że tytuł i treść nie są puste. Jeśli tak, nie renderuj niczego.
Kod wygląda wtedy tak :
<?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']; ?>-->
I to będzie koniec, jeśli chodzi o front-end. Ale co z buforowaniem, o którym mówiliśmy we wcześniejszym poście?
2 Przedstawiamy buforowanie
Buforowanie, dla takiego widżetu, jest czymś, co uważam za opcjonalne, ale ponieważ wbudowaliśmy podstawową funkcjonalność w Boilerplate do opróżniania pamięci podręcznej, logicznie rzecz biorąc, należy wprowadzić funkcję buforowania danych, prawda?
Więc zróbmy to. To też nie powinno być trudne. W rzeczywistości po prostu bierzemy tytuł, treść i pole wyboru i buforujemy wartości dla danej instancji widżetu.
Aby to zrobić, musimy zlokalizować funkcję widżetu, a następnie wykonać następujące czynności:
Najpierw przedstawimy funkcję buforowania widżetu :
<?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');
}
Następnie wprowadzimy funkcję do pobierania wersji widżetu z pamięci podręcznej :
<?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 [];
}
Następnie wracamy do oryginalnej funkcji, aby upewnić się, że wyświetlamy to, co jest potrzebne. Jeśli pamięć podręczna jest pusta, nie robimy nic poza wyświetlaniem wartości bez zmian.
<?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);
}
I to kończy funkcjonalność całkowicie zrefaktoryzowanej płyty Widget Boilerplate.
Koniec
Ta poważna sprawa trwa już od dawna. Osobiście naprawdę dobrze było ponownie odwiedzić WordPress Widget Boilerplate i dostosować go do bardziej nowoczesnych standardów.
Jest jeszcze kilka rzeczy, które muszę zrobić, jak zaktualizować plik README, a następnie podać kilka dodatkowych instrukcji, zanim scalę go z gałęzią master, ale jeśli śledziłeś całą tę serię, prawdopodobnie jesteś na pokładzie ze wszystkim. Co więcej, doceniam Twój czas spędzony z tym i mam nadzieję, że na niektórych poziomach było to dla Ciebie korzystne.
Mając to na uwadze, będę chciał przejść do treści premium o krótszej formie, ponieważ ta i ostatnia seria były dość długie. Jak zwykle zawsze możesz się ze mną skontaktować lub w razie potrzeby zaoferować pull request – jest to oprogramowanie typu open source i mile widziane ulepszenia.
Na razie jednak to zamyka tę serię.