src/includes/Assets.php
<?php
namespace DeepWebSolutions\Framework\Helpers;
use DeepWebSolutions\Framework\Helpers\DataTypes\Strings;
use DeepWebSolutions\Framework\Helpers\FileSystem\Files;
\defined( 'ABSPATH' ) || exit;
/**
* A collection of very useful WP asset handling helpers to be used throughout the projects.
*
* @since 1.0.0
* @version 1.7.0
* @author Antonius Hegyes <a.hegyes@deep-web-solutions.com>
* @package DeepWebSolutions\WP-Framework\Helpers
*/
final class Assets {
// region METHODS
/**
* Returns the path to a minified version of a given asset, if it exists.
*
* @since 1.6.0
* @version 1.7.0
*
* @param string $relative_path Path of the asset relative to the WordPress root directory.
* @param string $constant_name Constant which, if set and true, the unminified path will always be returned.
* @param \WP_Filesystem_Base|null $wp_filesystem WordPress Filesystem object.
*
* @return string
*/
public static function maybe_get_minified_path( string $relative_path, string $constant_name = 'SCRIPT_DEBUG', ?\WP_Filesystem_Base $wp_filesystem = null ): string {
$maybe_minified_path = $relative_path;
$minified_suffix = self::maybe_get_minified_suffix( $constant_name );
if ( ! empty( $minified_suffix ) && true !== Strings::contains( $relative_path, $minified_suffix ) ) {
$wp_filesystem = $wp_filesystem ?? self::resolve_filesystem();
if ( $wp_filesystem instanceof \WP_Filesystem_Base ) {
$abs_path = Files::generate_full_path( $wp_filesystem->abspath(), $relative_path );
$extension = Strings::maybe_prefix( \pathinfo( $abs_path, PATHINFO_EXTENSION ), '.' ); // pathinfo returns the extension without the dot
$minified_rel_path = Strings::maybe_suffix( Strings::maybe_unsuffix( $relative_path, $extension ), $minified_suffix . $extension );
$minified_abs_path = Files::generate_full_path( $wp_filesystem->abspath(), $minified_rel_path );
if ( true === $wp_filesystem->is_file( $minified_abs_path ) ) {
$maybe_minified_path = $minified_rel_path;
}
}
}
return $maybe_minified_path;
}
/**
* Returns a given asset's version string based on its disk modified time.
*
* @since 1.6.0
* @version 1.6.1
*
* @param string $relative_path Path of the asset relative to the WordPress root directory.
* @param string $fallback_version Fallback version string to return if retrieving the modified time fails.
* @param \WP_Filesystem_Base|null $wp_filesystem WordPress Filesystem object.
*
* @return string
*/
public static function maybe_get_mtime_version( string $relative_path, string $fallback_version, ?\WP_Filesystem_Base $wp_filesystem = null ): string {
$maybe_mtime_version = $fallback_version;
$wp_filesystem = $wp_filesystem ?? self::resolve_filesystem();
if ( $wp_filesystem instanceof \WP_Filesystem_Base ) {
$mtime = $wp_filesystem->mtime( Files::generate_full_path( $wp_filesystem->abspath(), $relative_path ) );
$maybe_mtime_version = ! empty( $mtime ) ? (string) $mtime : $maybe_mtime_version;
}
return $maybe_mtime_version;
}
/**
* Returns the assets suffix which determines whether assets should be enqueued minified or not.
*
* @since 1.0.0
* @version 1.7.0
*
* @param string $constant_name The name of the constant to check for truthful values in case the assets should be loaded in a minified state.
*
* @return string
*/
public static function maybe_get_minified_suffix( string $constant_name = 'SCRIPT_DEBUG' ): string {
return Constants::is_true( $constant_name ) ? '' : '.min';
}
// endregion
// region HELPERS
/**
* Attempts to return a WP Filesystem object given a potentially null one.
*
* @since 1.6.1
* @version 1.6.1
*
* @return \WP_Filesystem_Base|null
*/
private static function resolve_filesystem(): ?\WP_Filesystem_Base {
global $wp_filesystem;
if ( ! isset( $wp_filesystem ) ) {
\WP_Filesystem();
}
return $wp_filesystem instanceof \WP_Filesystem_Base ? $wp_filesystem : null;
}
// endregion
}