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;
|
|
}
|
|
}
|