Віджети WordPress: рефакторинг, частина 8
Що стосується рефакторингу WordPress Widget Boilerplate, ми виконали багато роботи, щоб привести базу коду до більш об’єктно-орієнтованого стандарту. Крім того, ми представили ряд інших інструментів, які дозволяють нам привести наш код до більш сучасних стандартів
Тепер, коли ми витратили час на це, настав час повернутися до коду та почати його рефакторинг таким чином, щоб дозволити використовувати абстрактні класи та підписників (які працюють як частина шаблону проектування, керованого подіями ).
В кінці попереднього посту я написав:
У наступних публікаціях ми розглянемо, як ми можемо реалізувати підписку на загальнодоступній стороні сайту (тобто там, де відображається вміст віджетів). І ми зробимо те ж саме для адміністративної частини сайту.
Тож у цій публікації ми збираємося зробити саме це. Зокрема, ми збираємося почати з роботи над підпискою на віджет, а потім отримати базовий віджет для відображення на адміністративній стороні сайту.
Шаблон віджета WordPress: рефакторинг, частина 8
Причина, чому я зацікавлений у першу чергу зосередженні на адміністративній стороні сайту, полягає в тому, що це дозволяє нам:
- зрозуміти, як працюють підписники,
- побачити, як потрібно буде організувати кодову базу,
- жорстко закодуйте деяку інформацію перед роботою з серіалізацією.
Коли все це буде створено, ми матимемо можливість звернути увагу на більш просунуті речі. Зокрема, ми зможемо представити передплатників для відображення інформації в області адміністрування та передплатників для очищення, серіалізації, отримання, перевірки та відображення даних.
Але спочатку давайте виконаємо роботу, необхідну для налаштування нового класу, налаштування автозавантажувача та відображення вмісту в адміністративній області сайту.
1 Абстрактний абонент
Давайте спочатку розглянемо абстрактного передплатника, оскільки це те, що реалізують усі передплатники.
<?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.
*/
namespace WordPressWidgetBoilerplateSubscriber;
/**
* An abstract implementation of a subscriber that requires a hook and the ability to
* start the class.
*/
abstract class AbstractSubscriber
{
/**
* @var string a reference to the hook to which the subscriber should be registered
*/
protected $hook;
/**
* @param string $hook the hook to which the subscriber is registered
*/
public function __construct(string $hook)
{
$this->hook = $hook;
}
/**
* @return string the hook to which the subscriber is registered
*/
public function getHook(): string
{
return $this->hook;
}
/**
* Implements the domain logic for the concrete class implementating this subcriber.
*/
abstract public function load();
}
Зверніть увагу, що він має дві публічні функції – конструкцію, яка встановлює хук, і функцію для отримання хука. Він також має функцію абстрактного завантаження, у якій будь-який клас, що розширює цей клас, реалізує свою конкретну функціональність.
Пам’ятайте, що через те, як WordPress обробляє дії та фільтри, все прикріплюється до певного хука (або тих , які визначає WordPress, або спеціальних хуків).
2 Простір імен WordPress
Кожного разу, коли я працюю над функціями, які тісно пов’язані з WordPress, я намагаюся переконатися, що розміщую їх у просторі імен WordPress. Це вказує мені, а також іншим розробникам, що все, що знаходиться в цьому просторі імен, не може бути відокремлено від основної програми.
Тож у каталозі src створіть каталог WordPress. Саме тут розташовуватиметься основний клас Widget разом із усіма іншими класами, представленими в цій серії.
Це означає, що нам більше не потрібен клас у каталозі API. Тому обов’язково перемістіть клас, оновіть його простір імен і видаліть каталог. Трохи пізніше я отримаю знімок екрана та код для цього.
Крім того, нагадайте раніше в цій серії, ми розмістили каталог Views у корені каталогу src, але тепер ми можемо перемістити його до каталогу WordPress . Тож зробіть це зараз.
Кінцевий результат має виглядати приблизно так:
Тепер ми можемо звернути увагу на код.
3 Погляд на клас віджетів
У цій публікації ми збираємося трохи спростити основний клас віджетів. Це скасує частину роботи, яку ми виконали, але нам потрібна була ця попередня робота, щоб дійти до цього моменту.
Наразі ми зосереджуємось на конструкторі та функції для отримання слага віджета. Це те, що зрештою дозволить нам побачити щось в адміністративній області WordPress.
Отже, спочатку переконайтеся, що ваш клас Widget виглядає так :
<?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.
*/
namespace WordPressWidgetBoilerplateWordPress;
use WP_Widget;
class Widget extends WP_Widget
{
/**
* @var string unique identifier for your widget
*/
protected $widgetSlug;
/**
* Initializes the plugin by setting its properties and calling the parent class with the description.
*
* @param mixed $widgetSlug
*/
public function __construct($widgetSlug)
{
$this->widgetSlug = $widgetSlug;
parent::__construct(
$this->getWidgetSlug(),
__('Widget Name', $this->getWidgetSlug()),
[
'classname' => $this->getWidgetSlug().'-class',
'description' => __('Short description of the widget goes here.', $this->getWidgetSlug()),
]
);
}
/**
* Return the widget slug.
*
* @return string slug variable
*/
public function getWidgetSlug()
{
return $this->widgetSlug;
}
}
Далі, оскільки ми перемістили цей файл до простору імен WordPress, нам потрібно оновити розділ автозавантаження нашого файлу конфігурації Composer :
"autoload": {
"psr-4": {
"WordPressWidgetBoilerplate": "src/",
"WordPressWidgetBoilerplateUtilities": "src/Utilities/",
"WordPressWidgetBoilerplateSubscriber": "src/Subscriber/",
"WordPressWidgetBoilerplateWordPress": "src/WordPress/"
}
},
Далі нам потрібно представити абонента.
4 Знайомство з Widget Subscriber
Щоразу, коли у мене є якийсь базовий клас, я зазвичай намагаюся створити простий передплатник, який створює екземпляр основного класу та дозволяє йому виконувати свою роботу.
Я роблю це тому, що WordPress, як уже згадувалося, використовує шаблон проектування, керований подіями, що означає, що все має бути зареєстровано на певному типі хука. І мені не подобається змішувати логіку домену з тим самим класом, який підключається до WordPress. Тому я їх розділяю.
І це те, що підписник робить. Він реєструється в WordPress, а потім викликає клас, відповідальний за фактичне виконання роботи.
З огляду на це, зверніть увагу на каталог Subscriber і додайте клас під назвою WidgetSubscriber. У цей клас додайте наступний код :
<?php
<?php
namespace WordPressWidgetBoilerplateSubscriber;
use WordPressWidgetBoilerplateWordPressWidget;
/**
* Initializes the core Widget class that's used by WordPress to instantiate the widget,
* renders the administrative area, provide serialization functionality, and displays the
* public-facing view.
*/
class WidgetSubscriber extends AbstractSubscriber
{
/**
* {@inheritdoc}
*/
public function __construct(string $hook)
{
parent::__construct($hook);
}
/**
* Registers the core Widget class using the WordPress APIs.
*/
public function load()
{
register_widget(new Widget('widget-name'));
}
}
Конструктор зареєструє клас за допомогою певного хука, який ми розглянемо незабаром; тоді він використовуватиме API WordPress для створення екземпляра нашого віджета (це те, що відбувається у функції завантаження ).
5 Bootstrap
Нарешті, нам потрібно оновити програму початкового завантаження, щоб вона:
- реєструє WidgetSubscriber з відповідним хуком,
- додає абонента до Реєстру ,
- і запускає плагін (що ми робили).
Завантажувальна програма після всього цього має виглядати наступним чином :
<?php
namespace WordPressWidgetBoilerplate;
use WordPressWidgetBoilerplateUtilitiesRegistry;
use WordPressWidgetBoilerplatePlugin;
use WordPressWidgetBoilerplateSubscriberWidgetSubscriber;
// Prevent this file from being called directly.
defined('WPINC') || die;
// Include the autoloader.
require_once __DIR__. '/vendor/autoload.php';
// Setup a filter so we can retrieve the registry throughout the plugin.
$registry = new Registry();
add_filter('wpwBoilerplateRegistry', function() use ($registry) {
return $registry;
});
// Add the Widget base class to the Registry.
$registry->add('widgetSubscriber', new WidgetSubscriber('widgets_init'));
// Start the machine.
(new Plugin($registry))->start();
Далі ви зможете увійти в WordPress і активувати плагін.
Погляд на адміністративний район
На даний момент нема на що дивитися, але ми досягаємо цього. По-перше, ви повинні помітити, що віджет тепер відображається в області, яка включає доступні віджети:
І ви також повинні побачити, що коли ви перетягуєте віджет до області віджетів (або будь-якої бічної панелі), він не має доступних опцій.
Тим не менш, ми знаходимося в хорошому місці, щоб продовжувати будувати те, що маємо. Ви завжди можете продовжувати відстежувати розвиток шаблону на GitHub.
Продовження
Далі ми продовжимо розробляти функціональні можливості для адміністративної області віджета. Після цього ми звернемо увагу на публічну частину віджета, а також на функцію серіалізації.
Ви повинні бачити, як все починає набувати форми, коли ми починаємо розділяти логіку на різні компоненти. Якщо ні, не хвилюйтеся – попереду ще багато чого.
І остаточна версія Boilerplate, звичайно, продемонструє всі принципи, на яких ми будуємо всю цю серію публікацій.

