284 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace WpAssetCleanUp;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class Sorting
 | 
						|
 * @package WpAssetCleanUp
 | 
						|
 */
 | 
						|
class Sorting
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * Sorts styles or scripts list in alphabetical ascending order (from A to Z) by the handle name
 | 
						|
	 *
 | 
						|
	 * @param $list
 | 
						|
	 *
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	public static function sortListByAlpha($list)
 | 
						|
	{
 | 
						|
		if (isset($list['styles']) && ! empty($list['styles'])) {
 | 
						|
			$newStyles = array();
 | 
						|
 | 
						|
			foreach ($list['styles'] as $indexNo => $styleObj) {
 | 
						|
				if (! isset($styleObj->handle)) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
 | 
						|
				if ($assetAlt = self::matchesWpCoreCriteria($styleObj, 'styles')) {
 | 
						|
					if (isset($assetAlt->wp)) {
 | 
						|
						$styleObj->wp = true;
 | 
						|
					}
 | 
						|
 | 
						|
					if (isset($assetAlt->ver)) {
 | 
						|
						$styleObj->ver = $assetAlt->ver;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				$newStyles[$styleObj->handle] = $styleObj;
 | 
						|
			}
 | 
						|
 | 
						|
			$list['styles'] = $newStyles;
 | 
						|
 | 
						|
			sort($list['styles']);
 | 
						|
		}
 | 
						|
 | 
						|
		if (isset($list['scripts']) && ! empty($list['scripts'])) {
 | 
						|
			$newScripts = array();
 | 
						|
 | 
						|
			foreach ($list['scripts'] as $indexNo => $scriptObj) {
 | 
						|
				if (! isset($scriptObj->handle)) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
 | 
						|
				if ($assetAlt = self::matchesWpCoreCriteria($scriptObj, 'scripts')) {
 | 
						|
					if (isset($assetAlt->wp)) {
 | 
						|
						$scriptObj->wp = true;
 | 
						|
					}
 | 
						|
 | 
						|
					if (isset($assetAlt->ver)) {
 | 
						|
						$scriptObj->ver = $assetAlt->ver;
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				$newScripts[$scriptObj->handle] = $scriptObj;
 | 
						|
			}
 | 
						|
 | 
						|
			$list['scripts'] = $newScripts;
 | 
						|
 | 
						|
			sort($list['scripts']);
 | 
						|
		}
 | 
						|
 | 
						|
		return $list;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * The appended location values will be used to sort the list of assets
 | 
						|
	 *
 | 
						|
	 * @param $list
 | 
						|
	 *
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	public static function appendLocation($list)
 | 
						|
	{
 | 
						|
		if (empty($list) || (! isset($list['styles']) && ! isset($list['scripts']))) {
 | 
						|
			return $list;
 | 
						|
		}
 | 
						|
 | 
						|
		$pluginsUrl = plugins_url();
 | 
						|
 | 
						|
		$urlsToThemeDirs = array();
 | 
						|
 | 
						|
		foreach (search_theme_directories() as $themeDir => $themeDirArray) {
 | 
						|
			$themeUrl = '/'.
 | 
						|
	            str_replace(
 | 
						|
	                '//',
 | 
						|
		            '/',
 | 
						|
		            str_replace(Misc::getWpRootDirPath(), '', $themeDirArray['theme_root']) . '/'. $themeDir . '/'
 | 
						|
	            );
 | 
						|
 | 
						|
			$urlsToThemeDirs[] = $themeUrl;
 | 
						|
		}
 | 
						|
 | 
						|
		$urlsToThemeDirs = array_unique($urlsToThemeDirs);
 | 
						|
 | 
						|
		foreach (array('styles', 'scripts') as $assetType) {
 | 
						|
			if ( ! (isset($list[$assetType]) && ! empty($list[$assetType])) ) {
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
 | 
						|
			foreach ( $list[$assetType] as $indexNo => $asset ) {
 | 
						|
				$src = isset($asset->src) ? $asset->src : '';
 | 
						|
				$miscLocalSrc = Misc::getLocalSrc($src);
 | 
						|
 | 
						|
				if ($assetAlt = self::matchesWpCoreCriteria($asset, $assetType)) {
 | 
						|
					// Core Files
 | 
						|
					$asset->locationMain = 'wp_core';
 | 
						|
					$asset->locationChild = 'none';
 | 
						|
 | 
						|
					if (isset($assetAlt->wp)) {
 | 
						|
						$asset->wp = true;
 | 
						|
					}
 | 
						|
 | 
						|
					if (isset($assetAlt->ver)) {
 | 
						|
						$asset->ver = true;
 | 
						|
					}
 | 
						|
				} elseif ($pluginDir = self::matchesPluginCriteria($asset)) {
 | 
						|
					// From plugins directory (usually /wp-content/plugins/)
 | 
						|
					if ($pluginDir === 'n/a' && $src) {
 | 
						|
						if (strpos($src, '/'.Misc::getPluginsDir().'/') !== false) {
 | 
						|
							$srcParts = explode('/'.Misc::getPluginsDir().'/', $src);
 | 
						|
							list ($pluginDir) = explode('/', $srcParts[1]);
 | 
						|
						} else {
 | 
						|
							$relSrc = str_replace($pluginsUrl, '', $src);
 | 
						|
 | 
						|
							if ($relSrc[0] === '/') {
 | 
						|
								$relSrc = substr($relSrc, 1);
 | 
						|
							}
 | 
						|
 | 
						|
							list ($pluginDir) = explode('/', $relSrc);
 | 
						|
						}
 | 
						|
					}
 | 
						|
 | 
						|
					$asset->locationMain  = 'plugins';
 | 
						|
					$asset->locationChild = $pluginDir;
 | 
						|
 | 
						|
					} elseif ( (! empty($miscLocalSrc) && strpos($src, '/wp-content/uploads/') !== false) || strpos($src, '/wp-content/uploads/') === 0 ) {
 | 
						|
					$asset->locationMain  = 'uploads';
 | 
						|
					$asset->locationChild = 'none';
 | 
						|
				} else {
 | 
						|
					$isWithinThemes = false;
 | 
						|
 | 
						|
					foreach ( $urlsToThemeDirs as $urlToThemeDir ) {
 | 
						|
						$srcRel = str_replace(site_url(),'', $src);
 | 
						|
 | 
						|
						if ( strpos( $srcRel, $urlToThemeDir ) !== false ) {
 | 
						|
							$isWithinThemes = true;
 | 
						|
 | 
						|
							$themeDir = substr(strrchr(trim($urlToThemeDir, '/'), '/'), 1);
 | 
						|
 | 
						|
							$asset->locationMain  = 'themes';
 | 
						|
							$asset->locationChild = $themeDir;
 | 
						|
							break;
 | 
						|
							}
 | 
						|
					}
 | 
						|
 | 
						|
					// Default: "External"
 | 
						|
					if ( ! $isWithinThemes ) {
 | 
						|
						// Outside "themes", "plugins" and "wp-includes"
 | 
						|
						$asset->locationMain  = 'external';
 | 
						|
						$asset->locationChild = 'none';
 | 
						|
						}
 | 
						|
				}
 | 
						|
 | 
						|
				$list[$assetType][$indexNo] = $asset;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $list;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $asset
 | 
						|
	 * @param $assetType
 | 
						|
	 *
 | 
						|
	 * @return bool
 | 
						|
	 */
 | 
						|
	public static function matchesWpCoreCriteria($asset, $assetType)
 | 
						|
	{
 | 
						|
		global $wp_version;
 | 
						|
 | 
						|
		$src = isset($asset->src) ? $asset->src : '';
 | 
						|
 | 
						|
		$localSrc = Misc::getLocalSrc($asset->src);
 | 
						|
 | 
						|
		$srcToUse = $src;
 | 
						|
 | 
						|
		if (! empty($localSrc) && isset($localSrc['rel_src']) && $localSrc['rel_src']) {
 | 
						|
			$srcToUse = $localSrc['rel_src']; // the relative path
 | 
						|
		}
 | 
						|
 | 
						|
		$isJQueryHandle       = ($assetType === 'scripts') && in_array($asset->handle, array('jquery', 'jquery-core', 'jquery-migrate'));
 | 
						|
		$isJQueryUpdater      = ($assetType === 'scripts') && strpos($asset->src, '/' . Misc::getPluginsDir( 'dir_name' ) . '/jquery-updater/js/jquery-') !== false;
 | 
						|
 | 
						|
		$startsWithWpIncludes = strpos($srcToUse,'wp-includes/') === 0;
 | 
						|
		$startsWithWpAdmin    = strpos($srcToUse,'wp-admin/') === 0;
 | 
						|
		$wpCoreOnJetpackCdn   = strpos($src, '.wp.com/c/'.$wp_version.'/wp-includes/') !== false;
 | 
						|
 | 
						|
		$coreCssHandlesList = <<<LIST
 | 
						|
global-styles
 | 
						|
global-styles-css-custom-properties
 | 
						|
wp-block-directory
 | 
						|
wp-block-library
 | 
						|
wp-block-styles
 | 
						|
wp-block-library-theme
 | 
						|
wp-block-pattern
 | 
						|
wp-webfonts
 | 
						|
wp-block-post-date
 | 
						|
LIST;
 | 
						|
		$cssCoreHandles = array_merge(
 | 
						|
			explode("\n", $coreCssHandlesList),
 | 
						|
			Misc::getWpCoreCssHandlesFromWpIncludesBlocks() // Source: /wp-includes/blocks/
 | 
						|
		);
 | 
						|
 | 
						|
		$coreJsHandlesList = <<<LIST
 | 
						|
admin-bar
 | 
						|
code-editor
 | 
						|
jquery-ui-datepicker
 | 
						|
LIST;
 | 
						|
		$jsCoreHandles = explode("\n", $coreJsHandlesList);
 | 
						|
 | 
						|
		$isCssCoreHandleFromWpIncludesBlocks = ($assetType === 'styles')  && in_array($asset->handle, $cssCoreHandles);
 | 
						|
		$isJsCoreHandleFromWpIncludesBlocks  = ($assetType === 'scripts') && in_array($asset->handle, $jsCoreHandles);
 | 
						|
 | 
						|
		if ( ! ($isJQueryHandle || $isJQueryUpdater || $startsWithWpIncludes || $startsWithWpAdmin || $isCssCoreHandleFromWpIncludesBlocks || $isJsCoreHandleFromWpIncludesBlocks || $wpCoreOnJetpackCdn) ) {
 | 
						|
			return false; // none of the above conditions matched, thus, this is not a WP core file
 | 
						|
		}
 | 
						|
 | 
						|
		$assetAlt = $asset;
 | 
						|
 | 
						|
		if ($wpCoreOnJetpackCdn) {
 | 
						|
			$assetAlt->wp  = true;
 | 
						|
			$assetAlt->ver = $wp_version;
 | 
						|
		}
 | 
						|
 | 
						|
		return $assetAlt;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * @param $asset
 | 
						|
	 *
 | 
						|
	 * @return bool|string
 | 
						|
	 */
 | 
						|
	public static function matchesPluginCriteria($asset)
 | 
						|
	{
 | 
						|
		$src = isset($asset->src) ? $asset->src : '';
 | 
						|
 | 
						|
		$isOxygenBuilderPlugin = strpos( $src, '/wp-content/uploads/oxygen/css/' ) !== false;
 | 
						|
		$isElementorPlugin     = strpos( $src, '/wp-content/uploads/elementor/css/' ) !== false;
 | 
						|
		$isWooCommerceInline   = $asset->handle === 'woocommerce-inline';
 | 
						|
		$miscLocalSrc          = Misc::getLocalSrc($src);
 | 
						|
 | 
						|
		$isPlugin = $isOxygenBuilderPlugin ||
 | 
						|
		            $isElementorPlugin     ||
 | 
						|
		            $isWooCommerceInline   ||
 | 
						|
		            strpos( $src, plugins_url() ) !== false ||
 | 
						|
		            ((! empty($miscLocalSrc) && strpos($src, '/'.Misc::getPluginsDir().'/') !== false) || strpos($src, '/'.Misc::getPluginsDir().'/') === 0);
 | 
						|
 | 
						|
		if (! $isPlugin) {
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$pluginDir = 'n/a'; // default
 | 
						|
 | 
						|
		if ($isOxygenBuilderPlugin) {
 | 
						|
			$pluginDir = 'oxygen';
 | 
						|
		} elseif ($isElementorPlugin) {
 | 
						|
			$pluginDir = 'elementor';
 | 
						|
		} elseif ($isWooCommerceInline) {
 | 
						|
			$pluginDir = 'woocommerce';
 | 
						|
		}
 | 
						|
 | 
						|
		return $pluginDir;
 | 
						|
	}
 | 
						|
}
 |