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


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

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

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

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

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

 23
Author: nobody, 2010-10-29

8 answers

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

Например, следующее отключит akismet в блоге с идентификатором 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;
}
 32
Author: sorich87, 2010-10-29 15:35:05

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

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

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

 3
Author: andrea_r, 2011-05-25 06:58:33

Вот что помогло мне отключить плагин для одной конкретной темы при установке с несколькими сайтами/несколькими темами. Я добавил эти несколько строк в верхней части 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' );
 3
Author: user33465, 2013-05-29 19:26:58

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

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

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

 2
Author: codecowboy, 2010-10-29 14:22:13

Ответы от sorich87 и пользователя 33465 не сработали для меня с 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' );
 2
Author: GDR, 2015-10-22 11:07:38

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

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

 0
Author: Denis de Bernardy, 2010-10-29 13:36:09

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

 0
Author: , 2011-03-19 07:45:22

Мне удалось отключить плагин, но он все еще был на главной панели сайта. Единственное решение, которое я нашел, чтобы полностью удалить его с основного сайта, состояло в том, чтобы проверить 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();

}
 -1
Author: NetOholik, 2016-02-04 12:49:17