WordPress как на ладони
wordpress jino

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

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

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

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

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

1
Гость 1.1 года назад
  • 0
    Kama4558

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

    ## Отключает подключение указанных плагинов во фронте и при аякс запросах
    add_filter('option_active_plugins', 'hard_disable_plugins_on_front');
    // плагины активированные для сети
    // add_filter( 'site_option_active_sitewide_plugins', 'hb_hard_disable_plugins_on_front' );
    
    /**
     * Удаляет указанные плагины из массива.
     * Плагины указываются внутри функции.
     * Указывать нужно массив с названиями папок плагинов, которые нужно удалить из массива активных плагинов
     *
     * @param  array $active_plugins Массив активных плагинов
     * @return array Массив активных плагинов
     *
     * ver: 0.1
     */
    function hard_disable_plugins_on_front( $active_plugins ){
    	// ничего не делаем - это админка, но не аякс запрос
    	if( is_admin() && ! defined('DOING_AJAX') )
    		return $active_plugins;
    
    	// ничего не делаем - аякс запрос из админки...
    	if( defined('DOING_AJAX') && strpos($_SERVER['HTTP_REFERER'], '/wp-admin/')  )
    		return $active_plugins;
    
    	// плагины, которые нужно деактивировать. Указываем название папки плагина
    	$disable_plugins = array(
    		'taxonomy-terms-order',
    		'right-now-reloaded',
    		'cms-tree-page-view',
    		'webmaster-yandex',
    	);
    
    	// удобный массив
    	$_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 файл, пусть будет hard_disable_plugins.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') )
    		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;
    }
    вадик 1.1 года назад

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

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