Віджети 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 і привести його до більш сучасних стандартів.
Є ще кілька речей, які мені потрібно зробити, як-от оновити файл README, а потім надати ще кілька інструкцій, перш ніж я об’єднаю його в основну гілку, але якщо ви стежите за всією цією серією, то, ймовірно, ви погодитесь з усім. Крім того, я ціную час, який ви витратили на це, і сподіваюся, що це було для вас корисним на певному рівні.
Зважаючи на це, я буду прагнути перейти до коротшої форми преміум-контенту, оскільки ця та остання серії були досить довгими. Як завжди, ви завжди можете зв’язатися зі мною або за потреби запропонувати запити на отримання – це відкритий код, і він також вітає вдосконалення.
Наразі ця серія завершується.