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


15

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

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


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

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

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

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

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

Ответы:


27

Это потому, что файл, в котором определена 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' );

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

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

10

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


Добавление include_once(ABSPATH.'wp-admin/includes/plugin.php');сделало трюк для меня. Благодарность!
Дейв

8

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

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

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


4

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

   }

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


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

Вы делаете это, чтобы убедиться, что плагин определен, прежде чем пытаться его использовать, иначе вы можете столкнуться с проблемами в будущем.
Спенсер Лабади

3

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

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

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

1

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

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


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

1

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

var_dump(get_option(...));

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

in_array(get_option(...));

Акция называется " active_plugins" IIRC.


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.