38217-vm/wp-content/themes/Avada/includes/lib/inc/class-fusion-dynamic-css-file.php
2026-02-05 17:08:59 +03:00

188 lines
4.5 KiB
PHP

<?php
/**
* Dynamic-CSS handler - Inline CSS.
*
* @package Fusion-Library
* @since 1.0.0
*/
/**
* Handle generating the dynamic CSS.
*
* @since 1.0.0
*/
class Fusion_Dynamic_CSS_File {
/**
* An innstance of the Fusion_Dynamic_CSS object.
*
* @access private
* @since 1.0.0
* @var object
*/
private $dynamic_css;
/**
* Constructor.
*
* @access public
* @since 1.0.0
* @param object $dynamic_css An instance of Fusion_DYnamic_CSS.
*/
public function __construct( $dynamic_css ) {
$this->dynamic_css = $dynamic_css;
add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_dynamic_css' ], ( PHP_INT_MAX - 1 ) );
// Make sure file mode dynamic CSS is not created in backend.
if ( is_admin() ) {
return;
}
$needs_update = $this->dynamic_css->needs_update();
// No need to proceed any further if there's no need to update the CSS
// and the file exists.
if ( ! $needs_update && file_exists( $this->file( 'path' ) ) ) {
return;
}
// If we got this far, we need to generate the file.
// First try to check if the file is writable.
// Then attempt to create the file.
// Finally check if the file exists.
// If all of the above tests succeed, then the file is properly created.
if ( $this->can_write() ) {
if ( $this->write_file() ) {
if ( file_exists( $this->file( 'path' ) ) ) {
return;
}
}
}
// If we got this far we need to fallback to inline mode.
$dynamic_css->inline = new Fusion_Dynamic_CSS_Inline( $dynamic_css );
$dynamic_css->mode = 'inline';
}
/**
* Enqueue the dynamic CSS.
*
* @access public
* @return void
*/
public function enqueue_dynamic_css() {
if ( fusion_should_defer_styles_loading() && doing_action( 'wp_enqueue_scripts' ) ) {
add_action( 'wp_body_open', [ $this, 'enqueue_dynamic_css' ], 11 );
return;
}
global $fusion_library_latest_version;
// Nothing to enquue if the file doesn't exist.
// If that happens we've fallen back to inline mode (see the class's constructor).
if ( ! file_exists( $this->file( 'path' ) ) ) {
return;
}
$dependencies = apply_filters( 'fusion_dynamic_css_stylesheet_dependencies', [] );
wp_enqueue_style( 'fusion-dynamic-css', $this->file( 'uri' ), $dependencies, $fusion_library_latest_version );
}
/**
* Gets the css path or url to the stylesheet.
*
* @access public
* @since 1.0.0
* @param string $target path/url.
* @return string Path or url to the file depending on the $target var.
*/
public function file( $target = 'path' ) {
// Get the blog ID.
$blog_id = '';
// If this is a multisite installation, append the blogid to the filename.
if ( is_multisite() ) {
$current_site = get_blog_details();
if ( $current_site->blog_id > 1 ) {
$blog_id = "_blog-{$current_site->blog_id}";
}
}
$id = $this->dynamic_css->get_helpers()->get_dynamic_css_id();
$file_name = "{$id}.min.css";
if ( $blog_id ) {
$file_name = "{$blog_id}-{$id}.min.css";
}
if ( 'filename' === $target ) {
return $file_name;
}
$file = new Fusion_Filesystem( $file_name, 'fusion-styles' );
// Return the path or the URL
// depending on the $target we have defined when calling this method.
if ( 'path' === $target ) {
return $file->get_path();
}
return $file->get_url();
}
/**
* Writes the file.
*
* @access protected
* @since 1.0.0
* @return bool Whether the file is successfully created or not.
*/
protected function write_file() {
// The CSS.
$css = $this->dynamic_css->make_css();
$filename = $this->file( 'filename' );
$file = new Fusion_Filesystem( $filename, 'fusion-styles' );
if ( false === $file->write_file( $css ) ) {
return false;
}
/**
* Writing to the file succeeded.
* Update the opion in the db so that we know the css for this post
* has been successfully generated
* and then return true.
*/
$c_page_id = fusion_library()->get_page_id();
$page_id = ( $c_page_id ) ? $c_page_id : 'global';
$option = get_option( 'fusion_dynamic_css_posts', [] );
$option[ $page_id ] = true;
update_option( 'fusion_dynamic_css_posts', $option );
// Clean-up transient.
delete_transient( 'fusion_dynamic_css_' . $page_id );
return true;
}
/**
* Determines if the CSS file is writable.
*
* @access private
* @since 1.0.0
* @return bool
*/
private function can_write() {
$file = new Fusion_Filesystem( $this->file( 'filename' ), 'fusion-styles' );
return $file->is_writable();
}
}
/* Omit closing PHP tag to avoid "Headers already sent" issues. */