Отключение плагина / действия плагина через тему

15 мар. 2011 г., 23:36:26
Просмотры: 42.5K
Голосов: 27

Я установил плагин Google Analyticator на свой сайт. Я также использую плагин MobilePress для отображения темы, предназначенной для мобильных браузеров не-смартфонов. Я настроил Google Analytics для мобильных устройств для использования в этой теме и хотел бы отключить плагин Analyticator, так как он включает вызов более объемного js файла.

Кто-нибудь знает, возможно ли отключить плагин используя functions.php или каким-либо другим методом?

Я нашел код, который добавляет функции на страницу, поэтому если невозможно отключить весь плагин целиком, возможно ли остановить выполнение действий? Я пытался отключить их напрямую, но безуспешно. Вот код из файла плагина:

// Добавляем действия Google Analytics
add_action('wp_head', 'add_google_analytics', 999999);
add_action('init', 'ga_outgoing_links');

Я пытался удалить эти действия следующим образом:

// Удаляем действия Google Analytics
remove_action('wp_head','add_google_analytics',9999999);
remove_action('init', 'ga_outgoing_links');

Буду признателен за любую помощь.

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

На мой взгляд, технически это должно работать, так что проблема в вашем времени выполнения этого кода (слишком рано или слишком поздно). Пожалуйста, предоставьте больше информации.

Rarst Rarst
15 мар. 2011 г. 23:49:36

Да, я тоже думал, что это сработает. У меня не так много опыта с add/remove actions, поэтому я не был уверен, как дальше отлаживать. Хотя ответ EAMann сработал, какую именно информацию вы хотели бы получить?

PNMG PNMG
16 мар. 2011 г. 00:29:23

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

Rarst Rarst
16 мар. 2011 г. 00:33:02

У меня есть обычная тема, которая установлена в WordPress для обычных десктопных браузеров. Для этой темы я хочу использовать плагин GA. Плагин Mobilepress использует PHP для получения строки user-agent и загружает другую тему для смартфонов или обычных телефонов. Я хотел использовать файл functions.php для темы обычных телефонов, чтобы отключить добавление JS в <head> плагином GA только для этой темы. Он должен оставаться включенным для двух других тем (десктоп и смартфон). Помогает ли это прояснить ситуацию?

PNMG PNMG
16 мар. 2011 г. 01:42:32

Да, я так и думал. Но деактивация просто отключит плагин на постоянной основе, и он останется выключенным, пока не будет явно активирован. Я не вижу, чтобы это подходило под ваш сценарий.

Rarst Rarst
16 мар. 2011 г. 02:09:05

Ах да! Вы правы. Был конец дня, и я увидел, что код удалил его из темы, из которой хотел, но не проверил другие. Он просто деактивировал плагин для всего. Значит, ответ ниже не то, что я искал. Спасибо, что помогли это понять! Как вы думаете, стоит ли продолжить с кодом remove_action? Похоже, что просто отключить плагин для одной темы невозможно.

PNMG PNMG
16 мар. 2011 г. 03:15:38

Да, удаления должны работать правильно. В какой именно момент и как вы вызываете функции remove?

Rarst Rarst
16 мар. 2011 г. 10:31:24

Я разместил remove_action в конце файла functions.php темы. Я разместил их отдельно, как указано в вопросе, а также пробовал поместить их в add_action: add_action('wp_head','my_remove_ga'); function my_remove_ga() { remove_action('wp_head','add_google_analytics'); remove_action('init', 'ga_outgoing_links'); } Также я пробовал использовать var_dump() для remove_action: var_dump(remove_action('wp_head','add_google_analytics')); и он возвращает bool(false), что согласно кодексу означает "Функция не может быть удалена".

PNMG PNMG
16 мар. 2011 г. 14:21:31

Я также пробовал закомментировать исходные add_actions в плагине и добавить их в functions.php своей темы, а затем использовать remove_actions сразу после этого. Это тоже не сработало.

PNMG PNMG
16 мар. 2011 г. 14:29:01
Показать остальные 4 комментариев
Все ответы на вопрос 4
3
35

Когда WordPress активирует плагин, он вызывает функцию activate_plugin(). Эта функция активирует плагин в "песочнице" и перенаправляет пользователя в другое место при успешной активации. Некоторые разработчики используют её для программного включения зависимостей плагинов.

