WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Самая быстрая Тема-конструктор для WordPress

Как отключить некоторые плагины во front-end?

Есть интересный плагин Plugin Organizer, который позволяет выборочно отключить необходимые плагины на сайте. тоесть плагин в админке продолжит выполнять свои функции (например выводить поля или еще чтонибудь что нужно только в админке), во front-end он подгружаться не будет.

Есть ли способ обойтись парой строчкой кода в файле function.php для этого?

За некоторыми плагинами помониторил через плагин Query Monitor, он выдал какие события срабатывают во время генерации страницы, а затем эти события отключил с помощью remove_action

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

1
Гость
4.1 года назад
  • 0
    Kama7871

    Это можно сделать прицепившись на хук: option_active_plugins. Вот готовый код для этого. Других хуков, чтобы это сделать я не нашел...

    # Отключает подключение указанных плагинов во фронте и при аякс запросах
    add_filter( 'option_active_plugins', 'hard_disable_plugins_on_front' );
    // плагины активированные для сети
    // add_filter( 'site_option_active_sitewide_plugins', 'hard_disable_plugins_on_front' );
    
    /**
     * Удаляет указанные плагины из массива.
     *
     * Функцию исползуется на хуке `option_active_plugins` или `site_option_active_sitewide_plugins`.
     * Плагины указываются внутри функции. Указывать нужно массив с названиями папок плагинов,
     * которые нужно удалить из массива активных плагинов.
     *
     * @param  array $active_plugins Массив активных плагинов.
     *
     * @return array Массив активных плагинов.
     * @version 0.3
     * @author Kama (wp-kama.ru)
     *
     */
    function hard_disable_plugins_on_front( $active_plugins ){
    
    	// ничего не делаем
    	if( 
    		// front (но не аякс)
    		( is_admin() && ! defined('DOING_AJAX') ) || 
    		// wp cli
    		defined('WP_CLI') ||
    		// аякс запрос из админки
    		( defined('DOING_AJAX') && strpos($_SERVER['HTTP_REFERER'], '/wp-admin/') )
    	)
    		return $active_plugins;
    
    	// названия папок плагинов, которые нужно отключить
    	$disable_plugins = [
    		'meta-box',
    		'redis-cache',
    		'tiny-compress-images',
    	];
    
    	// удобный массив
    	$_plugins = $active_plugins;
    	foreach( $_plugins as & $plugin ){
    		list( $folder_name, $main_file ) = explode( '/', $plugin );
    		$plugin = $folder_name;
    	}
    	$_plugins = array_flip( $_plugins );
    
    	// деактивируем
    	foreach( $disable_plugins as $folder_name )
    		if( isset( $_plugins[ $folder_name ] ) )
    			unset( $active_plugins[ $_plugins[ $folder_name ] ] );
    
    	return $active_plugins;
    }

    Важно: код нужно вставлять до того как плагины начнут подключаться! Это можно сделать только создав MU плагин, т.е. делаешь так:

    1. В папке wp-content, создаешь, если её там нет, папку mu-plugins.
    2. В созданной папке mu-plugins создаешь любой php файл, пусть будет disable-plugins-on-front.php и копируешь этот код в этот файл.
    3. Готово! указанные в коде плагины не будут загружаться во фронте...

    П.С. Глянул в код Plugin Organizer - неплохой вроде плаг. Но там чет много настроек, таблицы в БД создает зачем-то, в общем, навороченный он какой-то...

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

    И аналогичный код только для деактивации плагинов установленных для всех сайтов сети:

    // отключает подключение указанных плагинов во фронте и при аякс запросах. Для мультисети
    add_filter( 'site_option_active_sitewide_plugins', 'sitewide_hard_disable_plugins_on_front' );
    function sitewide_hard_disable_plugins_on_front( $active_plugins ){
    
    	// ничего не делаем для: админка (но не аякс запрос)
    	if( ( is_admin() && ! defined('DOING_AJAX') ) || defined('WP_CLI') )
    		return $active_plugins;
    
    	// ничего не делаем - аякс запрос из админки...
    	if( defined('DOING_AJAX') && strpos($_SERVER['HTTP_REFERER'], '/wp-admin/')  )
    		return $active_plugins;
    
    	// плагины, которые нужно деактивировать. Указываем название папки плагина
    	$disable_plugins = array(
    		'loco-translate',
    	);
    
    	foreach( $active_plugins as $plugin => $time ){
    		list( $folder_name, $main_file ) = explode( '/', $plugin );
    		if( in_array( $folder_name, $disable_plugins ) )
    			unset( $active_plugins[ $plugin ] );
    	}
    
    	return $active_plugins;
    }
    вадик 4.1 года назад

    надо же, как все оказалось элегантно и просто! круто! спасибо большое!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация