File: //home/mirz4654/public_html/wp-content/plugins/wp-rocket/inc/functions/files.php
<?php
use WP_Rocket\Logger\Logger;
defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
/**
* Generate the content of advanced-cache.php file
*
* @since 2.1 Add filter rocket_advanced_cache_file
* @since 2.0.3
*
* @return string $buffer The content of avanced-cache.php file
*/
function get_rocket_advanced_cache_file() {
$buffer = "<?php\n";
$buffer .= "defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );\n\n";
// Add a constant to be sure this is our file.
$buffer .= "define( 'WP_ROCKET_ADVANCED_CACHE', true );\n\n";
// Include the Mobile Detect class if we have to create a different caching file for mobile.
if ( is_rocket_generate_caching_mobile_files() ) {
$buffer .= "if ( file_exists( '" . WP_ROCKET_VENDORS_PATH . "classes/class-rocket-mobile-detect.php' ) && ! class_exists( 'Rocket_Mobile_Detect' ) ) {\n";
$buffer .= "\tinclude_once '" . WP_ROCKET_VENDORS_PATH . "classes/class-rocket-mobile-detect.php';\n";
$buffer .= "}\n\n";
}
// Register a class autoloader and include the process file.
$buffer .= "if ( version_compare( phpversion(), '" . WP_ROCKET_PHP_VERSION . "' ) >= 0 ) {\n\n";
// Class autoloader.
$autoloader = rocket_direct_filesystem()->get_contents( WP_ROCKET_INC_PATH . 'process-autoloader.php' );
if ( $autoloader ) {
$autoloader = preg_replace( '@^<\?php\s*@', '', $autoloader );
$autoloader = str_replace( [ "\n", "\n\t\n" ], [ "\n\t", "\n\n" ], trim( $autoloader ) );
$autoloader = str_replace( 'WP_ROCKET_PATH', "'" . WP_ROCKET_PATH . "'", $autoloader );
$buffer .= "\t$autoloader\n\n";
}
// Initialize the Cache class and process.
$buffer .= "\t" . 'if ( ! class_exists( \'\WP_Rocket\Buffer\Cache\' ) ) {
if ( ! defined( \'DONOTROCKETOPTIMIZE\' ) ) {
define( \'DONOTROCKETOPTIMIZE\', true ); // WPCS: prefix ok.
}
return;
}
$rocket_config_class = new \WP_Rocket\Buffer\Config(
[
\'config_dir_path\' => \'' . WP_ROCKET_CONFIG_PATH . '\',
]
);
( new \WP_Rocket\Buffer\Cache(
new \WP_Rocket\Buffer\Tests(
$rocket_config_class
),
$rocket_config_class,
[
\'cache_dir_path\' => \'' . WP_ROCKET_CACHE_PATH . '\',
]
) )->maybe_init_process();' . "\n";
$buffer .= "} else {\n";
// Add a constant to provent include issue.
$buffer .= "\tdefine( 'WP_ROCKET_ADVANCED_CACHE_PROBLEM', true );\n";
$buffer .= "}\n";
/**
* Filter the content of advanced-cache.php file
*
* @since 2.1
*
* @param string $buffer The content that will be printed in advanced-cache.php.
*/
$buffer = apply_filters( 'rocket_advanced_cache_file', $buffer );
return $buffer;
}
/**
* Create advanced-cache.php file.
*
* @since 2.0
*
* @return void
*/
function rocket_generate_advanced_cache_file() {
static $done = false;
if ( $done ) {
return;
}
$done = true;
rocket_put_content( WP_CONTENT_DIR . '/advanced-cache.php', get_rocket_advanced_cache_file() );
}
/**
* Generates the configuration file for the current domain based on the values of options
*
* @since 2.0
*
* @return array Names of all config files & The content that will be printed
*/
function get_rocket_config_file() {
$options = get_option( WP_ROCKET_SLUG );
if ( ! $options ) {
return;
}
$buffer = "<?php\n";
$buffer .= "defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );\n\n";
$buffer .= '$rocket_cookie_hash = \'' . COOKIEHASH . "';\n";
$buffer .= '$rocket_logged_in_cookie = \'' . LOGGED_IN_COOKIE . "';\n";
/**
* Filters the activation of the common cache for logged-in users.
*
* @since 2.10
* @author Remy Perona
*
* @param bool True to activate the common cache, false to ignore.
*/
if ( apply_filters( 'rocket_common_cache_logged_users', false ) ) {
$buffer .= '$rocket_common_cache_logged_users = 1;' . "\n";
}
if ( ! empty( $options['cache_webp'] ) ) {
/** This filter is documented in inc/classes/buffer/class-cache.php */
$disable_webp_cache = apply_filters( 'rocket_disable_webp_cache', false );
if ( $disable_webp_cache ) {
$options['cache_webp'] = 0;
}
}
/**
* Filters the use of the mobile cache version for tablets
* 'desktop' will serve desktop to tablets, 'mobile' will serve mobile to tablets
*
* @since 3.2
* @author Remy Perona
*
* @param string $tablet_version valid values are 'mobile' or 'desktop'
*/
$buffer .= '$rocket_cache_mobile_files_tablet = \'' . apply_filters( 'rocket_cache_mobile_files_tablet', 'desktop' ) . "';\n";
foreach ( $options as $option => $value ) {
if ( 'cache_ssl' === $option ) {
if ( 1 !== (int) $value ) {
if ( rocket_is_ssl_website() ) {
update_rocket_option( 'cache_ssl', 1 );
$value = 1;
}
}
$buffer .= '$rocket_' . $option . ' = ' . (int) $value . ";\n";
}
if ( 'cache_mobile' === $option || 'do_caching_mobile_files' === $option || 'cache_webp' === $option ) {
$buffer .= '$rocket_' . $option . ' = ' . (int) $value . ";\n";
}
if ( 'secret_cache_key' === $option ) {
$buffer .= '$rocket_' . $option . ' = \'' . $value . "';\n";
}
if ( 'cache_reject_uri' === $option ) {
$buffer .= '$rocket_' . $option . ' = \'' . get_rocket_cache_reject_uri() . "';\n";
}
if ( 'cache_query_strings' === $option ) {
$buffer .= '$rocket_' . $option . ' = ' . call_user_func( 'var_export', get_rocket_cache_query_string(), true ) . ";\n";
}
if ( 'cache_reject_cookies' === $option ) {
$cookies = get_rocket_cache_reject_cookies();
if ( $cookies && get_rocket_option( 'cache_logged_user' ) ) {
// Make sure the "logged-in cookies" are not rejected.
$logged_in_cookie = explode( COOKIEHASH, LOGGED_IN_COOKIE );
$logged_in_cookie = array_map( 'preg_quote', $logged_in_cookie );
$logged_in_cookie = implode( '[^|]*', $logged_in_cookie );
$cookies = preg_replace( '/\|' . $logged_in_cookie . '\|/', '|', '|' . $cookies . '|' );
$cookies = trim( $cookies, '|' );
}
$buffer .= '$rocket_' . $option . ' = \'' . $cookies . "';\n";
}
if ( 'cache_reject_ua' === $option ) {
$buffer .= '$rocket_' . $option . ' = \'' . get_rocket_cache_reject_ua() . "';\n";
}
}
$buffer .= '$rocket_cache_ignored_parameters = ' . call_user_func( 'var_export', rocket_get_ignored_parameters(), true ) . ";\n";
$buffer .= '$rocket_cache_mandatory_cookies = ' . call_user_func( 'var_export', get_rocket_cache_mandatory_cookies(), true ) . ";\n";
$buffer .= '$rocket_cache_dynamic_cookies = ' . call_user_func( 'var_export', get_rocket_cache_dynamic_cookies(), true ) . ";\n";
/** This filter is documented in inc/front/htaccess.php */
if ( apply_filters( 'rocket_url_no_dots', false ) ) {
$buffer .= '$rocket_url_no_dots = 1;';
}
$config_files_path = [];
$urls = [ rocket_get_home_url() ];
// Check if a translation plugin is activated and this configuration is in subdomain.
$subdomains = get_rocket_i18n_subdomains();
if ( $subdomains ) {
$urls = $subdomains;
}
foreach ( $urls as $url ) {
$file = get_rocket_parse_url( untrailingslashit( $url ) );
$file['path'] = ( ! empty( $file['path'] ) ) ? str_replace( '/', '.', untrailingslashit( $file['path'] ) ) : '';
$config_files_path[] = WP_ROCKET_CONFIG_PATH . strtolower( $file['host'] ) . $file['path'] . '.php';
}
/**
* Filter all config files path
*
* @since 2.6.5
*
* @param array $config_files_path Path of all config files.
*/
$config_files_path = apply_filters( 'rocket_config_files_path', $config_files_path );
/**
* Filter the content of all config files
*
* @since 2.1
*
* @param string $buffer The content that will be printed.
* @param array $config_files_path Names of all config files.
*/
$buffer = apply_filters( 'rocket_config_file', $buffer, $config_files_path );
$buffer = preg_replace( '@array\s+\(@i', 'array(', $buffer );
$buffer = preg_replace( '@array\(\s+\)@i', 'array()', $buffer );
return [ $config_files_path, $buffer ];
}
/**
* Create the current config domain file
* For example, if home_url() return example.com, the config domain file will be in /config/example.com
*
* @since 2.0
*
* @return void
*/
function rocket_generate_config_file() {
list( $config_files_path, $buffer ) = get_rocket_config_file();
if ( count( $config_files_path ) ) {
rocket_init_config_dir();
foreach ( $config_files_path as $file ) {
rocket_put_content( $file, $buffer );
}
}
}
/**
* Remove the current config domain file
*
* @since 2.6
*
* @return void
*/
function rocket_delete_config_file() {
list( $config_files_path ) = get_rocket_config_file();
foreach ( $config_files_path as $config_file ) {
rocket_direct_filesystem()->delete( $config_file );
}
}
/**
* Create all cache folders (wp-rocket & min)
*
* @since 2.6
*
* @return void
*/
function rocket_init_cache_dir() {
global $is_apache;
// Create cache folder if not exist.
if ( ! rocket_direct_filesystem()->is_dir( WP_ROCKET_CACHE_PATH ) ) {
rocket_mkdir_p( WP_ROCKET_CACHE_PATH );
}
if ( ! rocket_direct_filesystem()->is_file( WP_ROCKET_CACHE_PATH . 'index.html' ) ) {
rocket_direct_filesystem()->touch( WP_ROCKET_CACHE_PATH . 'index.html' );
}
if ( $is_apache ) {
$htaccess_path = WP_ROCKET_CACHE_PATH . '.htaccess';
if ( ! rocket_direct_filesystem()->is_file( $htaccess_path ) ) {
rocket_direct_filesystem()->touch( $htaccess_path );
rocket_put_content( $htaccess_path, "<IfModule mod_autoindex.c>\nOptions -Indexes\n</IfModule>" );
}
}
// Create minify cache folder if not exist.
if ( ! rocket_direct_filesystem()->is_dir( WP_ROCKET_MINIFY_CACHE_PATH ) ) {
rocket_mkdir_p( WP_ROCKET_MINIFY_CACHE_PATH );
}
// Create busting cache folder if not exist.
if ( ! rocket_direct_filesystem()->is_dir( WP_ROCKET_CACHE_BUSTING_PATH ) ) {
rocket_mkdir_p( WP_ROCKET_CACHE_BUSTING_PATH );
}
// Create critical CSS folder if not exist.
if ( ! rocket_direct_filesystem()->is_dir( WP_ROCKET_CRITICAL_CSS_PATH ) ) {
rocket_mkdir_p( WP_ROCKET_CRITICAL_CSS_PATH );
}
}
/**
* Create the config folder (wp-rocket-config)
*
* @since 2.6
*
* @return void
*/
function rocket_init_config_dir() {
// Create config domain folder if not exist.
if ( ! rocket_direct_filesystem()->is_dir( WP_ROCKET_CONFIG_PATH ) ) {
rocket_mkdir_p( WP_ROCKET_CONFIG_PATH );
}
}
/**
* Added or set the value of the WP_CACHE constant
*
* @since 2.0
*
* @param bool $turn_it_on The value of WP_CACHE constant.
* @return void
*/
function set_rocket_wp_cache_define( $turn_it_on ) {
// If WP_CACHE is already define, return to get a coffee.
if ( ! rocket_valid_key() || ( $turn_it_on && defined( 'WP_CACHE' ) && WP_CACHE ) ) {
return;
}
if ( defined( 'IS_PRESSABLE' ) && IS_PRESSABLE ) {
return;
}
// Get path of the config file.
$config_file_path = rocket_find_wpconfig_path();
if ( ! $config_file_path ) {
return;
}
// Get content of the config file.
$config_file = file( $config_file_path );
// Get the value of WP_CACHE constant.
$turn_it_on = $turn_it_on ? 'true' : 'false';
/**
* Filter allow to change the value of WP_CACHE constant
*
* @since 2.1
*
* @param string $turn_it_on The value of WP_CACHE constant.
*/
$turn_it_on = apply_filters( 'set_rocket_wp_cache_define', $turn_it_on );
// Lets find out if the constant WP_CACHE is defined or not.
$is_wp_cache_exist = false;
// Get WP_CACHE constant define.
$constant = "define('WP_CACHE', $turn_it_on); // Added by WP Rocket" . "\r\n";
foreach ( $config_file as &$line ) {
if ( ! preg_match( '/^define\(\s*\'([A-Z_]+)\',(.*)\)/', $line, $match ) ) {
continue;
}
if ( 'WP_CACHE' === $match[1] ) {
$is_wp_cache_exist = true;
$line = $constant;
}
}
unset( $line );
// If the constant does not exist, create it.
if ( ! $is_wp_cache_exist ) {
array_shift( $config_file );
array_unshift( $config_file, "<?php\r\n", $constant );
}
// Insert the constant in wp-config.php file.
$handle = @fopen( $config_file_path, 'w' );
foreach ( $config_file as $line ) {
@fwrite( $handle, $line );
}
@fclose( $handle );
// Update the writing permissions of wp-config.php file.
$chmod = rocket_get_filesystem_perms( 'file' );
rocket_direct_filesystem()->chmod( $config_file_path, $chmod );
}
/**
* Delete all minify cache files
*
* @since 2.1
*
* @param string|array $extensions (default: array('js','css') File extensions to minify.
* @return void
*/
function rocket_clean_minify( $extensions = array( 'js', 'css' ) ) {
$extensions = is_string( $extensions ) ? (array) $extensions : $extensions;
try {
$dir = new RecursiveDirectoryIterator( WP_ROCKET_MINIFY_CACHE_PATH . get_current_blog_id(), FilesystemIterator::SKIP_DOTS );
} catch ( \UnexpectedValueException $e ) {
// No logging yet.
return;
}
try {
$iterator = new RecursiveIteratorIterator( $dir, RecursiveIteratorIterator::CHILD_FIRST );
} catch ( \Exception $e ) {
// No logging yet.
return;
}
foreach ( $extensions as $ext ) {
/**
* Fires before the minify cache files are deleted
*
* @since 2.1
*
* @param string $ext File extensions to minify.
*/
do_action( 'before_rocket_clean_minify', $ext );
try {
$files = new RegexIterator( $iterator, '#.*\.' . $ext . '#', RegexIterator::GET_MATCH );
foreach ( $files as $file ) {
rocket_direct_filesystem()->delete( $file[0] );
}
} catch ( \InvalidArgumentException $e ) {
// No logging yet.
return;
}
/**
* Fires after the minify cache files was deleted
*
* @since 2.1
*
* @param string $ext File extensions to minify.
*/
do_action( 'after_rocket_clean_minify', $ext );
}
foreach ( $iterator as $item ) {
if ( rocket_direct_filesystem()->is_dir( $item ) ) {
rocket_direct_filesystem()->delete( $item );
}
}
$third_party = WP_ROCKET_MINIFY_CACHE_PATH . '3rd-party';
try {
$files = new FilesystemIterator( $third_party );
foreach ( $files as $file ) {
if ( rocket_direct_filesystem()->is_file( $file ) ) {
rocket_direct_filesystem()->delete( $file );
}
}
} catch ( \UnexpectedValueException $e ) {
// No logging yet.
return;
}
}
/**
* Delete all cache busting files
*
* @since 2.9
* @author Remy Perona
*
* @param string|array $extensions (default: array('js','css') File extensions to clean.
* @return void
*/
function rocket_clean_cache_busting( $extensions = array( 'js', 'css' ) ) {
$extensions = is_string( $extensions ) ? (array) $extensions : $extensions;
$cache_busting_path = WP_ROCKET_CACHE_BUSTING_PATH . get_current_blog_id();
if ( ! rocket_direct_filesystem()->is_dir( $cache_busting_path ) ) {
rocket_mkdir_p( $cache_busting_path );
Logger::debug( 'No Cache Busting folder found.', [
'mkdir cache busting folder',
'cache_busting_path' => $cache_busting_path,
] );
return;
}
try {
$dir = new RecursiveDirectoryIterator( $cache_busting_path, FilesystemIterator::SKIP_DOTS );
} catch ( \UnexpectedValueException $e ) {
// No logging yet.
return;
}
try {
$iterator = new RecursiveIteratorIterator( $dir, RecursiveIteratorIterator::CHILD_FIRST );
} catch ( \Exception $e ) {
// No logging yet.
return;
}
foreach ( $extensions as $ext ) {
/**
* Fires before the cache busting files are deleted
*
* @since 2.9
*
* @param string $ext File extensions to clean.
*/
do_action( 'before_rocket_clean_busting', $ext );
try {
$files = new RegexIterator( $iterator, '#.*\.' . $ext . '#', RegexIterator::GET_MATCH );
foreach ( $files as $file ) {
rocket_direct_filesystem()->delete( $file[0] );
}
} catch ( \InvalidArgumentException $e ) {
// No logging yet.
return;
}
/**
* Fires after the cache busting files was deleted
*
* @since 2.9
*
* @param string $ext File extensions to clean.
*/
do_action( 'after_rocket_clean_cache_busting', $ext );
}
try {
foreach ( $iterator as $item ) {
if ( rocket_direct_filesystem()->is_dir( $item ) ) {
rocket_direct_filesystem()->delete( $item );
}
}
} catch ( \UnexpectedValueException $e ) {
// Log the error
Logger::debug( 'Cache Busting folder structure contains a directory we cannot recurse into.', [
'Full error',
'UnexpectedValueException' => $e->getMessage(),
] );
}
}
/**
* Delete one or several cache files.
*
* @since 2.0 Delete cache files for all users.
* @since 1.1.0 Add filter rocket_clean_files.
* @since 1.0
*
* @param string|array $urls URLs of cache files to be deleted.
* @return void
*/
function rocket_clean_files( $urls ) {
$urls = (array) $urls;
/**
* Filter URLs that the cache file to be deleted.
*
* @since 1.1.0
*
* @param array URLs that will be returned.
*/
$urls = apply_filters( 'rocket_clean_files', $urls );
$urls = array_filter( (array) $urls );
if ( ! $urls ) {
return;
}
/**
* Fires before all cache files are deleted.
*
* @since 3.2.2
* @author Grégory Viguier
*
* @param array $urls The URLs corresponding to the deleted cache files.
*/
do_action( 'before_rocket_clean_files', $urls );
foreach ( $urls as $url ) {
/**
* Fires before the cache file is deleted.
*
* @since 1.0
*
* @param string $url The URL that the cache file to be deleted.
*/
do_action( 'before_rocket_clean_file', $url );
/** This filter is documented in inc/front/htaccess.php */
if ( apply_filters( 'rocket_url_no_dots', false ) ) {
$url = str_replace( '.', '_', $url );
}
$dirs = glob( WP_ROCKET_CACHE_PATH . rocket_remove_url_protocol( $url ), GLOB_NOSORT );
if ( $dirs ) {
foreach ( $dirs as $dir ) {
rocket_rrmdir( $dir );
}
}
/**
* Fires after the cache file is deleted.
*
* @since 1.0
*
* @param string $url The URL that the cache file was deleted.
*/
do_action( 'after_rocket_clean_file', $url );
}
/**
* Fires after all cache files are deleted.
*
* @since 3.2.2
* @author Grégory Viguier
*
* @param array $urls The URLs corresponding to the deleted cache files.
*/
do_action( 'after_rocket_clean_files', $urls );
}
/**
* Remove the home cache file and pagination
*
* $since 2.2 Add $lang argument
*
* @since 2.0 Delete cache files for all users
* @since 1.0
*
* @param string $lang (default: '') The language code.
* @return void
*/
function rocket_clean_home( $lang = '' ) {
$parse_url = get_rocket_parse_url( get_rocket_i18n_home_url( $lang ) );
/** This filter is documented in inc/front/htaccess.php */
if ( apply_filters( 'rocket_url_no_dots', false ) ) {
$parse_url['host'] = str_replace( '.', '_', $parse_url['host'] );
}
$root = WP_ROCKET_CACHE_PATH . $parse_url['host'] . '*' . untrailingslashit( $parse_url['path'] );
/**
* Filter the homepage caching folder root
*
* @since 2.6.5
* @param array $root The root that will be returned.
* @param string $host The website host.
* @param string $path The website path.
*/
$root = apply_filters( 'rocket_clean_home_root', $root, $parse_url['host'], $parse_url['path'] );
/**
* Fires before the home cache file is deleted
*
* @since 1.0
*
* @param string $root The path of home cache file.
* @param string $lang The current lang to purge.
*/
do_action( 'before_rocket_clean_home', $root, $lang );
// Delete homepage.
$files = glob( $root . '/{index,index-*}.{html,html_gzip}', GLOB_BRACE | GLOB_NOSORT );
if ( $files ) {
foreach ( $files as $file ) { // no array map to use @.
rocket_direct_filesystem()->delete( $file );
}
}
// Delete homepage pagination.
$dirs = glob( $root . '*/' . $GLOBALS['wp_rewrite']->pagination_base, GLOB_NOSORT );
if ( $dirs ) {
foreach ( $dirs as $dir ) {
rocket_rrmdir( $dir );
}
}
// Remove the hidden empty file for mobile detection on NGINX with the Rocket NGINX configuration.
$nginx_mobile_detect_files = glob( $root . '/.mobile-active', GLOB_BRACE | GLOB_NOSORT );
if ( $nginx_mobile_detect_files ) {
foreach ( $nginx_mobile_detect_files as $nginx_mobile_detect_file ) { // no array map to use @.
rocket_direct_filesystem()->delete( $nginx_mobile_detect_file );
}
}
// Remove the hidden empty file for webp.
$nowebp_detect_files = glob( $root . '/.no-webp', GLOB_BRACE | GLOB_NOSORT );
if ( $nowebp_detect_files ) {
foreach ( $nowebp_detect_files as $nowebp_detect_file ) { // no array map to use @.
rocket_direct_filesystem()->delete( $nowebp_detect_file );
}
}
/**
* Fires after the home cache file was deleted
*
* @since 1.0
*
* @param string $root The path of home cache file.
* @param string $lang The current lang to purge.
*/
do_action( 'after_rocket_clean_home', $root, $lang );
}
/**
* Remove the home cache feed
*
* @since 2.7
*
* @return void
*/
function rocket_clean_home_feeds() {
$urls = array();
$urls[] = get_feed_link();
$urls[] = get_feed_link( 'comments_' );
/**
* Filter the home feeds urls
*
* @since 2.7
* @param array $urls The urls of the home feeds.
*/
$urls = apply_filters( 'rocket_clean_home_feeds', $urls );
/**
* Fires before the home feeds cache is deleted
*
* @since 2.7
*
* @param array $urls The urls of the home feeds.
*/
do_action( 'before_rocket_clean_home_feeds', $urls );
rocket_clean_files( $urls );
/**
* Fires after the home feeds cache was deleted
*
* @since 2.7
*
* @param array $urls The urls of the home feeds.
*/
do_action( 'after_rocket_clean_home_feeds', $urls );
}
/**
* Remove all cache files of the domain
*
* @since 2.0 Delete domain cache files for all users
* @since 1.0
*
* @param string $lang (default: '') The language code.
* @return void
*/
function rocket_clean_domain( $lang = '' ) {
$urls = ( ! $lang || is_object( $lang ) || is_array( $lang ) || is_int( $lang ) ) ? get_rocket_i18n_uri() : get_rocket_i18n_home_url( $lang );
$urls = (array) $urls;
/**
* Filter URLs to delete all caching files from a domain
*
* @since 2.6.4
* @param array URLs that will be returned.
* @param string The language code.
*/
$urls = apply_filters( 'rocket_clean_domain_urls', $urls, $lang );
$urls = array_filter( $urls );
foreach ( $urls as $url ) {
$file = get_rocket_parse_url( $url );
/** This filter is documented in inc/front/htaccess.php */
if ( apply_filters( 'rocket_url_no_dots', false ) ) {
$file['host'] = str_replace( '.', '_', $file['host'] );
}
$root = WP_ROCKET_CACHE_PATH . $file['host'] . '*' . $file['path'];
/**
* Fires before all cache files are deleted
*
* @since 1.0
*
* @param string $root The path of home cache file.
* @param string $lang The current lang to purge.
* @param string $url The home url.
*/
do_action( 'before_rocket_clean_domain', $root, $lang, $url );
// Delete cache domain files.
$dirs = glob( $root . '*', GLOB_NOSORT );
if ( $dirs ) {
foreach ( $dirs as $dir ) {
rocket_rrmdir( $dir, get_rocket_i18n_to_preserve( $lang ) );
}
}
/**
* Fires after all cache files was deleted
*
* @since 1.0
*
* @param string $root The path of home cache file.
* @param string $lang The current lang to purge.
* @param string $url The home url.
*/
do_action( 'after_rocket_clean_domain', $root, $lang, $url );
}
}
/**
* Delete the caching files of a specific term.
*
* $since 2.6.8
*
* @param int $term_id The term ID.
* @param string $taxonomy_slug The taxonomy slug.
* @return void
*/
function rocket_clean_term( $term_id, $taxonomy_slug ) {
$purge_urls = [];
// Get all term infos.
$term = get_term_by( 'id', $term_id, $taxonomy_slug );
// Get the term language.
$i18n_plugin = rocket_has_i18n();
if ( 'wpml' === $i18n_plugin && ! rocket_is_plugin_active( 'woocommerce-multilingual/wpml-woocommerce.php' ) ) {
// WPML.
$lang = $GLOBALS['sitepress']->get_language_for_element( $term_id, 'tax_' . $taxonomy_slug );
} elseif ( 'polylang' === $i18n_plugin ) {
// Polylang.
$lang = pll_get_term_language( $term_id );
} else {
$lang = false;
}
// Get permalink.
$permalink = get_term_link( $term, $taxonomy_slug );
// Add permalink.
if ( '/' !== rocket_extract_url_component( $permalink, PHP_URL_PATH ) ) {
array_push( $purge_urls, $permalink );
}
/**
* Fires before deleted caching files related with the term
*
* @since 2.6.8
* @param obj $term The term object.
* @param array $purge_urls URLs cache files to remove.
* @param string $lang The term language.
*/
do_action( 'before_rocket_clean_term', $term, $purge_urls, $lang );
/**
* Filter URLs cache files to remove
*
* @since 2.6.8
* @param array $purge_urls List of URLs cache files to remove.
* @param obj $term The term object.
*/
$purge_urls = apply_filters( 'rocket_term_purge_urls', $purge_urls, $term );
// Purge all files.
rocket_clean_files( $purge_urls );
// Never forget to purge homepage and their pagination.
rocket_clean_home( $lang );
/**
* Fires before deleted caching files related with the term
*
* @since 2.6.8
* @param obj $term The term object.
* @param array $purge_urls URLs cache files to remove.
* @param string $lang The term language.
*/
do_action( 'after_rocket_clean_term', $term, $purge_urls, $lang );
}
/**
* Delete the caching files of a specific user
*
* $since 2.6.12
*
* @param int $user_id The user ID.
* @param string $lang The language code.
* @return void
*/
function rocket_clean_user( $user_id, $lang = '' ) {
$urls = ( ! $lang || is_object( $lang ) ) ? get_rocket_i18n_uri() : get_rocket_i18n_home_url( $lang );
$urls = (array) $urls;
/** This filter is documented in inc/functions/files.php */
$urls = apply_filters( 'rocket_clean_domain_urls', $urls, $lang );
$urls = array_filter( $urls );
$user = get_user_by( 'id', $user_id );
if ( ! $user ) {
return;
}
$user_key = $user->user_login . '-' . get_rocket_option( 'secret_cache_key' );
foreach ( $urls as $url ) {
$parse_url = get_rocket_parse_url( $url );
/** This filter is documented in inc/front/htaccess.php */
if ( apply_filters( 'rocket_url_no_dots', false ) ) {
$parse_url['host'] = str_replace( '.', '_', $parse_url['host'] );
}
$root = WP_ROCKET_CACHE_PATH . $parse_url['host'] . '-' . $user_key . '*' . $parse_url['path'];
/**
* Fires before all caching files are deleted for a specific user
*
* @since 2.6.12
*
* @param int $user_id The path of home cache file.
* @param string $lang The language code.
*/
do_action( 'before_rocket_clean_user', $user_id, $lang );
// Delete cache domain files.
$dirs = glob( $root . '*', GLOB_NOSORT );
if ( $dirs ) {
foreach ( $dirs as $dir ) {
rocket_rrmdir( $dir, get_rocket_i18n_to_preserve( $lang ) );
}
}
/**
* Fires after all caching files are deleted for a specific user
*
* @since 2.6.12
*
* @param int $user_id The path of home cache file.
* @param string $lang The language code.
*/
do_action( 'after_rocket_clean_user', $user_id, $lang );
}
}
/**
* Remove all caching files in the cache folder
*
* @since 2.6.8
*
* @return void
*/
function rocket_clean_cache_dir() {
/**
* Fires before deleting all caching files in the cache folder
*
* @since 2.6.8
*/
do_action( 'before_rocket_clean_cache_dir' );
// Delete all caching files.
$dirs = glob( WP_ROCKET_CACHE_PATH . '*', GLOB_NOSORT );
if ( $dirs ) {
foreach ( $dirs as $dir ) {
rocket_rrmdir( $dir );
}
}
/**
* Fires after deleting all caching files in the cache folder
*
* @since 2.6.8
*/
do_action( 'after_rocket_clean_cache_dir' );
}
/**
* Remove a single file or a folder recursively
*
* @since 1.0
*
* @param string $dir File/Directory to delete.
* @param array $dirs_to_preserve (default: array()) Dirs that should not be deleted.
* @return void
*/
function rocket_rrmdir( $dir, $dirs_to_preserve = array() ) {
$dir = untrailingslashit( $dir );
/**
* Fires before a file/directory cache is deleted
*
* @since 1.1.0
*
* @param string $dir File/Directory to delete.
* @param array $dirs_to_preserve Directories that should not be deleted.
*/
do_action( 'before_rocket_rrmdir', $dir, $dirs_to_preserve );
// Remove the hidden empty file for mobile detection on NGINX with the Rocket NGINX configuration.
$nginx_mobile_detect_file = $dir . '/.mobile-active';
if ( rocket_direct_filesystem()->is_dir( $dir ) && rocket_direct_filesystem()->exists( $nginx_mobile_detect_file ) ) {
rocket_direct_filesystem()->delete( $nginx_mobile_detect_file );
}
// Remove the hidden empty file for webp.
$nowebp_detect_file = $dir . '/.no-webp';
if ( rocket_direct_filesystem()->is_dir( $dir ) && rocket_direct_filesystem()->exists( $nowebp_detect_file ) ) {
rocket_direct_filesystem()->delete( $nowebp_detect_file );
}
if ( ! rocket_direct_filesystem()->is_dir( $dir ) ) {
rocket_direct_filesystem()->delete( $dir );
return;
};
$dirs = glob( $dir . '/*', GLOB_NOSORT );
if ( $dirs ) {
$keys = array();
foreach ( $dirs_to_preserve as $dir_to_preserve ) {
$matches = preg_grep( "#^$dir_to_preserve$#", $dirs );
$keys[] = reset( $matches );
}
$dirs = array_diff( $dirs, array_filter( $keys ) );
foreach ( $dirs as $dir ) {
if ( rocket_direct_filesystem()->is_dir( $dir ) ) {
rocket_rrmdir( $dir, $dirs_to_preserve );
} else {
rocket_direct_filesystem()->delete( $dir );
}
}
}
rocket_direct_filesystem()->delete( $dir );
/**
* Fires after a file/directory cache was deleted
*
* @since 1.1.0
*
* @param string $dir File/Directory to delete.
* @param array $dirs_to_preserve Dirs that should not be deleted.
*/
do_action( 'after_rocket_rrmdir', $dir, $dirs_to_preserve );
}
/**
* Instanciate the filesystem class
*
* @since 2.10
*
* @return object WP_Filesystem_Direct instance
*/
function rocket_direct_filesystem() {
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
return new WP_Filesystem_Direct( new StdClass() );
}
/**
* Directory creation based on WordPress Filesystem
*
* @since 1.3.4
*
* @param string $dir The path of directory will be created.
* @return bool
*/
function rocket_mkdir( $dir ) {
$chmod = rocket_get_filesystem_perms( 'dir' );
return rocket_direct_filesystem()->mkdir( $dir, $chmod );
}
/**
* Recursive directory creation based on full path.
*
* @since 1.3.4
*
* @source wp_mkdir_p() in /wp-includes/functions.php
*
* @param string $target path to the directory we want to create.
* @return bool True if directory is created/exists, false otherwise
*/
function rocket_mkdir_p( $target ) {
// from php.net/mkdir user contributed notes.
$target = str_replace( '//', '/', $target );
// safe mode fails with a trailing slash under certain PHP versions.
$target = untrailingslashit( $target );
if ( empty( $target ) ) {
$target = '/';
}
if ( rocket_direct_filesystem()->exists( $target ) ) {
return rocket_direct_filesystem()->is_dir( $target );
}
// Attempting to create the directory may clutter up our display.
if ( rocket_mkdir( $target ) ) {
return true;
} elseif ( rocket_direct_filesystem()->is_dir( dirname( $target ) ) ) {
return false;
}
// If the above failed, attempt to create the parent node, then try again.
if ( ( '/' !== $target ) && ( rocket_mkdir_p( dirname( $target ) ) ) ) {
return rocket_mkdir_p( $target );
}
return false;
}
/**
* File creation based on WordPress Filesystem
*
* @since 1.3.5
*
* @param string $file The path of file will be created.
* @param string $content The content that will be printed in advanced-cache.php.
* @return bool
*/
function rocket_put_content( $file, $content ) {
$chmod = rocket_get_filesystem_perms( 'file' );
return rocket_direct_filesystem()->put_contents( $file, $content, $chmod );
}
/**
* Get the permissions to apply to files and folders.
*
* Reminder:
* `$perm = fileperms( $file );`
*
* WHAT | TYPE | FILE | FOLDER |
* ----------------------------------------------+--------+--------+--------|
* `$perm` | int | 33188 | 16877 |
* `substr( decoct( $perm ), -4 )` | string | '0644' | '0755' |
* `substr( sprintf( '%o', $perm ), -4 )` | string | '0644' | '0755' |
* `$perm & 0777` | int | 420 | 493 |
* `decoct( $perm & 0777 )` | string | '644' | '755' |
* `substr( sprintf( '%o', $perm & 0777 ), -4 )` | string | '644' | '755' |
*
* @since 3.2.4
* @author Grégory Viguier
*
* @param string $type The type: 'dir' or 'file'.
* @return int Octal integer.
*/
function rocket_get_filesystem_perms( $type ) {
static $perms = [];
// Allow variants.
switch ( $type ) {
case 'dir':
case 'dirs':
case 'folder':
case 'folders':
$type = 'dir';
break;
case 'file':
case 'files':
$type = 'file';
break;
default:
return 0755;
}
if ( isset( $perms[ $type ] ) ) {
return $perms[ $type ];
}
// If the constants are not defined, use fileperms() like WordPress does.
switch ( $type ) {
case 'dir':
if ( defined( 'FS_CHMOD_DIR' ) ) {
$perms[ $type ] = FS_CHMOD_DIR;
} else {
$perms[ $type ] = fileperms( ABSPATH ) & 0777 | 0755;
}
break;
case 'file':
if ( defined( 'FS_CHMOD_FILE' ) ) {
$perms[ $type ] = FS_CHMOD_FILE;
} else {
$perms[ $type ] = fileperms( ABSPATH . 'index.php' ) & 0777 | 0644;
}
}
return $perms[ $type ];
}
/**
* Try to find the correct wp-config.php file, support one level up in filetree
*
* @since 2.1
*
* @return string|bool The path of wp-config.php file or false if not found
*/
function rocket_find_wpconfig_path() {
/**
* Filter the wp-config's filename
*
* @since 2.11
* @author Maxime Culea
*
* @param string $filename The WP Config filename, without the extension.
*/
$config_file_name = apply_filters( 'rocket_wp_config_name', 'wp-config' );
$config_file = ABSPATH . $config_file_name . '.php';
$config_file_alt = dirname( ABSPATH ) . '/' . $config_file_name . '.php';
if ( rocket_direct_filesystem()->exists( $config_file ) && rocket_direct_filesystem()->is_writable( $config_file ) ) {
return $config_file;
} elseif ( rocket_direct_filesystem()->exists( $config_file_alt ) && rocket_direct_filesystem()->is_writable( $config_file_alt ) && ! rocket_direct_filesystem()->exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
return $config_file_alt;
}
// No writable file found.
return false;
}