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

22

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

С мультисайтом я знаю несколько разных способов активировать плагины

  • Вставьте плагин /plugins, активируйте его на каждом сайте индивидуально
  • Вставьте плагин /plugins, используйте «активация сети», чтобы активировать его на всех сайтах
  • Вставьте плагин /mu-plugins, автоматически активируется на каждом сайте

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

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

никто
источник

Ответы:

31

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

Например, следующее отключит учетную запись в блоге с идентификатором 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;
}
sorich87
источник
1
+1 за чистое решение на уровне PHP, которое решает проблему без необходимости устанавливать дополнительный плагин - потому что я маньяк чистоты и люблю Wordpress как можно более чистым и без плагинов! :]
Трейдер
1
Бросил этот код в файл PHP mu-pluginsи работает как сон!
bgallagh3r
Приятно отметить, что это не будет действительно работать в теме. Его нужно запускать раньше, поэтому mu-plugins - отличное место для этого. Он может работать как плагин, но я бы выбрал mu-плагины, если это тоже не работает.
Джейк
1
Кроме того, этот фильтр запускается LOT, я бы проверил, установлен ли индекс в массиве перед его сбросом. После первого раза он продолжит примерять массив, в котором этот элемент не существует. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Джейк
1
Это все еще отлично работает на 4.9.4.
Джейк
3

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

обходит сеть активации вещи и делает свое. и позволяет отключить плагин для сайта на основе сайта.

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

andrea_r
источник
wordpress.org/plugins/plugin-commander - URL изменен. Хотя этот плагин не обновлялся годами на данный момент ...
Джейк
3

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

/**
 * Disable fancybox plugin for this theme, it breaks 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' );
user33465
источник
Я уверен, что это будет работать только на mu-плагинах, что довольно ограничивает. Я бы сделал это на init@GDR.
Джейк
2

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

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

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

codecowboy
источник
2

Ответы от 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' );
ГДР
источник
Я могу подтвердить, что ранее одобренные решения больше не работают и что решение @gdr действительно работает.
Я могу подтвердить, что решение @ sorich87 прекрасно работает в 4.4.1. Вы, ребята, не используете его таким образом, который, очевидно, работает, но все же работает. Однако, это, вероятно, может работать только в mu-плагинах и определенно не в теме. Эта опция будет работать в темах. Но обратите внимание, что это принудительно отключает плагин по сравнению с sorich87, который просто прекращает принудительное использование его на сайте, но, тем не менее, позволяет использовать его как обычно. Я предпочитаю последнее, но они оба могут быть полезны.
Джейк
На самом деле. Метод решения @ sorich87 не работает, если ваш сайт является первым (ID: 1). Если это так, он не позволит вам активировать плагин по сети. Любой другой идентификатор, кажется, работает.
Джейк
И этот метод делает то же самое для меня. Вы больше не можете активировать плагин (ы) по всему сайту, если это в теме для сайта с ID = 1.
Джейк,
0

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

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

Дени де Бернарди
источник
-1

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

global $current_blog;

// Only available to B
if( $current_blog->blog_id == 2 ) {


    define( 'AB_PATH', __DIR__ );

    include_once 'includes.php';

    //  plugin loaded stuff

    AB_Plugin::registerHooks();

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

}
NetOholik
источник