является ли плагин активной функцией, не существует
Я использую 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.
Я также не могу видеть функции из моего основного файла плагина в других плагинах (если это поможет любой).
10 answers
Это потому, что файл, в котором определен 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() в Кодексе.
Вот функциональный пример, который я использую в своих пакетах надстроек премиум-класса, чтобы убедиться, что бесплатный базовый плагин активен, прежде чем вызывать объект надстройки. Это требует наличия определенных крючков и фильтров в базовый плагин или он выйдет из строя.
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 уже запущено. Я думаю об init как о "первом, что нужно запустить"... может быть, admin_kinda_init() было бы лучше. :)
Быстрым и грязным обходным решением было бы дублировать функцию вручную:
if ( ! function_exists( 'is_plugin_active' ) ) {
function is_plugin_active( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
}
Он довольно короткий, поэтому его не должно быть слишком сложно реализовать в вашем собственном коде в качестве обходного пути.
Я предпочел ответ Тома Оже о том, как определить вашу собственную функцию is_plugin_active вместо включения plugin.php . Однако использование того же имени функции привело к сбою в моей административной области. Использование другого имени функции решило эту проблему:
function is_plugin_active_byme( $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
внутри администратора или внешнего интерфейса? Я почти уверен, что is_plugin_active
- это только функция администратора, которая находится внутри wp-admin/includes/plugin.php .
Кроме того, использует ли ваш основной файл плагина Заголовок файла Wordpress? Включен ли ваш плагин после вышеизложенного plugin.php файл загружен?
Для отладки активных плагинов:
var_dump(get_option(...));
Чтобы проверить наличие определенного плагина:
in_array(get_option(...));
Действие называется "active_plugins
" IIRC.
Если вы используете elementor и сталкиваетесь с проблемой только во внешнем интерфейсе, и она работает в представлении редактора.
Вы можете использовать функцию is_edit_mode()
elementor, поэтому условие будет выполняться только в представлении редактора.
if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
return true;
} else {
return false;
}
Вы можете проверить, активен ли плагин следующим образом:
/**
* Check if Some Plugin is active
**/
if ( in_array( 'some-plugin/some-plugin.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
// Put your plugin code here
}
Ни одно из этих решений не сработало для меня, но это сработало:
include_once('wp-admin/includes/plugin.php');
Я нашел это решение в codebangers.com