is_plugin_active функція не існує


17

Я використовую WordPress 3.0.5 і пройшов тестування з 3.1rc4. У головному PHP-файлі мого плагіна, коли я намагаюся викликати is_plugin_active, я отримую Call to undefined function is_plugin_active(). Я можу зателефонувати на додавання і add_filter. Що потрібно перевірити / змінити, щоб виправити це?

Це відбувається всередині адміністратора на сторінці плагінів. У верхній частині мого основного файлу плагінів, if (function_exists('is_plugin_active')) {який завжди повертає помилку.

Я також не можу бачити функції з мого основного файла плагінів в інших плагінах (якщо це допомагає).


Я не впевнений у вашому описі - якщо це проблема з активованим плагіном чи ви намагаєтесь зробити щось під час активації чи за інших конкретних умов?
Рарст

Я виявив, що function_exists('is_plugin_active')це помилково, коли викликається з головного файла плагіна, якщо він знаходиться поза методом, але є істинним, коли викликається всередині методу, який викликається для 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
Phill Healey

Відповіді:


29

Це тому, що файл, у якому визначено 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 () на 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 () з активного входу в систему адміністратора, це, ймовірно, тому, що ви тестуєтесь до запуску адміністратора_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 / include / plugin.php.

Крім того, чи використовує ваш основний файл плагінів заголовок файлів Wordpress ? Чи додається ваш плагін після завантаження вищевказаного файла plugin.php?


Це відбувається всередині адміністратора на сторінці плагінів. Плагін має запропонований заголовок файлу WP. Як я можу перевірити, чи додається плагін після plugin.php?
Карл

1

Для налагодження активних плагінів:

var_dump(get_option(...));

Щоб перевірити наявність конкретного плагіна:

in_array(get_option(...));

Дія називається active_pluginsIIRC.


0

Жодне з цих рішень не працювало для мене, але це:

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

Я знайшов це рішення на codebangers.com

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.