Расширяемость с помощью плагинов и API хуков - это основная фича WordPress. Существует множество плагинов, которые являются расширениями для других плагинов. Новая функциональность "Plugin Dependencies" направлена на то, чтобы сделать процесс установки и активации дополнений (dependents - зависимые) и плагинов, от которых они зависят (dependencies - зависимости), понятными, последовательным и простым.
Читайте также: Заголовки плагина
Оглавление
- Новый Заголовок плагина —
Requires Plugins
- Требования
- Зависимые плагины (Dependent)
- Зависимости плагина (Dependency)
- Что если зависимости больше не существует?
- Что если у плагина появляется новая зависимость при обновлении?
- Что происходит, если есть циклические зависимости?
- Нужен ли все еще "защитный код" для проверки зависимостей?
- WP-CLI и Plugin Dependencies функциональность
- Ограничения
- Плагины, размещенные в каталоге WordPress.org
- Плагины, не размещенные в каталоге WordPress.org
- Плагины Must-Use в качестве зависимостей
- Темы, требующие плагины
- Новый Фильтр
- Изменения пользовательского интерфейса
- Плагины > Установленные плагины
- Плагины > Добавить новый
- Процесс внедрения
- Новый класс WP_Plugin_Dependencies
Новый Заголовок плагина — Requires Plugins
Был внедрен новый заголовок Requires Plugins
.
Он должен содержать список ярлыков плагинов от которых зависит текущий плагин (через запятую). Например my-plugin
(обычно это название папки плагина).
Формат my-plugin/my-plugin.php
не поддерживается.
Пример использования нового заголовка
/** * Plugin Name: Express Payment Gateway Checkout for Shop * Requires Plugins: shop, payment-gateway */
Требования
Зависимые плагины (Dependent)
На зависимые плагины накладываются следующие требования:
- Нельзя установить, пока не установлены зависимости.
- Нельзя активировать, пока не активированы зависимости.
Зависимости плагина (Dependency)
На зависимости плагины накладываются следующие требования:
- Нельзя деактивировать, пока зависимые плагины активированы.
- Нельзя удалить, пока установлены зависимые плагины.
Что если зависимости больше не существует?
Если плагин-зависимость удаляется вручную, например, через FTP, при деплое или как-то еще, на экранах управления плагинами будет показано уведомление, о том, что отсутствуют зависимости. Кроме того, у каждого зависимого, чьи зависимости больше не выполняются, будет уведомление об ошибке.
Что если у плагина появляется новая зависимость при обновлении?
Обновление будет разрешено на данный момент, и зависимый плагин останется активным. На экранах управления плагинами будет отображено уведомление, информирующее пользователя о том, что отсутствуют зависимости для установки и/или активации.
Что происходит, если есть циклические зависимости?
Циклическая зависимость - это когда плагин зависит от другого плагина, а тот в свою очередь зависит от третьего плагина, который зависит от первого плагина.
Например: Плагин A требует Плагин B, а B требует Плагин C, которые требует Плагин A.
"Plugin Dependencies" включает обнаружение циклических зависимостей и будет отображать уведомление, о плагинах, требования которых недействительны. Плагины не могут быть активированы, и пользователи должны связаться с авторами плагинов, чтобы эта циклическая ссылка могла быть разорвана, если это необходимо.
Нужен ли все еще "защитный код" для проверки зависимостей?
Нет. Plugin Dependencies упрощает установку и активацию плагинов-зависимостей. Это означает, что авторы плагинов могут безопасно удалять проверки и уведомления, когда их зависимости не установлены или не активированы.
Однако на данный момент Plugin Dependencies не включает поддержку минимальной или максимальной версии для зависимостей, и не учитывает порядок загрузки плагинов. Поэтому авторы плагинов должны продолжать использовать (function|class|interface)_exists()
и проверки версий, если их плагин зависит от наличия конкретной функциональности в определенной версии.
WP-CLI и Plugin Dependencies функциональность
Plugin Dependencies не предотвращает установку зависимых плагинов без их зависимостей через WP-CLI, так как предполагается, что те, кто использует WP-CLI, являются опытными пользователями, которые осведомлены о стеке зависимостей.
Однако, чтобы избежать незамеченных недостающих зависимостей, зависимые плагины не могут быть активированы с помощью WP-CLI, пока их зависимости не будут активированы.
Это влияет на команду wp plugin activate --all
, для который может потребоваться несколько запусков, если зависимый плагин появляется алфавитно раньше своих зависимостей.
Разработчики ядра планируют улучшить работу WP-CLI и функцией зависимостей. Пока все это находится в режиме улучшения и разработки (справедливо для версии WP 6.5).
Ограничения
Плагины, размещенные в каталоге WordPress.org
Зависимые плагины, размещенные на WordPress.org, могут объявлять зависимости, которые также размещены на WordPress.org. Если ваш плагин, размещенный на WordPress.org, требует плагины, которые там не размещены, рекомендуется в настоящее время не использовать заголовок Requires Plugins
в своем плагине.
Плагины, не размещенные в каталоге WordPress.org
Зависимые плагины, не размещенные на WordPress.org, могут объявлять зависимости, будь то размещенные на WordPress.org или где-то еще. Однако пользовательский интерфейс не будет предоставлять ссылку для установки сторонних зависимостей, и их придется находить и устанавливать вручную.
Плагины Must-Use в качестве зависимостей
Плагины Must-Use в качестве зависимостей в настоящее время не поддерживаются ядром WordPress. Обсуждение будет продолжено в тикете #60504.
Темы, требующие плагины
Темы, требующие плагины, в настоящее время не поддерживаются Plugin Dependencies
, и авторы тем должны продолжать использовать проверки и сообщения в коде.
Новый Фильтр
Появился новый хук-фильтр wp_plugin_dependencies_slug для внесения изменений в слаги зависимостей. Например, если зависимый плагин объявляет my-plugin
в качестве зависимости, и существует премиум-версия my-plugin
, премиум-версия может отфильтровать слаг и преобразовать его в my-plugin-pro
, чтобы "Plugin Dependencies" мог его обнаружить.
Пример использования фильтра
add_filter( 'wp_plugin_dependencies_slug', 'convert_myplugin_to_myplugin_pro' ); function convert_myplugin_to_myplugin_pro( $slug ) { if ( 'my-plugin' === $slug ) { $slug = 'my-plugin-pro'; } return $slug; }
Изменения пользовательского интерфейса
Плагины > Установленные плагины
Были внесены следующие изменения:
- Строки зависимых плагинов теперь содержат список их зависимостей, связанных с соответствующими модальными окнами плагина для установки и активации зависимости.
- Строки плагинов-зависимостей теперь содержат список своих зависимых плагинов.
- Если у плагина есть неустановленные и неактивные зависимости, ссылка Активировать не работает.
- Если у плагина есть активные зависимые плагины, ссылки Деактивировать и Удалить не работают.
- Массовые действия отключены для плагинов-зависимостей.
Плагины > Добавить новый
Были внесены следующие изменения:
Если у плагина есть нерешенные зависимости, кнопки Установить сейчас и Активировать не работают, как на карточке плагина, так и в модальном окне с информацией о плагине.
Карточки зависимых плагинов теперь содержат уведомление со списком их зависимостей, с ссылкой Подробнее на модальное окно с информацией о зависимости, которое содержит кнопки Установить сейчас или Активировать (в зависимости от статуса).
- Модальные окна с информацией о плагинах теперь остаются после нажатия кнопок, и установка и активация плагина через модальное окно теперь выполняется через AJAX непосредственно в модальном окне.
Процесс внедрения
Из-за единого подхода AJAX, который теперь используется на экране Плагины > Добавить новый, активация плагина больше не будет автоматически перенаправлять на страницу Плагины > Установленные плагины или на процессы внедрения, реализованные авторами плагинов. Это позволяет пользователям устанавливать и активировать несколько плагинов, не покидая текущего контекста.
Плагины с процессами внедрения обычно включают проверки, чтобы, например, если плагин установлен и активирован с помощью WP-CLI, процесс внедрения будет запущен, когда пользователь входит на одну из страниц настроек плагина. Такие реализации не будут затронуты Plugin Dependencies, как и активация со страницы Плагины > Установленные плагины через ссылку Активировать.
Новый класс WP_Plugin_Dependencies
Появился новый класс WP_Plugin_Dependencies.
Доступны следующие публичные (API) методы:
::has_dependents( $plugin_file )
Определяет, есть ли у плагина плагины, зависящие от него.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
bool
Есть ли у плагина плагины, зависящие от него.
::has_dependencies( $plugin_file )
Определяет, есть ли у плагина зависимости от других плагинов.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
bool
Есть ли у плагина зависимости от других плагинов.
::has_active_dependents( $plugin_file )
Определяет, есть ли у плагина активные зависимые плагины.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
bool
Есть ли у плагина активные зависимые плагины.
::get_dependents( $slug )
Получает пути файлов плагинов, требующих зависимость.
- Параметр:
$slug
string
- Слаг зависимости. - Возвращает:
array
Массив путей файлов зависимых плагинов, относительно каталога плагинов.
::get_dependencies( $plugin_file )
Получает слаги плагинов, которые требуют зависимость.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
array
Массив слагов зависимых плагинов.
::get_dependent_filepath( $slug )
Получает путь к файлу зависимого плагина.
- Параметр:
$slug
string
- Слаг зависимости. - Возвращает:
string|false
Путь к файлу зависимого плагина, относительно каталога плагинов, или false, если у плагина нет зависимостей.
::get_dependency_filepath( $slug )
Получает путь к файлу зависимости, относительно каталога плагина.
- Параметр:
$slug
string
- Слаг зависимости. - Возвращает:
string|false
Если установлен, путь к файлу зависимости относительно каталога плагинов, в противном случае false.
::has_unmet_dependencies( $plugin_file )
Определяет, есть ли у плагина невыполненные зависимости.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
bool
Есть ли у плагина невыполненные зависимости.
::has_circular_dependency( $plugin_file )
Определяет, есть ли у плагина циклическая зависимость.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
bool
Возвращает true, если у плагина есть циклическая зависимость.
::get_dependent_names( $plugin_file )
Получает имена плагинов, которые требуют данный плагин.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
array
Массив имен зависимых плагинов.
::get_dependency_names( $plugin_file )
Получает имена плагинов, которые требуются для данного плагина.
- Параметр:
$plugin_file
string
- Файл плагина, относительно каталога плагинов. - Возвращает:
array
Массив имен необходимых плагинов.
::get_dependency_data( $slug )
Возвращает данные API для зависимости.
- Параметр:
$slug
string
- Слаг зависимости. - Возвращает:
array
|false Данные API зависимости в случае успеха, в противном случае false.
--
Тикет: #22316 WordPress функция Plugin Dependencies.
Источник: https://make.wordpress.org/core/2024/03/05/introducing-plugin-dependencies-in-wordpress-6-5/