156 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Sphere\Debloat\Integrations;
 | 
						|
 | 
						|
use Sphere\Debloat\Plugin;
 | 
						|
 | 
						|
/**
 | 
						|
 * Rules specific to Elementor plugin.
 | 
						|
 */
 | 
						|
class Elementor 
 | 
						|
{
 | 
						|
	public $allow_selectors;
 | 
						|
	
 | 
						|
	public function __construct()
 | 
						|
	{
 | 
						|
		$this->register_hooks();
 | 
						|
	}
 | 
						|
 | 
						|
	public function register_hooks()
 | 
						|
	{
 | 
						|
		add_action('wp', [$this, 'setup']);
 | 
						|
	}
 | 
						|
 | 
						|
	public function setup()
 | 
						|
	{
 | 
						|
		if (in_array('elementor', Plugin::options()->integrations_css)) {
 | 
						|
			$this->setup_remove_css();
 | 
						|
		}
 | 
						|
 | 
						|
		if (in_array('elementor', Plugin::options()->integrations_js)) {
 | 
						|
			$this->setup_delay_js();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Special rules related to remove css when Elementor is active.
 | 
						|
	 *
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function setup_remove_css()
 | 
						|
	{
 | 
						|
		// Add all Elementor frontend files for CSS processing.
 | 
						|
		add_filter('debloat/remove_css_includes', function($include) {
 | 
						|
 | 
						|
			$include[] = 'id:elementor-frontend-css';
 | 
						|
			$include[] = 'id:elementor-pro-css';
 | 
						|
			// $include[] = 'elementor/*font-awesome';
 | 
						|
			return $include;
 | 
						|
		});
 | 
						|
 | 
						|
		add_filter('debloat/remove_css_excludes', function($exclude, \Sphere\Debloat\RemoveCss $remove_css) {
 | 
						|
 | 
						|
			// Don't bother with animations CSS file as it won't remove much.
 | 
						|
			if (!empty($remove_css->used_markup['classes']['elementor-invisible'])) {
 | 
						|
				$exclude[] = 'id:elementor-animations';
 | 
						|
			}
 | 
						|
 | 
						|
			return $exclude;
 | 
						|
		}, 10, 2);
 | 
						|
 | 
						|
		/**
 | 
						|
		 * Elementor selectors extras.
 | 
						|
		 */
 | 
						|
		$this->allow_selectors = [
 | 
						|
			[
 | 
						|
				'type'   => 'any',
 | 
						|
				'sheet'  => 'id:elementor-',
 | 
						|
				'search' => [
 | 
						|
					'*.e--ua-*',
 | 
						|
					'.elementor-loading',
 | 
						|
					'.elementor-invisible',
 | 
						|
					'.elementor-background-video-embed',
 | 
						|
				]
 | 
						|
			],
 | 
						|
			[
 | 
						|
				'type'  => 'class',
 | 
						|
				'class' => 'elementor-invisible',
 | 
						|
				'sheet' => 'id:elementor-',
 | 
						|
				'search' => [
 | 
						|
					'.animated'
 | 
						|
				]
 | 
						|
			],
 | 
						|
			[
 | 
						|
				'type'  => 'class',
 | 
						|
				'class' => 'elementor-invisible',
 | 
						|
				'sheet' => 'id:elementor-',
 | 
						|
				'search' => [
 | 
						|
					'.animated'
 | 
						|
				]
 | 
						|
			],
 | 
						|
		];
 | 
						|
		
 | 
						|
		if (is_user_logged_in()) {
 | 
						|
			$this->allow_selectors[] = [
 | 
						|
				'type'  => 'any',
 | 
						|
				'sheet' => 'id:elementor-',
 | 
						|
				'search' => [
 | 
						|
					'#wp-admin-bar*',
 | 
						|
					'*#wpadminbar*',
 | 
						|
				]
 | 
						|
			];
 | 
						|
		}
 | 
						|
 | 
						|
		if (defined('ELEMENTOR_PRO_VERSION')) {
 | 
						|
			$this->allow_selectors = array_merge($this->allow_selectors, [
 | 
						|
				[
 | 
						|
					'type'  => 'class',
 | 
						|
					'class' => 'elementor-posts-container',
 | 
						|
					// 'sheet' => 'id:elementor-',
 | 
						|
					'search' => [
 | 
						|
						'.elementor-posts-container',
 | 
						|
						'.elementor-has-item-ratio'
 | 
						|
					]
 | 
						|
				],
 | 
						|
			]);
 | 
						|
		}
 | 
						|
 | 
						|
		add_filter('debloat/allow_css_selectors', function($allow, \Sphere\Debloat\RemoveCss $remove_css) {
 | 
						|
 | 
						|
			$html = $remove_css->html;
 | 
						|
			if (strpos($html, 'background_slideshow_gallery') !== false) {
 | 
						|
				array_push($this->allow_selectors, ...[
 | 
						|
					[
 | 
						|
						'type'   => 'any',
 | 
						|
						'sheet'  => 'id:elementor-',
 | 
						|
						'search' => [
 | 
						|
							'*.swiper-*',
 | 
						|
							'*.elementor-background-slideshow*',
 | 
						|
							'.elementor-ken-burns*',
 | 
						|
						]
 | 
						|
					],
 | 
						|
				]);
 | 
						|
			}
 | 
						|
 | 
						|
			return array_merge($allow, $this->allow_selectors);
 | 
						|
		}, 10, 2);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Special rules related to Delay JS when Elementor is active.
 | 
						|
	 * 
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function setup_delay_js()
 | 
						|
	{
 | 
						|
		add_filter('debloat/delay_js_includes', function($include) {
 | 
						|
			$include[] = 'elementor/*';
 | 
						|
		
 | 
						|
			// Admin bar should also be delayed as elementor creates admin bar items later
 | 
						|
			// and the events won't register.
 | 
						|
			$include[] = 'wp-includes/js/admin-bar*.js';
 | 
						|
 | 
						|
			return $include;
 | 
						|
		});
 | 
						|
	}
 | 
						|
} |