Как отключить плагин, активированный в сети, только для одного сайта?

29 окт. 2010 г., 16:11:17
Просмотры: 27.8K
Голосов: 24

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

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

  • Разместить плагин в /plugins, активировать его на каждом сайте индивидуально
  • Разместить плагин в /plugins, использовать 'network activate' для активации на всех сайтах
  • Разместить плагин в /mu-plugins, автоматически активируется на каждом сайте

Сейчас я экспериментирую с настройками и хочу активировать Akismet на всех сайтах кроме одного или двух. Я думал, что смогу активировать плагин в сети, а затем отключить его на отдельном сайте, но это оказалось невозможным - если я использую сетевую активацию, то есть только опция 'network deactivate' - которая отключает плагин на всех сайтах сразу.

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

0
Все ответы на вопрос 8
10
34

Вы можете использовать фильтр site_option_*.

Например, следующий код отключит Akismet на блоге с ID 2.

add_filter('site_option_active_sitewide_plugins', 'modify_sitewide_plugins');

function modify_sitewide_plugins($value) {
    global $current_blog;

    if( $current_blog->blog_id == 2 ) {
        unset($value['akismet/akismet.php']);
    }

    return $value;
}
29 окт. 2010 г. 18:35:05
Комментарии

+1 за предоставление чистого решения на уровне PHP, которое решает поставленную проблему без необходимости устанавливать дополнительные плагины — потому что я маниакальный чистюля и люблю Wordpress максимально чистым и без плагинов! :]

trejder trejder
12 нояб. 2012 г. 12:14:56

Вставил этот код в PHP-файл в mu-plugins, и он работает как мечта!

bgallagh3r bgallagh3r
4 дек. 2015 г. 14:02:04

Важно отметить, что это не будет работать в теме. Код должен выполниться раньше, поэтому mu-plugins — отличное место для него. Возможно, он заработает как плагин, но я бы рекомендовал использовать mu-plugins, если и это не сработает.

Jake Jake
7 янв. 2016 г. 06:22:49

Также этот фильтр выполняется ОЧЕНЬ часто, я бы проверил, установлен ли индекс в массиве перед его удалением. После первого раза он продолжит попытки работать с массивом, в котором этого элемента уже нет. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }

Jake Jake
7 янв. 2016 г. 06:24:13

По-прежнему отлично работает на версии 4.9.4.

Jake Jake
15 февр. 2018 г. 00:29:48

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

Jake Jake
20 февр. 2018 г. 07:41:59

Еще немного проб и ошибок. Если деактивировать на сайте с ID = 1, можно активировать их для всей сети, но в настройках сети они не будут отображаться как активированные. Однако на сайтах они должны работать. Сохранение настроек плагинов для всей сети может снова их деактивировать... Не уверен.

Jake Jake
20 февр. 2018 г. 08:10:07

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

Vincent Poirier Vincent Poirier
26 апр. 2020 г. 00:36:24

Хорошо работает с версией 5.4.1.

Feriman Feriman
2 июн. 2020 г. 00:06:15

Я добавил это в mu-плагины, но плагин вообще не активируется. Это всё ещё работает в 2023 году?

Demian Demian
8 мар. 2023 г. 19:04:53
Показать остальные 5 комментариев
1

Этот плагин: http://firestats.cc/wiki/WPMUPluginCommander

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

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

29 окт. 2010 г. 19:05:32
Комментарии

https://wordpress.org/plugins/plugin-commander/ - URL изменился. Хотя этот плагин не обновлялся уже несколько лет...

Jake Jake
7 янв. 2016 г. 06:38:13
1

Вот что сработало для меня, чтобы отключить плагин для одной конкретной темы в мультисайтовой/мультитемевой установке. Я добавил эти несколько строк в начало файла functions.php моей темы:

/**
 * Отключаем плагин fancybox для этой темы, он ломает javascript
 */
