Intereting Posts
wpdb-> не добавлять префикс в пользовательскую таблицу Загрузка страницы с задержкой Получение метаданных в том же запросе, что и основной цикл WordPress Добавить нового пользователя – отправить электронную почту активации Wp_update_post: бесконечный цикл даже с решением remove_action, OOP Почему моя родительская страница перенаправляется на дочернюю страницу, но не первая Невозможно выбрать правильного автора Показывать отдельные сообщения, на странице сообщений Индивидуальные постоянные константы типа сообщения не ведут себя так, как ожидалось, для родительских / дочерних страниц Создание пакетов сайтов WordPress MultiSite Дополнительно: понимание функции wp_add_inline_style Подключение к walker_nav_menu_start_el для вставки списка подстраниц Самый эффективный метод? Исключить категорию и количество сообщений на страницу как создать добавочные обмены в окне редактирования сообщений WordPress? WP custom menus error> имя меню уже существует?

Деактивировать плагин при отключении другого плагина

Хотите узнать, можно ли отключить плагин в коде дезактивации другого плагина?

IE. У меня есть виджет, который я добавляю через свой собственный плагин, который не будет работать, если плагин «master» не активирован …

Да, зарегистрируйте крючок дезактивации в вашем первом плагине, и внутри этого крючка отключите второй плагин, используя deactivate_plugins()

Примечание: после написания этого, я отправил билет на трафик, только чтобы сообщить, что он уже существует .

Ответ @OneTrickPony не работал, и после проверки источника (в частности deactivate_plugins() ) я нашел, почему:

Предположим, что B зависит от A, а A отключается пользователем. WordPress вызывает deactivate_plugins(A) .

Эта функция выполняет следующие действия:

  1. Получает все текущие активные плагины.]
  2. Выполняет некоторые проверки (например, активен ли плагин A?)
  3. Удаляет A из этого массива
  4. Запускает hook deactivate_A (который мы используем register_deactivation_hook )
  5. Обновляет массив в базе данных.

Теперь на шаге 4 мы вызываем deactivate_plugins(B) для деактивации. Тот же процесс происходит снова и завершается – все в порядке. Но как только это будет завершено, переходим к шагу 5 (в исходном вызове deactivate_plugins() для A). Массив обновляется до базы данных, но этот массив был очень оригинальным, полученным на шаге 1 и удаленным только A. В частности, мы получили его в начале, когда B все еще был активным, и поэтому он содержит B.

Примечание: ваши обратные вызовы дезактивации запускаются, даже через WordPress все еще думает, что он активен в следующий раз, когда загружается страница.

Решение

Решение заключается в использовании более позднего крючка (после обновления опции). Для этого мы можем воспользоваться update_option_{$option} :

 //This goes inside Plugin A. //When A is deactivated. Deactivate B. register_deactivation_hook(__FILE__,'my_plugin_A_deactivate'); function my_plugin_A_deactivate(){ $dependent = 'B/B.php'; if( is_plugin_active($dependent) ){ add_action('update_option_active_plugins', 'my_deactivate_dependent_B'); } } function my_deactivate_dependent_B(){ $dependent = 'B/B.php'; deactivate_plugins($dependent); }