Виджеты WordPress: рефакторинг, часть 13
Наконец-то мы подошли к последнему посту из серии статей о рефакторинге шаблона виджетов WordPress. К концу этого поста у нас будет готова ветка разработки нашего кода, и мы будем готовы объединить все в основную ветку.
Однако предстоит еще немного поработать. А именно :
Последнее, что мы собираемся рассмотреть после этого, — это ужесточение некоторой условной логики, а также несколько слов о кэшировании данных (поскольку мы уже делали это в предыдущих постах).
Итак, это две вещи, которые мы собираемся рассмотреть в этом посте. В частности, мы рассмотрим обработку условной логики для внешнего интерфейса, а затем рассмотрим, как реализовать базовое кэширование.
Шаблон виджета WordPress: рефакторинг, часть 13
Прежде чем мы перейдем к последнему раунду деталей, я хочу убедиться, что вы используете последнюю версию кода, поскольку это единственный раз, когда я считаю, что код должен быть готов к последнему раунду изменений.
Так что, если у вас нет кода, работающего на вашем компьютере, сейчас самое время. Последний кусок кода, над которым нам нужно поработать, довольно мал.
Но важно убедиться, что вы используете последнюю версию. Так что, как только вы загрузили последний код, мы готовы завершить его.
1 Рендеринг интерфейса
Напомним, в предыдущем посте мы визуализировали общую информацию о виджете — заголовок, содержимое и необходимость отображения заголовка — просто отображая значения во внешнем интерфейсе.
Но теперь пришло время настроить информацию, чтобы убедиться, что мы собираемся отображать информацию не только на основе параметров в области администрирования виджета, но и при наличии какой-либо информации вообще.
Итак, мы начнем с самого простого варианта: параметра, который позволяет нам переключаться, отображается ли заголовок. Другими словами, мы собираемся предположить, заполнены ли значения, и этот параметр проверен в бэкэнде.
Напомним, сейчас файл Widget.php выглядит так :
<?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']; ?>-->
Итак, сначала мы собираемся провести рефакторинг этой части. Конечно, это относительно легко представить, верно? То есть логика такая:
- Если опция отображения заголовка отмечена, то мы показываем заголовок; в противном случае мы не делаем.
Это можно решить с помощью простого оператора if, оценив значение имеющейся у нас опции display-title . Из-за того, как мы построили функцию на протяжении всей этой серии, если опция отмечена, то она имеет опцию on ; в противном случае он пуст.
Это означает, что мы можем настроить подобное условное выражение в том же самом коде, которым мы поделились выше :
<?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']; ?>-->
Таким образом, если опция отмечена, заголовок будет отображаться.
Следствие этого
Одна вещь, которую, я думаю, стоит упомянуть, это то, что бывают случаи, когда люди могут активировать виджеты, но предпочитают не иметь контента. Конечно, вы можете возразить, что если они так делают, то это их вина.
В этом есть правда.
Но я также думаю, что забота о пользователях, которые могут что-то выяснить или случайно сделать что-то, чего они не знали, может им помочь. Возможно, это делает нас ответственными разработчиками (или, возможно, делает нас более агрессивными — выбирайте сами, я за первое).
Так что в этом случае, я думаю, стоит убедиться, что заголовок и содержание не пусты. Если они есть, то ничего не визуализируйте.
Тогда код выглядит так :
<?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']; ?>-->
И это завершит это, насколько это касается внешнего интерфейса. Но как насчет кэширования, о котором мы говорили в предыдущем посте?
2 Знакомство с кэшированием
Кэширование для такого виджета я считаю необязательным, но поскольку мы встроили базовую функциональность в Boilerplate для очистки кеша, то логически следует ввести функциональность для кэширования данных, верно?
Итак, давайте сделаем это. Тоже не должно быть тяжело. На самом деле мы просто берем заголовок, содержимое и флажок и кэшируем значения для данного экземпляра виджета.
Для этого нам нужно найти функцию виджета, а затем сделать следующее:
Во- первых, мы введем функцию для кэширования виджета :
<?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');
}
Затем мы представим функцию для получения кэшированной версии виджета :
<?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 [];
}
Затем мы снова обращаемся к исходной функции, чтобы убедиться, что отображаем то, что нужно. Если кеш пуст, мы ничего не делаем, кроме как отображаем значения в том виде, в каком они есть.
<?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);
}
И это завершает функциональность полностью переработанного Widget Boilerplate.
Конец
Этот особый серьезный был давно. Лично мне было очень приятно вернуться к WordPress Widget Boilerplate и привести его в соответствие с более современными стандартами.
Есть еще несколько вещей, которые мне нужно сделать, например, обновить файл README, а затем предоставить еще несколько инструкций, прежде чем я объединю его с основной веткой, но если вы следили за всей этой серией, то вы, вероятно, на борту со всем. Кроме того, я ценю ваше время, проведенное с ним, и надеюсь, что это было полезно для вас на некоторых уровнях.
С учетом сказанного, я постараюсь перейти на премиальный контент более короткой формы, поскольку эта и предыдущая серии были довольно длинными. Как обычно, вы всегда можете связаться со мной или предложить пулл-реквесты по мере необходимости — это открытый исходный код, и он также приветствует улучшения.
На данный момент, однако, это оборачивает эту серию.