Функция is_plugin_active не существует
Я использую WordPress 3.0.5 и тестировал с 3.1rc4. В главном PHP файле моего плагина при попытке вызвать is_plugin_active я получаю ошибку Call to undefined function is_plugin_active()
. Я могу вызывать add_action и add_filter. Что мне нужно проверить/изменить, чтобы исправить это?
Это происходит в административной части на странице Плагины. В начале моего основного файла плагина у меня есть код if (function_exists('is_plugin_active')) {
, который всегда возвращает false.
Я также не могу видеть функции из моего основного файла плагина в других плагинах (если это помогает).

Это происходит потому, что файл, в котором определена функция is_plugin_active() - wp-admin/includes/plugin.php
- загружается только в админке, уже после загрузки вашего плагина.
Таким образом, вы можете вызывать эту функцию только после срабатывания хука 'admin_init':
function check_some_other_plugin() {
if ( is_plugin_active('some-plugin.php') ) {
...
}
}
add_action( 'admin_init', 'check_some_other_plugin' );

Вы можете использовать функцию is_plugin_active() в шаблонах и на пользовательских страницах, что может быть полезно для связанных плагинов (например, когда ваш новый плагин требует для работы плагин 'xyz'). Вам нужно вручную подключить файл plugin.php, как указано в документации is_plugin_active() в Codex.
Вот рабочий пример, который я использую в своих премиум-аддонах, чтобы убедиться, что базовый бесплатный плагин активен перед созданием объекта аддона. Это требует наличия определенных хуков и фильтров в базовом плагине, иначе произойдет сбой.
include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) {
return;
}
Кстати, если у вас возникают проблемы с is_plugin_active() при активной администраторской сессии, скорее всего, вы проводите тестирование до срабатывания admin_init. Хук admin_menu выполняется до admin_init, и проведение проверок в admin_menu уже "подводило" меня раньше. Название "admin_init" кажется мне нелогичным, поскольку admin_menu уже выполнился. Я бы назвал это скорее admin_kinda_init(). :)

Быстрое и простое решение — вручную продублировать функцию:
if ( ! function_exists( 'is_plugin_active' ) ) {
function is_plugin_active( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
}
Функция достаточно короткая, поэтому её несложно реализовать в своём коде в качестве временного решения.

Просто и легко. Взято из WP
if ( ! function_exists( 'is_plugin_active' ) )
require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
и затем любые случаи использования
if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {
}
получают проверку функции. Так что больше никаких ошибок.

Я предпочел ответ Тома Оже о том, как определить свою собственную функцию is_plugin_active вместо включения plugin.php. Однако использование того же имени функции привело к падению админки. Использование другого имени функции решило проблему:
function is_plugin_active_byme( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

Вы используете is_plugin_active
в админке или на фронтенде? Я почти уверен, что is_plugin_active
— это функция только для админки, которая находится в wp-admin/includes/plugin.php.
Кроме того, использует ли ваш главный файл плагина Заголовок файла WordPress? Загружается ли ваш плагин после того, как загружен указанный выше файл plugin.php?

Если вы используете Elementor и сталкиваетесь с проблемой только на фронтенде, при этом в режиме редактора всё работает корректно.
Вы можете использовать функцию is_edit_mode()
Elementor, чтобы условие выполнялось только в режиме редактора.
if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
return true;
} else {
return false;
}

Ни одно из этих решений не сработало для меня, но помогло это:
include_once('wp-admin/includes/plugin.php');
Я нашел это решение на codebangers.com
