Astra_Cache_Base
Class Astra_Cache_Base.
Description
Source
File: classes/cache/class-astra-cache-base.php
class Astra_Cache_Base { /** * Member Variable * * @var array instance */ private static $dynamic_css_files = array(); /** * Asset slug for filename. * * @since 2.1.0 * @var string */ private $asset_slug = ''; /** * Check if we are on a single or archive query page. * * @since 2.1.0 * @var string */ private $asset_query_var = ''; /** * Asset Type - archive/post * * @since 2.1.0 * @var string */ private $asset_type = ''; /** * Uploads directory. * * @since 2.1.0 * @var array */ private $uploads_dir = array(); /** * Cache directory from uploads folder. * * @since 2.1.0 * @var String */ private $cache_dir; /** * Set priority for add_action call for action `wp_enqueue_scripts` * * @since 2.1.0 * @var string */ protected $asset_priority = ''; /** * Constructor * * @since 2.1.0 * @param String $cache_dir Base cache directory in the uploads directory. */ public function __construct( $cache_dir ) { if ( true === is_admin() ) { return false; } $this->cache_dir = $cache_dir; add_action( 'wp', array( $this, 'init_cache' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'setup_cache' ), $this->asset_priority ); } /** * Setup class variables. * * @since 2.1.0 * @return void */ public function init_cache() { $this->asset_type = $this->asset_type(); $this->asset_query_var = $this->asset_query_var(); $this->asset_slug = $this->asset_slug(); $this->uploads_dir = astra_addon_filesystem()->get_uploads_dir( $this->cache_dir ); // Create uploads directory. astra_addon_filesystem()->maybe_create_uploads_dir( $this->uploads_dir['path'] ); } /** * Get Current query type. single|archive. * * @since 2.1.0 * @return String */ private function asset_query_var() { if ( 'post' === $this->asset_type || 'home' === $this->asset_type || 'frontpage' === $this->asset_type ) { $slug = 'single'; } else { $slug = 'archive'; } return apply_filters( 'astra_cache_asset_query_var', $slug ); } /** * Get current asset slug. * * @since 2.1.0 * @return String */ private function asset_slug() { if ( 'home' === $this->asset_type || 'frontpage' === $this->asset_type ) { return $this->asset_type; } else { return $this->asset_type . $this->cache_key_suffix(); } } /** * Append queried object ID to cache if it is not `0` * * @since 2.1.0 * @return Mixed queried object id if that is not 0; else false. */ private function cache_key_suffix() { return get_queried_object_id() !== 0 ? '-' . get_queried_object_id() : false; } /** * Get the archive title. * * @since 2.1.0 * @return $title Returns the archive title. */ private function asset_type() { $title = 'post'; if ( is_category() ) { $title = 'category'; } elseif ( is_tag() ) { $title = 'tag'; } elseif ( is_author() ) { $title = 'author'; } elseif ( is_year() ) { $title = 'year-' . get_query_var( 'year' ); } elseif ( is_month() ) { $title = 'month-' . get_query_var( 'monthnum' ); } elseif ( is_day() ) { $title = 'day-' . get_query_var( 'day' ); } elseif ( is_tax( 'post_format' ) ) { if ( is_tax( 'post_format', 'post-format-aside' ) ) { $title = 'asides'; } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { $title = 'galleries'; } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { $title = 'images'; } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { $title = 'videos'; } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { $title = 'quotes'; } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { $title = 'links'; } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { $title = 'statuses'; } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { $title = 'audio'; } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { $title = 'chats'; } } elseif ( is_post_type_archive() ) { $title = 'archives'; } elseif ( is_tax() ) { $tax = get_taxonomy( get_queried_object()->taxonomy ); $title = sanitize_key( $tax->name ); } if ( is_search() ) { $title = 'search'; } if ( is_404() ) { $title = '404'; } if ( is_front_page() ) { $title = 'post'; } if ( is_home() ) { $title = 'home'; } return apply_filters( 'astra_cache_asset_type', $title ); } /** * Create an array of all the files that needs to be merged in dynamic CSS file. * * @since 2.1.0 * @param array $file file path. * @return void */ public static function add_css_file( $file ) {} /** * Append CSS style to the theme dynamic css. * * @since 2.1.0 * @param Array $dynamic_css_files Array of file paths to be to be added to minify cache. * @return String CSS from the CSS files passed. */ public function get_css_from_files( $dynamic_css_files ) { $dynamic_css_data = ''; foreach ( $dynamic_css_files as $key => $value ) { // Get file contents. $get_contents = astra_addon_filesystem()->get_contents( $value ); if ( $get_contents ) { $dynamic_css_data .= $get_contents; } } return $dynamic_css_data; } /** * Refresh Assets, called through ajax * * @since 2.1.0 * @param String $cache_dir dirname of the cache. * @return void */ public function ajax_refresh_assets( $cache_dir ) { if ( ! current_user_can( 'edit_theme_options' ) ) { wp_die(); } check_ajax_referer( 'astra-addon-module-nonce', 'nonce' ); $this->init_cache(); astra_addon_filesystem()->reset_filesystem_access_status(); $this->delete_cache_files( $cache_dir ); } /** * Refresh Assets * * @since 2.1.0 * @param String $cache_dir dirname of the cache. * @return void */ public function refresh_assets( $cache_dir ) { if ( ! current_user_can( 'edit_theme_options' ) ) { return; } $this->init_cache(); astra_addon_filesystem()->reset_filesystem_access_status(); $this->delete_cache_files( $cache_dir ); } /** * Deletes cache files * * @since 2.1.0 * @param String $cache_dir dirname of the cache. * @return void */ private function delete_cache_files( $cache_dir ) { $cache_dir = astra_addon_filesystem()->get_uploads_dir( $cache_dir ); $cache_files = astra_addon_filesystem()->get_filesystem()->dirlist( $cache_dir['path'], false, true ); if ( is_array( $cache_files ) ) { foreach ( $cache_files as $file ) { // don't delete index.php file. if ( 'index.php' === $file['name'] ) { continue; } // Delete only dynamic CSS files. if ( false === strpos( $file['name'], 'dynamic-css' ) ) { continue; } astra_addon_filesystem()->delete( trailingslashit( $cache_dir['path'] ) . $file['name'], true, 'f' ); } } } /** * Fetch theme CSS data to be added in the dynamic CSS file. * * @since 2.1.0 * @return void */ public function setup_cache() {} /** * Write dynamic asset files. * * @param String $style_data Dynamic CSS. * @param String $type Asset type. * @return void */ protected function write_assets( $style_data, $type ) { $allow_file_generation = get_option( '_astra_file_generation', 'disable' ); if ( 'disable' === $allow_file_generation || is_customize_preview() ) { return; } $assets_info = $this->get_asset_info( $type ); $post_timestamp = $this->get_post_timestamp( $assets_info ); // Check if we need to create a new file or override the current file. if ( ! empty( $style_data ) && true === $post_timestamp['create_new_file'] ) { $this->file_write( $style_data, $post_timestamp['timestamp'], $assets_info ); } } /** * Get Dynamic CSS. * * @since 2.1.0 * @return void */ protected function get_dynamic_css() { } /** * Enqueue CSS files. * * @param string $type Gets the type theme/addon. * @since 2.1.0 * @return void */ public function enqueue_styles( $type ) { if ( self::inline_assets() ) { wp_add_inline_style( 'astra-' . $type . '-css', $this->get_dynamic_css() ); } else { $assets_info = $this->get_asset_info( $type ); $post_timestamp = $this->get_post_timestamp( $assets_info ); if ( isset( $this->uploads_dir['url'] ) ) { wp_enqueue_style( 'astra-' . $type . '-dynamic', $this->uploads_dir['url'] . 'astra-' . $type . '-dynamic-css-' . $this->asset_slug . '.css', array( 'astra-' . $type . '-css' ), $post_timestamp['timestamp'] ); } } } /** * Enqueue the assets inline. * * @since 2.1.0 * @return boolean */ public static function inline_assets() { $inline = false; $allow_file_generation = get_option( '_astra_file_generation', 'disable' ); if ( ( defined( 'SCRIPT_DEBUG' ) && true === SCRIPT_DEBUG ) || ! astra_addon_filesystem()->can_access_filesystem() || 'disable' === $allow_file_generation || is_customize_preview() ) { $inline = true; } return apply_filters( 'astra_load_dynamic_css_inline', $inline ); } /** * Returns the current Post Meta/ Option Timestamp. * * @since 2.1.0 * @param string $assets_info Gets the assets path info. * @return array $timestamp_data. */ public function get_post_timestamp( $assets_info ) { // Check if current page is a post/ archive page. false states that the current page is a post. if ( 'single' === $this->asset_query_var ) { $post_timestamp = get_post_meta( get_the_ID(), 'astra_style_timestamp_css', true ); } else { $post_timestamp = get_option( 'astra_get_dynamic_css' ); } $timestamp_data = $this->maybe_get_new_timestamp( $post_timestamp, $assets_info ); return $timestamp_data; } /** * Gets the current timestamp. * * @since 2.1.0 * @return string $timestamp Timestamp. */ private function get_current_timestamp() { $date = new DateTime(); $timestamp = $date->getTimestamp(); return $timestamp; } /** * Returns the current Post Meta/ Option Timestamp or creates a new timestamp. * * @since 2.1.0 * @param string $post_timestamp Timestamp of the post meta/ option. * @param string $assets_info Gets the assets path info. * @return array $data. */ public function maybe_get_new_timestamp( $post_timestamp, $assets_info ) { // Creates a new timestamp if the file does not exists or the timestamp is empty. // If post_timestamp is empty that means it is an new post or the post is updated and a new file needs to be created. // If a file does not exists then we need to create a new file. if ( '' == $post_timestamp || ! file_exists( $assets_info['path'] ) ) { $timestamp = $this->get_current_timestamp(); $data = array( 'create_new_file' => true, 'timestamp' => $timestamp, ); } else { $timestamp = $post_timestamp; $data = array( 'create_new_file' => false, 'timestamp' => $timestamp, ); } return $data; } /** * Returns an array of paths for the CSS assets * of the current post. * * @param string $type Gets the type theme/addon. * @since 2.1.0 * @return array */ public function get_asset_info( $type ) { $css_suffix = 'astra-' . $type . '-dynamic-css'; $css_suffix = 'astra-' . $type . '-dynamic-css'; $info = array(); if ( ! isset( $this->uploads_dir['path'] ) || ! isset( $this->uploads_dir['url'] ) ) { return $info; } $info['path'] = $this->uploads_dir['path'] . $css_suffix . '-' . $this->asset_slug . '.css'; $info['css_url'] = $this->uploads_dir['url'] . $css_suffix . '-' . $this->asset_slug . '.css'; return $info; } /** * Updates the Post Meta/ Option Timestamp. * * @param string $timestamp Gets the current timestamp. * @since 2.1.0 * @return void */ public function update_timestamp( $timestamp ) { // Check if current page is a post/ archive page. false states that the current page is a post. if ( 'single' === $this->asset_query_var ) { update_post_meta( get_the_ID(), 'astra_style_timestamp_css', $timestamp ); } else { update_option( 'astra_get_dynamic_css', $timestamp ); } } /** * Creates CSS files. * * @param string $style_data Gets the CSS for the current Page. * @param string $timestamp Gets the current timestamp. * @param string $assets_info Gets the assets path info. * @since 2.1.0 * @return void */ public function file_write( $style_data, $timestamp, $assets_info ) { astra_addon_filesystem()->put_contents( $assets_info['path'], $style_data ); $this->update_timestamp( $timestamp ); } }
Expand full source code Collapse full source code View on Trac
Methods
- __construct — Constructor
- add_css_file — Create an array of all the files that needs to be merged in dynamic CSS file.
- ajax_refresh_assets — Refresh Assets, called through ajax
- asset_query_var — Get Current query type. single|archive.
- asset_slug — Get current asset slug.
- asset_type — Get the archive title.
- cache_key_suffix — Append queried object ID to cache if it is not `0`
- delete_cache_files — Deletes cache files
- enqueue_styles — Enqueue CSS files.
- file_write — Creates CSS files.
- get_asset_info — Returns an array of paths for the CSS assets of the current post.
- get_css_from_files — Append CSS style to the theme dynamic css.
- get_current_timestamp — Gets the current timestamp.
- get_dynamic_css — Get Dynamic CSS.
- get_post_timestamp — Returns the current Post Meta/ Option Timestamp.
- init_cache — Setup class variables.
- inline_assets — Enqueue the assets inline.
- maybe_get_new_timestamp — Returns the current Post Meta/ Option Timestamp or creates a new timestamp.
- refresh_assets — Refresh Assets
- setup_cache — Fetch theme CSS data to be added in the dynamic CSS file.
- update_timestamp — Updates the Post Meta/ Option Timestamp.
- write_assets — Write dynamic asset files.