Функция is_plugin_active не существует

15 февр. 2011 г., 01:59:14
Просмотры: 36K
Голосов: 31

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

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

5
Комментарии

Не уверен из вашего описания - это проблема с активированным плагином или вы пытаетесь сделать что-то при активации или при других специфических условиях?

Rarst Rarst
15 февр. 2011 г. 21:15:59

Я обнаружил, что function_exists('is_plugin_active') возвращает false при вызове из основного файла плагина, если он находится вне метода, но возвращает true при вызове внутри метода, который вызывается для действия activated_plugin.

Carl Carl
16 февр. 2011 г. 05:36:06

На какой странице вы видите ошибку? На странице плагинов (wp-admin/plugins.php)? Это до или после активации рассматриваемого плагина?
Rarst поднял хороший вопрос. Вы знаете, в какой момент вы вызываете эту функцию внутри WordPress?

Jonnybojangles Jonnybojangles
16 февр. 2011 г. 21:58:30

Я вижу ошибку в wp-admin/plugins.php после активации плагина. У меня есть проверка в некоторых методах, которые подключены как действия, и там это работает. Похоже, что это связано с порядком подключения.

Carl Carl
17 февр. 2011 г. 01:37:40

Плагины загружаются в алфавитном порядке, поэтому возможно, что ваш плагин просто не обрабатывается достаточно рано. Попробуйте переименовать ваш плагин так, чтобы он начинался с буквы "a" (например, a_мой-плагин), чтобы он загружался раньше. Однако лучшим вариантом будет вызов вашего блока function_exists из функции, которая выполняется после загрузки плагинов. Приблизительный порядок выполнения можно посмотреть в WP codex: https://codex.wordpress.org/Plugin_API/Action_Reference

Phill Healey Phill Healey
19 февр. 2019 г. 21:07:04
Все ответы на вопрос 11
2
45

Это происходит потому, что файл, в котором определена функция 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' );
15 февр. 2011 г. 03:12:53
Комментарии

Если я уже в админке, может ли быть что-то неправильно настроено, что запрещает мне доступ к этому?

Carl Carl
15 февр. 2011 г. 16:03:48

Смотрите обновленный ответ.

scribu scribu
30 апр. 2011 г. 03:06:09
1
20

Вы можете использовать функцию 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(). :)

26 февр. 2013 г. 20:45:06
Комментарии

Добавление include_once(ABSPATH.'wp-admin/includes/plugin.php'); сработало для меня. Спасибо!

Dave Dave
12 апр. 2018 г. 03:42:27
0
14

Быстрое и простое решение — вручную продублировать функцию:

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

Функция достаточно короткая, поэтому её несложно реализовать в своём коде в качестве временного решения.

30 апр. 2011 г. 02:14:42
2

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

   }

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

15 июл. 2014 г. 01:34:40
Комментарии

Если вы используете requireonce, то, вероятно, вам не нужно проверять функцию... ?

Phill Healey Phill Healey
23 мар. 2017 г. 22:07:12

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

Spencer Labadie Spencer Labadie
19 февр. 2019 г. 20:06:49
1

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

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}
3 окт. 2015 г. 12:19:18
Комментарии

Я согласен. Хотя вы можете проверить наличие конфликта при объявлении функции, WordPress этого не делает, поэтому ваш WP выдаст ошибку.

Chris Sprague Chris Sprague
9 сент. 2018 г. 13:54:23
0

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

var_dump(get_option(...));

Для проверки конкретного плагина:

in_array(get_option(...));

Действие называется "active_plugins", если я правильно помню.

15 февр. 2011 г. 02:46:44
1

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

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

15 февр. 2011 г. 03:23:15
Комментарии

Это происходит в админке на странице плагинов. Плагин имеет рекомендуемый заголовок WP файла. Как я могу проверить, подключается ли плагин после plugin.php?

Carl Carl
15 февр. 2011 г. 16:02:40
0

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

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

if ( \Elementor\Plugin::$instance->editor->is_edit_mode() && is_plugin_active('some-plugin.php') ) {
    return true;
} else {
    return false;
}
29 окт. 2020 г. 10:11:58
0

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

/**
 * Проверяем, активен ли Some Plugin
 **/
if ( in_array( 'some-plugin/some-plugin.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Здесь размещайте код вашего плагина
}
30 нояб. 2020 г. 13:50:11
0

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

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

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

3 июн. 2014 г. 17:57:33
0

Мне нравится быстрое и простое решение:

if (in_array('some-plugin', (array) get_option('active_plugins', array()))) {
       // ... сделать что-то
}
26 мар. 2025 г. 11:22:41