Несколько лет назад я создал шаблон WordPress Widget Boilerplate, стремясь сделать его следующим:
Организованный, поддерживаемый шаблон для создания виджетов с использованием лучших практик WordPress.
С тех пор мало что изменилось в отношении API виджетов (о котором мы поговорим позже в этом посте), но то, что я считаю «лучшими практиками», изменилось. Пример вводного объектно-ориентированного программирования в WordPress высок.
Это не потому, что он использует много объектно-ориентированных принципов, не потому, что он использует современные стандарты (по крайней мере, в том, что касается современного PHP), а потому, что он использует несколько вещей, которые помогают нам распознать некоторые, скажем, сигналы относительно объектно-ориентированного программирования в WordPress.
И это то, что не следует недооценивать: если вы ищете примеры объектно-ориентированного программирования в WordPress, ищите API, которые его используют.
Кроме того, если вы ищете способы оценить свой собственный уровень оценки фрагмента кода (не говоря уже о кодовой базе) для использования классов и некоторых более продвинутых функций ООП, то почему бы не иметь своего рода лакмусовой бумажки, чтобы увидеть, как вы делаете?
И Widgets API делает именно это.
Виджеты WordPress: введение
Итак, в меньшей серии, чем моя предыдущая, я собираюсь рассмотреть API виджетов и сделать несколько вещей:
- показать вам основной скелет виджета и почему он объектно-ориентированный,
- обсудите, какие вещи вы должны уметь замечать и почему,
- сначала обновите Widget Boilerplate непосредственно на этом сайте, а затем отправьте его на GitHub,
- создайте виджет, используя API с шаблоном в качестве основы для нашей работы.
И в этом посте мы начнем с первого пункта выше.
Но сначала…
Прежде чем перейти к этому посту, я рекомендую прочитать следующие сообщения:
- Два столпа объектно-ориентированного программирования: часть 1 из 2
- Два столпа объектно-ориентированного программирования: часть 2 из 2
- Абстрактные классы, часть 1 – абстрагирующее поведение
- Абстрактные классы. Часть 2. Абстрактные классы и интерфейсы
Когда закончите (или если вы чувствуете, что уже разбираетесь в темах), мы готовы к работе.
[ограничить платно = «истина»]
Основы API виджетов
Если вы прочитаете страницу справочника по виджетам, вы увидите много контента. Это хорошо, но не всегда лучший ход, когда вы пытаетесь донести контент до такой аудитории, как вы, когда вам нужен практический, объектно-ориентированный совет.
Итак, я собираюсь выбрать соответствующие части из документации по API, а затем применить их к коду, который нам также предоставили.
Что такое виджет?
Я думаю, что большинство из нас, кто работает с WordPress, знают, что такое виджет, но важно дать определение этому термину, чтобы мы все работали над одной и той же идеей. В справочнике написано:
Виджет — это объект PHP, который выводит некоторый HTML. Один и тот же виджет можно использовать несколько раз на одной и той же странице (например, текстовый виджет). Виджеты могут сохранять данные в базу данных (в таблицу опций).
Имея это в виду, давайте взглянем на код пользовательского виджета, по крайней мере, на его заглушку, и посмотрим, что мы можем почерпнуть в отношении его объектно-ориентированной природы.
Класс виджета
Еще до того, как мы взглянем на код, мы знаем, что будет какой-то уровень объектно-ориентированного программирования просто потому, что документация говорит нам делать три вещи:
- Создайте класс своего виджета, расширив стандартный класс WP_Widget и некоторые его функции.
- Зарегистрируйте свой виджет, чтобы он был доступен на экране виджетов .
- Убедитесь, что в вашей теме есть хотя бы одна область виджетов, в которую можно добавить виджеты.
В этом посте я сосредоточусь на первом пункте (хотя мы в конечном итоге дойдем до того, как мы вводим наши виджеты в тему, прежде чем серия закончится).
Итак, давайте выложим код так, как он представлен в документации, и поговорим о том, что мы можем из него узнать:
<?php
class AcmeWidget extends WP_Widget
{
public function __construct()
{
}
public function widget($args, $instance)
{
}
public function form($instance)
{
}
public function update($newInstance, $oldInstance)
{
}
}
Во-первых, мы замечаем, что, хотя мы определили класс (который мы можем назвать как угодно, по-моему), он должен расширять WP_Widget. Это означает, что в ядре WordPress есть класс WP_Widget. Вы можете просмотреть хорошо организованную разбивку исходного кода на этой странице.
Во-вторых, ключевое слово extends указывает на то, что мы используем наследование PHP, которое является основным столпом объектно-ориентированного программирования.
В-третьих, мы должны реализовать четыре функции, две из которых требуют аргументов. Функции, которые мы должны реализовать, следующие:
- __construct(), который является базовым конструктором класса. Здесь нам нужно убедиться, что вызывается конструктор родительского класса, если он есть, а затем мы инициализируем любые свойства, которые мы считаем необходимыми для нашего виджета. Мы рассмотрим это позже в этой серии.
- widget() отвечает за вывод содержимого виджета, которое пользователь предоставляет с помощью интерфейса в административной области. Он принимает два параметра — $args и $instance. Параметр $args — это информация, которая должна отображаться на странице, а $instance — это ссылка на экземпляр виджета (поскольку на странице могут отображаться несколько виджетов).
- form() отображает административный интерфейс, с которым пользователь взаимодействует, чтобы указать, что выводится на интерфейсе сайта. Также требуется аргумент $instance, поэтому предоставляемая информация относится к фактическому виджету, с которым работает пользователь (а не ко всем экземплярам виджета).
- update() используется для сохранения значений в текущем экземпляре виджета. Он принимает два аргумента. Первый — это новый экземпляр виджета с обновленными значениями, которые предоставил пользователь (подумайте об обновлении значения активного текстового виджета), а второй аргумент — это старый экземпляр виджета или, возможно, предыдущий экземпляр или, возможно, «экземпляр, который содержал предыдущие значения».
Эти четыре функции необходимо реализовать как часть Widget API, как часть наследования функций от расширенного интерфейса и для создания основных функций виджета.
Это не означает, что нельзя добавить больше, но в хорошем объектно-ориентированном стиле, вероятно, было бы лучше передать это поведение другим классам. Но мы рассмотрим это позже в этой серии, когда будем создавать собственный виджет.
Каковы ключевые выводы?
Чтобы убедиться, что я ясно понимаю, что можно понять из этого поста, это следующее:
- API виджетов является объектно-ориентированным. Он не только объектно-ориентирован, потому что использует класс (хотя это, безусловно, хорошая отправная точка), но и потому, что наследует функциональность, встроенную в уже существующий базовый класс.
- Всякий раз, когда мы наследуем поведение от базового класса или родительского класса, мы бесплатно получаем предварительно разработанную функциональность. Объектно-ориентированное программирование — это действительно замечательная вещь, потому что оно позволяет нам сосредоточиться именно на логике программирования, которую мы хотим реализовать.
Представьте на мгновение, что вы хотите разработать виджет, но каждый раз, когда вы это делаете, вам приходится прописывать всю функциональность для хуков в WordPress, чтобы выполнять все те же повторяющиеся шаблонные функции.
Именно здесь вступают в игру наследование и объектно-ориентированное программирование. Повторяющийся код абстрагируется в базовый класс, поэтому он пишется только один раз, а затем остается реализовать тот код, на котором мы хотим сосредоточиться.
Все вышеперечисленное — это то, что следует понимать при чтении исходного кода базового объектно-ориентированного API в WordPress.
Что дальше?
В следующем посте этой серии мы рассмотрим объектно-ориентированный характер API виджетов и то, что вы сможете сразу обнаружить, прочитав код.
Это связано с тем, что на практике важно распознавать определенные объектно-ориентированные принципы, и это хороший способ оценить, можете ли вы это сделать или нет. Если да, отлично! Тогда это будет продолжать помогать развивать эту мышцу. Если нет, не беспокойтесь — это все равно поможет вам развить эту мышцу.
И это сослужит вам хорошую службу, поскольку мы продолжаем все больше и больше переходить к объектно-ориентированной разработке WordPress с помощью практических средств.
Необходимая теория раскрыта. Итак, давайте приступим к практической реализации.