function deactivate_plugin_conditional() {
    if ( is_plugin_active('fancybox-for-wordpress/fancybox.php') ) {
        deactivate_plugins('fancybox-for-wordpress/fancybox.php');
    }
}
add_action( 'muplugins_loaded', 'deactivate_plugin_conditional' );
29 мая 2013 г. 22:26:58
Комментарии

Я почти уверен, что это будет работать только с mu-плагинами, что довольно ограничивает. Я бы сделал это на хуке init, как @GDR.

Jake Jake
7 янв. 2016 г. 06:35:06
0

Активные плагины хранятся в таблице wp_[blog_id]_options в поле 'active_plugins' и в таблице wp_[blog_id]_sitemeta в поле 'active_sitewide_plugins'. Это сериализованные поля, поэтому не редактируйте их, если не уверены в своих действиях.

Также обратите внимание на файл wp-admin\plugin.php. Можно написать плагин, который будет делать то, что вам нужно, используя объявленные там функции, такие как is_plugin_active() и activate_plugin().

Однако я предполагаю, что вы владеете PHP, что может быть не так.

29 окт. 2010 г. 17:22:13
4

Ответы от sorich87 и user33465 не сработали для меня в WordPress 4.3. Добавление этого кода в functions.php темы сработало:

function deactivate_plugin_conditional() {
    $deactivated_plugin_name = 'lazy-load/lazy-load.php';
    deactivate_plugins($deactivated_plugin_name, false, true);
}
add_action( 'init', 'deactivate_plugin_conditional' );
22 окт. 2015 г. 14:07:38
Комментарии

Я могу подтвердить, что ранее предложенные решения больше не работают, а решение от @gdr действительно работает.

User User
23 окт. 2015 г. 06:00:04

Я могу подтвердить, что решение @sorich87 отлично работает в версии 4.4.1. Видимо, вы используете его не так, как нужно, но оно всё ещё работает. Однако, скорее всего, оно будет работать только в mu-plugins и точно не в теме. Этот вариант будет работать в темах. Но учтите, что это принудительно деактивирует плагин, в отличие от решения @sorich87, которое просто прекращает его принудительное включение на сайте, но всё ещё позволяет использовать его в обычном режиме, если нужно. Мне больше нравится последнее, но оба варианта могут быть полезны.

Jake Jake
7 янв. 2016 г. 06:31:54

На самом деле, метод решения @sorich87 не работает, если ваш сайт - первый (ID: 1). В этом случае он не позволит вам активировать плагин для всей сети. С любым другим ID, похоже, всё работает.

Jake Jake
20 февр. 2018 г. 07:42:12

И этот метод делает для меня то же самое. Вы больше не сможете активировать плагин(ы) для всего сайта, если это находится в теме для сайта с ID = 1.

Jake Jake
20 февр. 2018 г. 07:54:29
0

Не из коробки в WP 3, но, думаю, возможно переопределить опцию с помощью фильтров option_*.

Также было бы здорово, если бы вы добавили это предложение как запрос на новую функциональность в core.trac.wordpress.org.

29 окт. 2010 г. 16:36:09
0

Лучший способ управления всеми плагинами в сети Multisite — это "Plugin Commander", который можно найти здесь: http://wordpress.org/extend/plugins/plugin-commander/

19 мар. 2011 г. 09:45:22
0
-1

Мне удалось отключить плагин, но он всё ещё отображался в панели основного сайта. Единственное решение, которое я нашёл для полного удаления его с основного сайта, — это проверить файл main.php плагина и отключить его в соответствии с этим кодом:

global $current_blog;

// Доступно только для сайта B
if( $current_blog->blog_id == 2 ) {


    define( 'AB_PATH', __DIR__ );

    include_once 'includes.php';

    // Загрузка функционала плагина

    AB_Plugin::registerHooks();

    is_admin() ? new AB_Backend() : new AB_Frontend();

}
4 февр. 2016 г. 12:31:43