Зависимости плагина от других плагинов в WordPress 6.5

Click here to view original web page at wp-kama.ru

Расширяемость с помощью плагинов и API хуков - это основная фича WordPress. Существует множество плагинов, которые являются расширениями для других плагинов. Новая функциональность "Plugin Dependencies" направлена на то, чтобы сделать процесс установки и активации дополнений (dependents - зависимые) и плагинов, от которых они зависят (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/