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

Вопрос или проблема

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

Как я могу это сделать?

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

Этот код нужно установить как Must-Use Plugin.

<?php

/**
 * Имя плагина: Disable Sitewide Plugins
 * УРЛ плагина: https://wordpress.stackexchange.com/q/107732/19726
 * Автор: Shea Bunge
 * УРЛ автора: https://wordpress.stackexchange.com/users/19726/shea
 * Версия: 0.1
 */

global $blog_id;

if ( in_array( $blog_id, array( 6, 9, 42 ) ) {
    add_filter( 'pre_site_option_active_sitewide_plugins', '__return_empty_array' );
}

Не забудьте заменить array( 6, 9, 42 ) на массив с ID блогов, на которых вы хотите отключить сетевые плагины.

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

add_action('admin_init', function(){
    $blogs_to_hide_plugins = [2, 42];

    /* Не выполняем, если это не нужные блоги */
    $blog_id = get_current_blog_id();
    if ( !in_array($blog_id, $blogs_to_hide_plugins) ) return;

    /* Не выполняем этот код на /network/plugins.php */
    if ( is_network_admin() ) return; 

    add_filter( 'all_plugins', function ($plugins){
        foreach ( $plugins as $key => $plug ) {
            if ( is_plugin_active_for_network($key) || is_network_only_plugin($key) ) {
                unset($plugins[$key]);
            }
        }
        return $plugins;
    }); 
});

.

Ответ или решение

В контексте управления сетью WordPress Multisite часто возникает потребность в управлении плагинами, которые активируются на уровне всей сети. Если мы хотим отключить некоторые из этих сетевых плагинов на определённых сайтах, это можно сделать с помощью некоторых разработок и обходных путей. Рассмотрим более подробно, как можно достичь данной задачи, используя подход TEA (Теория, Пример, Применение).

Теория:

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

WordPress хранит информацию об активированных сетевых плагинах в опции active_sitewide_plugins. Это значит, что при необходимости мы можем изменять её посредством PHP кода, чтобы подставлять пустой массив на сайтах, для которых хотим отключить данные плагины.

Пример:

В предлагаемых выше кодах указаны два подхода для данного решения. Первый кодовый фрагмент предполагает создание Must-Use Plugin для управления сетевыми плагинами на выбранных сайтах:

<?php

/**
 * Plugin Name: Disable Sitewide Plugins
 * Plugin URI: https://wordpress.stackexchange.com/q/107732/19726
 * Author: Shea Bunge
 * Author URI: https://wordpress.stackexchange.com/users/19726/shea
 * Version: 0.1
 */

global $blog_id;

if ( in_array( $blog_id, array( 6, 9, 42 ) ) ) {
    add_filter( 'pre_site_option_active_sitewide_plugins', '__return_empty_array' );
}

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

Второй подход, как видно во втором кодовом фрагменте, использует фильтрацию на уровне админки:

add_action('admin_init', function(){
    $blogs_to_hide_plugins = [2, 42];

    /* Не выполянть код, если текущий блог не входит в список */
    $blog_id = get_current_blog_id();
    if ( !in_array($blog_id, $blogs_to_hide_plugins) ) return;

    /* Не выполянть код на странице /network/plugins.php */
    if ( is_network_admin() ) return; 

    add_filter( 'all_plugins', function ($plugins){
        foreach ( $plugins as $key => $plug ) {
            if ( is_plugin_active_for_network($key) || is_network_only_plugin($key) ) {
                unset($plugins[$key]);
            }
        }
        return $plugins;
    }); 
});

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

Применение:

Применить вышеописанные решения можно следующими шагами:

  1. Создайте Must-Use Plugin: Создайте на сервере директорию wp-content/mu-plugins/ (если она ещё не существует), и поместите туда файл с содержанием первого кода. В результате он будет выполняться для всех сайтов сети. Не забудьте адаптировать массив ID сайтов к вашему окружению.

  2. Интеграция через Network Snippets: Если вы используете плагин для управления кодом (например, Snippets), добавьте второй фрагмент кода в настройки плагина и примените его для сети.

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

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

Оцените материал
Добавить комментарий

Капча загружается...