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

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

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

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

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

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

1
Гость
5.8 лет назад
  • 0
    Kama8765

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

    Kama_Hard_Disable_Plugins_On_Front::init();
    
    /**
     * Disables the connection of the specified plugins at the front and ajax requests.
     *
     * @version 0.8
     * @author  Kama (wp-kama.ru)
     */
    abstract class Kama_Hard_Disable_Plugins_On_Front {
    
    	protected static array $disable_foldernames = [];
    
    	/**
    	 * Gets currently disabled plugins slugs (folder names) list.
    	 *
    	 * @return array
    	 */
    	public static function get_disabled(): array {
    		return self::$disable_foldernames;
    	}
    
    	/**
    	 *
    	 * @param array $plugins_names  List of plugins you want to deactivate on front.
    	 *                              Specify plugin`s folder name.
    	 */
    	public static function init( array $plugins_names ): void {
    
    		/**
    		 * Allows you to filter plugins slugs (folder names) that will be disabled.
    		 *
    		 * @param string[] $plugins_names Array of folder names.
    		 */
    		self::$disable_foldernames = apply_filters( 'hard_disable_plugins__filter_names', $plugins_names );
    
    		if( ! self::get_disabled() ){
    			return;
    		}
    
    		is_multisite()
    			// for multisite
    			? add_filter( 'site_option_active_sitewide_plugins', [ __CLASS__, 'disable' ] )
    			// for regular instalation
    			: add_filter( 'option_active_plugins', [ __CLASS__, 'disable' ] );
    	}
    
    	/**
    	 * Deletes the specified plug-ins from the array.
    	 *
    	 * The function is used on the hook `option_active_plugins` or `site_option_active_sitewide_plugins`.
    	 * The plugins are specified inside the function.
    	 * You must specify an array with the names of the folders of the plugins,
    	 * which you want to remove from the array of active plugins.
    	 *
    	 * @param array $active_plugins  Array of active plugins.
    	 *
    	 * @return array array of active plugins.
    	 */
    	public static function disable( array $active_plugins ): array{
    
    		// skip
    		if(
    			// wp cli
    			defined( 'WP_CLI' ) ||
    			// front (but not ajax)
    			( is_admin() && ! defined( 'DOING_AJAX' ) ) ||
    			// ajax request from admin-panel
    			( defined( 'DOING_AJAX' ) && strpos( $_SERVER['HTTP_REFERER'], '/wp-admin/' ) )
    		){
    			return $active_plugins;
    		}
    
    		// handy array
    		$_plugins = $active_plugins;
    		foreach( $_plugins as & $plugin ){
    			[ $folder_name, $main_file ] = explode( '/', $plugin );
    			$plugin = $folder_name;
    		}
    		unset( $plugin );
    		$_plugins = array_flip( $_plugins );
    
    		// deactivate
    		foreach( self::get_disabled() 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;
    }
    вадик 5.8 лет назад

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

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