Существует другая функция — deactivate_plugins(), которая делает обратное действие... Именно она отвечает за деактивацию плагинов, когда вы нажимаете "Деактивировать" или "Отключить" в админке WordPress.

Чтобы деактивировать установленный плагин, просто вызовите:

deactivate_plugins( '/plugin-folder/plugin-name.php' );

Или, чтобы отключить несколько плагинов одновременно:

deactivate_plugins( array( '/first-plugin/first.php', '/second-plugin/second.php' ) );

Второй параметр (первый — это строка или массив плагинов для отключения) позволяет деактивировать плагины без вызова хуков деактивации. По умолчанию он установлен в false, и я рекомендую оставить его таким. Но если вам нужно обойти стандартную деактивацию, используйте:

deactivate_plugins( '/plugin-folder/plugin-name.php', true );

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

15 мар. 2011 г. 23:53:35
Комментарии

Отличный ответ — и не только в сравнении с другим, скажем так, не самым впечатляющим ответом типа «вот вам сайт», который может быть где-то рядом.

editor editor
15 мар. 2011 г. 23:59:06

Этот код, размещённый в functions.php, деактивирует плагин в админке, тем самым отключая его для двух других тем. Спасибо Rarst за это уточнение. Я хотел отключить его только для той темы, в которой находился файл functions.php.

PNMG PNMG
16 мар. 2011 г. 03:19:21

В любой момент времени на сайте используется только одна тема... но если вы хотите снова активировать плагин после деактивации темы, это тоже возможно.

EAMann EAMann
21 мар. 2011 г. 16:35:40
1
14

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

Мне нужно было решение, чтобы убедиться, что пользователи деактивируют мой плагин, если они загружают премиум-версию (чтобы избежать потенциальных конфликтов). Ранее я определял его состояние с помощью is_plugin_active и показывал сообщение об ошибке в админке, чтобы побудить пользователей его отключить. Этот способ ГОРАЗдо плавнее...

function deactivate_plugin_conditional() {
    if ( is_plugin_active('plugin-folder/plugin-name.php') ) {
    deactivate_plugins('plugin-folder/plugin-name.php');    
    }
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );

Примечание: Не сработало на register_activation_hook, но admin_init работает просто отлично.

20 мар. 2012 г. 14:24:27
Комментарии

Отмечу, что я почти уверен, что is_plugin_active уже проверяется в хуке deactivate_plugins, поэтому нет необходимости делать это снова

Bryan Willis Bryan Willis
11 сент. 2014 г. 07:24:37
0

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

/*
 * Plugin Name: Отключение/Настройка Плагинов
 * Description: Позволяет отключать/настраивать плагины на основе переменных окружения
 * Author:      Chris Sewell
 */

/**
 * Отключает указанные плагины в среде разработки.
 * 
 * Это "Must-Use" плагин. Код здесь загружается автоматически перед загрузкой обычных плагинов.
 * Это единственное место, откуда обычные плагины можно отключить программно.
 * 
 * Разместите этот код в файле в WP_CONTENT_DIR/mu-plugins или укажите кастомное расположение
 * для "development" или "production" на каждом сервере/среде.
 */

/* Отключает указанные плагины в среде разработки */
if (((getenv('environment') == 'production') || (getenv('environment') == 'alpha')) == false) {
    $plugins = array(
        'w3-total-cache/w3-total-cache.php'
    );
    require_once(ABSPATH . 'wp-admin/includes/plugin.php');
    deactivate_plugins($plugins);
}

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

Источник

26 сент. 2017 г. 12:48:06
0

Если вам нужно временно отключить плагин при выполнении определённого условия, не деактивируя его полностью для всех пользователей (как это делает deactivate_plugins()), используйте фильтр option_active_plugins в плагине из папки mu-plugins, как показано в примере ниже:

# файл: wp-content/mu-plugins/disable-plugins.php

add_filter( 'option_active_plugins', function( $plugins ){
    if ( $my_condition ) {
        $plugins= array_diff($plugins, array('plugin_to_rm_1.php', 'plugin_to_rm_2.php'));    
    }
    return $plugins;
});
20 дек. 2023 г. 15:35:01