Поддержка Проблемы и решения Call to undefined function deactivate_plugins()

  • Решено icopydoc

    (@icopydoc)


    У меня есть два плагина. Один зависит от другого. Потому хочу сделать так, что если юзер деактивирует один плагин — деактивировался бы и другой.
    Трабла такая
    Fatal error: Uncaught Error: Call to undefined function deactivate_plugins()

    Код:

    register_activation_hook(__FILE__, array('ZZZ', 'on_activation'));
    register_deactivation_hook(__FILE__, array('ZZZ', 'on_deactivation'));
    register_uninstall_hook(__FILE__, array('ZZZ', 'on_uninstall'));
    add_action('plugins_loaded', array('ZZZ', 'init'), 15);
    class ZZZ {
     protected static $instance;
     public static function init() {
    	is_null( self::$instance ) AND self::$instance = new self;
    	return self::$instance;
     }
    	
     public function __construct() {
     if (!class_exists('YYY')) {
    	deactivate_plugins(plugin_basename( __FILE__ ));
    ...
    }
    }

    Вот собственно строка deactivate_plugins(plugin_basename( __FILE__ )); и вызывает ошибку Fatal error: Uncaught Error: Call to undefined function deactivate_plugins()

    Как так? Это же впшная функция блин. Где я ошибся?)

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • https://wp-kama.ru/function/deactivate_plugins

    Работает в админ-панели, если нужно во фронте, то подключите файл:

    а я обычно пишу человечно после активации плагина — «Для работы нужно активировать такой-то плагин». И на странице настройки плагина также. А сами настройки не вывожу. Тогда юзер не будет думать «да что за фигня какая-то не активируется. Глюкавое *вно!».
    — Это более честно к пользователю и наглядно. UX

    А так как вы: выкинет он плагин и к вашим продуктам сроду не будет возвращаться

    «Для работы нужно активировать такой-то плагин»

    Вопрос-то про деактивацию.
    Недавно клиент деактивировал бесплатный плагин ТСа, а премиальный оставил активным. А они связаны.
    Сайт лег, белый экран, админка недоступна. Я по ftp восстанавливала.

    Вот-вот. @kw56 всё верно подметила. Вопрос про деактивацию и ситуацию, что она описала. С активацией вообще проблем нет. Там на
    register_activation_hook(__FILE__, array(‘ZZZ’, ‘on_activation’));
    проверку засунуть и всё.

    В целом, я вроде-бы нашел промежутночный вариант.
    Внутри __construct():

    public function __construct() {
    ....
    if (!class_exists('YYY)) {
    	add_action( 'admin_init', 'action_deactivate_plugins' );
    	function action_deactivate_plugins(){
    		deactivate_plugins(plugin_basename( __FILE__ ));
    		wp_die(
    			__('123', 'yfymae'),
    			__(123', 'yfymae'),
    			array('back_link' => true)
    		);		
    	}	
    	return;
    }
    ...

    сейчас тестирую. Но если есть какие-то другие идеи — обязательно рассмотрю…

    • Ответ изменён 2 недели назад пользователем icopydoc.

    Сайт лег

    🙂 ой кодеры. А что вам мешает в основном файле «зависимого» проверить наличие нужного плагина по константе, по наличию функции или класса и уже по успеху подключить файл или класс?

    Я по ftp восстанавливала

    kword — ты девчонка?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как так? Это же впшная функция блин. Где я ошибся?)

    Функция объявлена в файле wp-admin/includes/plugin.php и доступна только в админке, а действие plugins_loaded выполняется и на внешней части сайта.

    Нужно либо добавить проверку на существование функции, либо подключить файл. Вариант с admin_init тоже подойдёт.

    Спасибо всем. В общем сделал через admin_init.

Просмотр 6 ответов — с 1 по 6 (всего 6)