Як відключити мережевий плагін для одного сайту?


22

Я зараз налаштовую (потенційно) велику багатосайтову мережу, і я прагну зробити якомога простішим зараз додавання та налаштування сайтів за потреби. Зараз я перебуваю на фазі, де я маю справу з плагінами.

З мультисайтом мені відомо кілька різних способів активації плагінів

  • Поставте плагін /plugins, активуйте його на кожному сайті наочно
  • Поставте плагін /plugins, використовуйте "активація мережі", щоб активувати його на всіх сайтах
  • Поставте плагін /mu-plugins, який автоматично активується на кожному сайті

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

Чи є спосіб активувати зручну функціональність мережі, але все ж мати зручність відключення плагінів на веб-сайті?

Відповіді:


31

Можна використовувати фільтр 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;
}

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

1
Видалений цей код у файл PHP у mu-pluginsі працює як мрія!
bgallagh3r

Приємно зазначити, що це не справді спрацює в темі. Його потрібно запустити швидше, тому mu-плагіни - чудове місце для цього. Він може працювати як плагін, але я б знімав му-плагіни, якщо і це не працює.
Джейк

1
Крім того, цей фільтр запускається ЛОТ, я би перевірив, чи встановлений індекс в масиві перед його відміною. Після першого разу він продовжить приміряти масив, де цього елемента не існує. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Джейк

1
Це все ще чудово працює на 4.9.4.
Джейк

3

Цей плагін: http://firestats.cc/wiki/WPMUPluginCommander

обходить матеріали активації мережі та робить своє. і дозволяє вимкнути плагін на сайті за сайтом.

Оновлення. Схоже, цей плагін розбиває плагін тегів на сайті, тому будьте обережні, перш ніж спробувати виробничу мережу.


wordpress.org/plugins/plugin-commander - URL-адресу змінено. Хоча в цей момент цей плагін не оновлювався протягом багатьох років ...
Джейк

3

Ось що для мене працювало, щоб вимкнути плагін для однієї конкретної теми під час встановлення багатосайтів / мультитемів. Я додав ці кілька рядків у верхній частині файлу function.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' );

Я впевнений, що це працюватиме лише на mu-плагінах, що досить обмежує. Я б робив це на initкшталт @GDR.
Джейк

2

Активні плагіни зберігаються у wp_ [blog_id] _options у полі 'active_plugins' та 'active_sitewide_plugins' у wp_ [blog_id] _sitemeta. Це серіалізовані поля, тому не редагуйте їх, якщо ви не знаєте, що робите.

Погляньте також на wp-admin \ plugin.php. Слід створити плагін, який буде робити те, що ви хочете, використовуючи задекларовані там функції, наприклад is_plugin_active () та activate_plugin ().

Однак я припускаю, що ви знаєте PHP, що може бути не так.


2

Відповіді sorich87 та user33465 не працювали для мене з Wordpress 4.3. Додаючи це до тематичних функцій .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();

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.