является ли плагин активной функцией, не существует


Я использую 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.

Я также не могу видеть функции из моего основного файла плагина в других плагинах (если это поможет любой).

Author: Carl, 2011-02-14

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' );
 37
Author: scribu, 2011-04-30 00:05:54

Вы можете вызвать 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() было бы лучше. :)

 15
Author: Lance Cleveland, 2013-02-26 18:45:06

Быстрым и грязным обходным решением было бы дублировать функцию вручную:

if ( ! function_exists( 'is_plugin_active' ) ) {
    function is_plugin_active( $plugin ) {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }
}

Он довольно короткий, поэтому его не должно быть слишком сложно реализовать в вашем собственном коде в качестве обходного пути.

 10
Author: Tom Auger, 2019-11-21 19:40:15

Я предпочел ответ Тома Оже о том, как определить вашу собственную функцию is_plugin_active вместо включения plugin.php . Однако использование того же имени функции привело к сбою в моей административной области. Использование другого имени функции решило эту проблему:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
 5
Author: Jeroen, 2015-10-03 09:19:18

Просто и легко. Взято из 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' ) ) {

   }

Получите проверку функции. ТАК что больше никаких ошибок.

 4
Author: Spencer Labadie, 2014-07-14 22:34:40

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

Кроме того, использует ли ваш основной файл плагина Заголовок файла Wordpress? Включен ли ваш плагин после вышеизложенного plugin.php файл загружен?

 1
Author: Jonnybojangles, 2014-06-03 15:02:46

Для отладки активных плагинов:

var_dump(get_option(...));

Чтобы проверить наличие определенного плагина:

in_array(get_option(...));

Действие называется "active_plugins" IIRC.

 1
Author: hakre, 2014-06-04 09:10:21

Если вы используете elementor и сталкиваетесь с проблемой только во внешнем интерфейсе, и она работает в представлении редактора.

Вы можете использовать функцию is_edit_mode() elementor, поэтому условие будет выполняться только в представлении редактора.

if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
    return true;
} else {
    return false;
}
 1
Author: actuallyakash, 2020-10-29 08:11:58

Вы можете проверить, активен ли плагин следующим образом:

/**
 * 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
}
 1
Author: Faruk, 2020-11-30 11:50:11

Ни одно из этих решений не сработало для меня, но это сработало:

include_once('wp-admin/includes/plugin.php');

Я нашел это решение в codebangers.com

 0
Author: fenderflip, 2014-06-03 15:01:48