.wpview-wrap.wp-mce-view-show-toolbar .toolbar { display: block; } .wpview-wrap .shortcake-error { color: red; font-weight: bold; } .wpview-wrap .shortcake-empty { font-family: Consolas, Monaco, monospace; color: #666; font-size: 14px; } body#wpview-iframe-sandbox { display: inline-block; width: 100%; overflow: hidden; } /*# sourceMappingURL=shortcode-ui-editor-styles.css.map */ if (!defined('ABSPATH')) die('No direct access allowed'); if (!defined('WP_OPTIMIZE_MINIFY_DIR')) { die('No direct access.'); } if (!function_exists('wpo_delete_files')) { include WPO_PLUGIN_MAIN_PATH.'cache/file-based-page-cache-functions.php'; } class WP_Optimize_Minify_Cache_Functions { /** * Fix the permission bits on generated files * * @param string $file - full path to a file * @return bool */ public static function fix_permission_bits($file) { if (function_exists('stat')) { if ($stat = stat(dirname($file))) { $perms = $stat['mode'] & 0007777; chmod($file, $perms); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod -- N/A clearstatcache(); return true; } } // Get permissions from parent directory $perms = 0777; if (function_exists('stat')) { if ($stat = stat(dirname($file))) { $perms = $stat['mode'] & 0007777; } } if (file_exists($file)) { if (($perms & ~umask() !== $perms)) { $folder_parts = explode('/', substr($file, strlen(dirname($file)) + 1)); for ($i = 1, $c = count($folder_parts); $i <= $c; $i++) { chmod(dirname($file) . '/' . implode('/', array_slice($folder_parts, 0, $i)), $perms); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod -- N/A } } } return true; } /** * Get cache directories and urls * * @return array */ public static function cache_path() { // get latest time stamp $cache_time = wp_optimize_minify_config()->get('last-cache-update'); $cache_base_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time"; $cache_dir_url = WPO_CACHE_MIN_FILES_URL . "/$cache_time/assets"; $tmp_dir = WPO_CACHE_MIN_FILES_DIR . "/tmp"; $header_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time/header"; $cache_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time/assets"; // Create directories $dirs = array($cache_dir, $tmp_dir, $header_dir); foreach ($dirs as $target) { $enabled = (bool) wp_optimize_minify_config()->get('enabled'); if (false === $enabled) break; if (!is_dir($target) && !wp_mkdir_p($target)) { error_log('WP_Optimize_Minify_Cache_Functions::cache_path(): The folder "'.$target.'" could not be created.'); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return array( 'tmpdir' => $tmp_dir, 'cachedir' => $cache_dir, 'cachedirurl' => $cache_dir_url, 'headerdir' => $header_dir, 'cachebasedir' => $cache_base_dir ); } /** * Increment file names * * @return int */ public static function cache_increment() { $stamp = time(); wp_optimize_minify_config()->update(array( 'last-cache-update' => $stamp )); return $stamp; } /** * Reset the cache (Increment + purge temp files) */ public static function reset() { self::cache_increment(); self::purge_temp_files(); } /** * Will delete temporary intermediate stuff but leave final css/js alone for compatibility * * @return array */ public static function purge_temp_files() { // get cache directories and urls $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $header_dir = $cache_path['headerdir']; // delete temporary directories only if (is_dir($tmp_dir)) { wpo_delete_files($tmp_dir); } if (is_dir($header_dir)) { wpo_delete_files($header_dir); } /** * Action triggered after purging temporary files */ do_action('wpo_min_after_purge_temp_files'); return array( 'tmpdir' => $tmp_dir, 'headerdir' => $header_dir, ); } /** * Purge supported hosting and plugins * * @return array An array of caches purged message */ public static function purge_others() { /** * Action triggered before purging other plugins cache */ do_action('wpo_min_before_purge_others'); // WordPress default cache if (function_exists('wp_cache_flush')) { wp_cache_flush(); } // Purge WP-Optimize $is_cache_purged = WP_Optimize()->get_page_cache()->purge(); if ($is_cache_purged) WP_Optimize()->get_page_cache()->file_log("Full Cache Purge triggered by: ". __METHOD__); // Store the messages of purged cache if it was successful $result = array(); // When plugins have a simple method, add them to the array ('Plugin Name' => 'method_name') $others = array( 'WP Super Cache' => 'wp_cache_clear_cache', 'W3 Total Cache' => 'w3tc_pgcache_flush', 'WP Fastest Cache' => 'wpfc_clear_all_cache', 'WP Rocket' => 'rocket_clean_domain', 'Cachify' => 'cachify_flush_cache', 'Comet Cache' => array('comet_cache', 'clear'), 'SG Optimizer' => 'sg_cachepress_purge_cache', 'Pantheon' => 'pantheon_wp_clear_edge_all', 'Zen Cache' => array('zencache', 'clear'), 'Breeze' => array('Breeze_PurgeCache', 'breeze_cache_flush'), 'Swift Performance' => array('Swift_Performance_Cache', 'clear_all_cache'), ); foreach ($others as $plugin => $method) { if (is_callable($method)) { call_user_func($method); $result[] = self::get_caches_purged_message($plugin); } } // Purge LiteSpeed Cache if (is_callable(array('LiteSpeed_Cache_Tags', 'add_purge_tag'))) { LiteSpeed_Cache_Tags::add_purge_tag('*'); $result[] = self::get_caches_purged_message('LiteSpeed Cache'); } // Purge Hyper Cache if (class_exists('HyperCache')) { do_action('autoptimize_action_cachepurged'); $result[] = self::get_caches_purged_message('Hyper Cache'); } // Purge Godaddy Managed WordPress Hosting (Varnish + APC) if (class_exists('WPaaS\Plugin')) { self::godaddy_request('BAN'); // translators: %s is a remote cache system name `Go Daddy Varnish` $result[] = sprintf(__('A cache purge request has been sent to %s.', 'wp-optimize'), 'Go Daddy Varnish') . ' ' . __('Please note that it may not work every time, due to cache rate limiting by your host.', 'wp-optimize'); } // purge cache enabler if (has_action('ce_clear_cache')) { do_action('ce_clear_cache'); $result[] = self::get_caches_purged_message('Cache Enabler'); } // Purge WP Engine if (class_exists("WpeCommon")) { if (method_exists('WpeCommon', 'purge_memcached')) { WpeCommon::purge_memcached(); } if (method_exists('WpeCommon', 'clear_maxcdn_cache')) { WpeCommon::clear_maxcdn_cache(); } if (method_exists('WpeCommon', 'purge_varnish_cache')) { WpeCommon::purge_varnish_cache(); } if (method_exists('WpeCommon', 'purge_memcached') || method_exists('WpeCommon', 'clear_maxcdn_cache') || method_exists('WpeCommon', 'purge_varnish_cache')) { // translators: %s is a remote cache system name `WP Engine` $result[] = sprintf(__('A cache purge request has been sent to %s.', 'wp-optimize'), 'WP Engine') . ' ' . __('Please note that it may not work every time, due to cache rate limiting by your host.', 'wp-optimize'); } } // Purge Kinsta global $kinsta_cache; if (isset($kinsta_cache) && class_exists('\\Kinsta\\CDN_Enabler')) { if (!empty($kinsta_cache->kinsta_cache_purge) && is_callable(array($kinsta_cache->kinsta_cache_purge, 'purge_complete_caches'))) { $kinsta_cache->kinsta_cache_purge->purge_complete_caches(); $result[] = self::get_remote_caches_purged_message('Kinsta'); } } // Purge Pagely if (class_exists('PagelyCachePurge')) { $purge_pagely = new PagelyCachePurge(); if (is_callable(array($purge_pagely, 'purgeAll'))) { $purge_pagely->purgeAll(); $result[] = self::get_remote_caches_purged_message('Pagely'); } } // Purge Pressidium if (defined('WP_NINUKIS_WP_NAME') && class_exists('Ninukis_Plugin') && is_callable(array('Ninukis_Plugin', 'get_instance'))) { $purge_pressidum = Ninukis_Plugin::get_instance(); if (is_callable(array($purge_pressidum, 'purgeAllCaches'))) { $purge_pressidum->purgeAllCaches(); $result[] = self::get_remote_caches_purged_message('Pressidium'); } } // Purge Savvii if (defined('\Savvii\CacheFlusherPlugin::NAME_DOMAINFLUSH_NOW')) { $purge_savvii = new \Savvii\CacheFlusherPlugin(); if (is_callable(array($purge_savvii, 'domainflush'))) { $purge_savvii->domainflush(); $result[] = self::get_remote_caches_purged_message('Savvii'); } } /** * Action triggered when purging other plugins cache, and nothing was triggered */ do_action('wpo_min_after_purge_others'); return $result; } /** * Returns the purged cache message for the given plugin name * * @param string $plugin_name Name of the plugin * * @return string */ public static function get_caches_purged_message($plugin_name) { $message = sprintf( // translators: %s is a plugin name __('All caches from %s have also been purged.', 'wp-optimize'), '' . esc_html($plugin_name) . '' ); return $message; } /** * Returns remote purged cache message for given host name * * @param string $host_name * * @return string */ public static function get_remote_caches_purged_message($host_name) { $message = sprintf( // translators: %s is a remote cache system name __('A cache purge request has been sent to %s.', 'wp-optimize'), '' . esc_html($host_name) . '' ); return $message; } /** * Purge all public files on uninstallation * This will break cached pages that ref minified JS/CSS * * @return Boolean */ public static function purge() { $log = ''; if (is_dir(WPO_CACHE_MIN_FILES_DIR)) { if (wpo_delete_files(WPO_CACHE_MIN_FILES_DIR)) { $log = "[Minify] files and folders are deleted recursively"; } else { $log = "[Minify] recursive files and folders deletion unsuccessful"; } if (wp_optimize_minify_config()->get('debug')) { error_log($log); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return true; } /** * Purge cache files older than 30 days * * @return array */ public static function purge_old() { if (!class_exists('WP_Optimize_Minify_Config')) { include_once WPO_PLUGIN_MAIN_PATH . 'minify/class-wp-optimize-minify-config.php'; } $cache_time = wp_optimize_minify_config()->get('last-cache-update'); $cache_lifespan = wp_optimize_minify_config()->get('cache_lifespan'); /** * Minify cache lifespan * * @param int The minify cache expiry timestamp */ $expires = apply_filters('wp_optimize_minify_cache_expiry_time', time() - 86400 * $cache_lifespan); $log = array(); // get all directories that are a direct child of current directory if (is_dir(WPO_CACHE_MIN_FILES_DIR) && wp_is_writable(dirname(WPO_CACHE_MIN_FILES_DIR))) { if ($handle = opendir(WPO_CACHE_MIN_FILES_DIR)) { while (false !== ($d = readdir($handle))) { if ('.' === $d || '..' === $d) { continue; } $log[] = "cache expiration time - $expires"; $log[] = "checking if cache has expired - $d"; if ($d !== $cache_time && (is_numeric($d) && $d <= $expires)) { $dir = WPO_CACHE_MIN_FILES_DIR.'/'.$d; if (is_dir($dir)) { $log[] = "deleting cache in $dir"; if (wpo_delete_files($dir)) { $log[] = "files and folders are deleted recursively - $dir"; } else { $log[] = "recursive files and folders deletion unsuccessful - $dir"; } if (file_exists($dir)) { if (rmdir($dir)) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- N/A $log[] = "folder deleted successfully - $dir"; } else { $log[] = "folder deletion unsuccessful - $dir"; } } } } } closedir($handle); } } if (wp_optimize_minify_config()->get('debug')) { foreach ($log as $message) { error_log($message); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return $log; } /** * Get transients from the disk * * @param string $key * @return string|boolean */ public static function get_transient($key) { $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $f = $tmp_dir.'/'.$key.'.transient'; clearstatcache(); if (file_exists($f)) { return file_get_contents($f); } else { return false; } } /** * Set cache on disk * * @param string $key * @param mixed $code * * @return boolean */ public static function set_transient($key, $code) { if (is_null($code) || empty($code)) { return false; } $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $f = $tmp_dir.'/'.$key.'.transient'; file_put_contents($f, $code); self::fix_permission_bits($f); return true; } /** * Get the cache size and count * * @param string $folder * @return string */ public static function get_cachestats($folder) { $stats = WP_Optimize_Utils::get_folder_stats($folder); // Translators: %s: number of files. $translated_file_count = sprintf(_n('%s file', '%s files', $stats['file_count'], 'wp-optimize'), number_format_i18n($stats['file_count'])); return WP_Optimize()->format_size($stats['size']) . ' (' . $translated_file_count . ')'; } /** * Purge GoDaddy Managed WordPress Hosting (Varnish) * * Source: https://github.com/wp-media/wp-rocket/blob/master/inc/3rd-party/hosting/godaddy.php * * @param string $method * @param string|null $url */ public static function godaddy_request($method, $url = null) { $url = empty($url) ? home_url() : $url; $host = wp_parse_url($url, PHP_URL_HOST); $url = set_url_scheme(str_replace($host, WPaas\Plugin::vip(), $url), 'http'); wp_cache_flush(); update_option('gd_system_last_cache_flush', time()); // purge apc wp_remote_request(esc_url_raw($url), array('method' => $method, 'blocking' => false, 'headers' => array('Host' => $host))); } /** * List all cache files * * @param integer $stamp A timestamp * @param boolean $use_cache If true, do not use transient value * @return array */ public static function get_cached_files($stamp = 0, $use_cache = true) { if ($use_cache && $files = get_transient('wpo_minify_get_cached_files')) { return $files; } $cache_path = self::cache_path(); $cache_dir = $cache_path['cachedir']; $size = self::get_cachestats($cache_dir); $total_size = self::get_cachestats(WPO_CACHE_MIN_FILES_DIR); $o = wp_optimize_minify_config()->get(); $cache_time = (0 === $o['last-cache-update']) ? __('Never.', 'wp-optimize') : self::format_date_time($o['last-cache-update']); $return = array( 'js' => array(), 'css' => array(), 'stamp' => $stamp, 'cachesize' => esc_html($size), 'total_cache_size' => esc_html($total_size), 'cacheTime' => $cache_time, 'cachePath' => $cache_path['cachedir'] ); // Inspect directory with opendir, since glob might not be available in some systems clearstatcache(); if (is_dir($cache_dir.'/') && $handle = opendir($cache_dir.'/')) { while (false !== ($file = readdir($handle))) { $file = $cache_dir.'/'.$file; $ext = pathinfo($file, PATHINFO_EXTENSION); if (in_array($ext, array('js', 'css'))) { $log = self::generate_log($file.'.json' ); $min_css = substr($file, 0, -4).'.min.css'; $minjs = substr($file, 0, -3).'.min.js'; $file_name = basename($file); $file_url = trailingslashit($cache_path['cachedirurl']).$file_name; if ('css' === $ext && file_exists($min_css)) { $file_name = basename($min_css); } if ('js' === $ext && file_exists($minjs)) { $file_name = basename($minjs); } $file_size = WP_Optimize()->format_size(filesize($file)); $uid = hash('adler32', $file_name); array_push($return[$ext], array('uid' => $uid, 'filename' => $file_name, 'file_url' => $file_url, 'log' => $log, 'fsize' => $file_size)); } } closedir($handle); } set_transient('wpo_minify_get_cached_files', $return, DAY_IN_SECONDS); return $return; } /** * Generate log information from a json file. * * @param string $file Full path of log file. * * @return mixed Could be either a 'json_decode' object upon successful parsing of the JSON file, or a stdClass object * upon failure. In the case of stdClass object, $obj->error will contain the error message. */ public static function generate_log($file) { $error_log = new stdClass(); $cache_path = self::cache_path(); $file_name = basename($file); $file_url = trailingslashit($cache_path['cachedirurl']) . $file_name; $file_link_html = '' . $file_name . ''; if (!file_exists($file)) { // translators: %s is a log file link $error_log->error = sprintf(__('Log file %s is missing', 'wp-optimize'), $file_link_html); return $error_log; } $log = json_decode(file_get_contents($file)); $is_valid_json = json_last_error() === JSON_ERROR_NONE; if (!$is_valid_json) { // translators: %1$s is a log file link, %2$s is the error message $error_log->error = sprintf(__('JSON error in file %1$s | Error details: %2$s', 'wp-optimize'), $file_link_html, json_last_error_msg()); return $error_log; } if (!isset($log->header) || !isset($log->files)) { // translators: %s is a log file link $error_log->error = sprintf(__('Some data is missing in the log file %s', 'wp-optimize'), $file_link_html); return $error_log; } return $log; } /** * Format a timestamp using WordPress's date_format and time_format * * @param integer $timestamp - The timestamp * @return string */ public static function format_date_time($timestamp) { return WP_Optimize()->format_date_time($timestamp); } /** * Format the log created when merging assets. Called via array_map * * @param array $files The files array, containing the 'log' object or array. * @return array */ public static function format_file_logs($files) { $files['log'] = WP_Optimize()->include_template( 'minify/cached-file-log.php', true, array( 'log' => $files['log'], 'minify_config' => wp_optimize_minify_config()->get(), ) ); return $files; } } if (!defined('ABSPATH')) die('No direct access allowed'); if (!defined('WP_OPTIMIZE_MINIFY_DIR')) { die('No direct access.'); } if (!function_exists('wpo_delete_files')) { include WPO_PLUGIN_MAIN_PATH.'cache/file-based-page-cache-functions.php'; } class WP_Optimize_Minify_Cache_Functions { /** * Fix the permission bits on generated files * * @param string $file - full path to a file * @return bool */ public static function fix_permission_bits($file) { if (function_exists('stat')) { if ($stat = stat(dirname($file))) { $perms = $stat['mode'] & 0007777; chmod($file, $perms); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod -- N/A clearstatcache(); return true; } } // Get permissions from parent directory $perms = 0777; if (function_exists('stat')) { if ($stat = stat(dirname($file))) { $perms = $stat['mode'] & 0007777; } } if (file_exists($file)) { if (($perms & ~umask() !== $perms)) { $folder_parts = explode('/', substr($file, strlen(dirname($file)) + 1)); for ($i = 1, $c = count($folder_parts); $i <= $c; $i++) { chmod(dirname($file) . '/' . implode('/', array_slice($folder_parts, 0, $i)), $perms); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod -- N/A } } } return true; } /** * Get cache directories and urls * * @return array */ public static function cache_path() { // get latest time stamp $cache_time = wp_optimize_minify_config()->get('last-cache-update'); $cache_base_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time"; $cache_dir_url = WPO_CACHE_MIN_FILES_URL . "/$cache_time/assets"; $tmp_dir = WPO_CACHE_MIN_FILES_DIR . "/tmp"; $header_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time/header"; $cache_dir = WPO_CACHE_MIN_FILES_DIR . "/$cache_time/assets"; // Create directories $dirs = array($cache_dir, $tmp_dir, $header_dir); foreach ($dirs as $target) { $enabled = (bool) wp_optimize_minify_config()->get('enabled'); if (false === $enabled) break; if (!is_dir($target) && !wp_mkdir_p($target)) { error_log('WP_Optimize_Minify_Cache_Functions::cache_path(): The folder "'.$target.'" could not be created.'); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return array( 'tmpdir' => $tmp_dir, 'cachedir' => $cache_dir, 'cachedirurl' => $cache_dir_url, 'headerdir' => $header_dir, 'cachebasedir' => $cache_base_dir ); } /** * Increment file names * * @return int */ public static function cache_increment() { $stamp = time(); wp_optimize_minify_config()->update(array( 'last-cache-update' => $stamp )); return $stamp; } /** * Reset the cache (Increment + purge temp files) */ public static function reset() { self::cache_increment(); self::purge_temp_files(); } /** * Will delete temporary intermediate stuff but leave final css/js alone for compatibility * * @return array */ public static function purge_temp_files() { // get cache directories and urls $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $header_dir = $cache_path['headerdir']; // delete temporary directories only if (is_dir($tmp_dir)) { wpo_delete_files($tmp_dir); } if (is_dir($header_dir)) { wpo_delete_files($header_dir); } /** * Action triggered after purging temporary files */ do_action('wpo_min_after_purge_temp_files'); return array( 'tmpdir' => $tmp_dir, 'headerdir' => $header_dir, ); } /** * Purge supported hosting and plugins * * @return array An array of caches purged message */ public static function purge_others() { /** * Action triggered before purging other plugins cache */ do_action('wpo_min_before_purge_others'); // WordPress default cache if (function_exists('wp_cache_flush')) { wp_cache_flush(); } // Purge WP-Optimize $is_cache_purged = WP_Optimize()->get_page_cache()->purge(); if ($is_cache_purged) WP_Optimize()->get_page_cache()->file_log("Full Cache Purge triggered by: ". __METHOD__); // Store the messages of purged cache if it was successful $result = array(); // When plugins have a simple method, add them to the array ('Plugin Name' => 'method_name') $others = array( 'WP Super Cache' => 'wp_cache_clear_cache', 'W3 Total Cache' => 'w3tc_pgcache_flush', 'WP Fastest Cache' => 'wpfc_clear_all_cache', 'WP Rocket' => 'rocket_clean_domain', 'Cachify' => 'cachify_flush_cache', 'Comet Cache' => array('comet_cache', 'clear'), 'SG Optimizer' => 'sg_cachepress_purge_cache', 'Pantheon' => 'pantheon_wp_clear_edge_all', 'Zen Cache' => array('zencache', 'clear'), 'Breeze' => array('Breeze_PurgeCache', 'breeze_cache_flush'), 'Swift Performance' => array('Swift_Performance_Cache', 'clear_all_cache'), ); foreach ($others as $plugin => $method) { if (is_callable($method)) { call_user_func($method); $result[] = self::get_caches_purged_message($plugin); } } // Purge LiteSpeed Cache if (is_callable(array('LiteSpeed_Cache_Tags', 'add_purge_tag'))) { LiteSpeed_Cache_Tags::add_purge_tag('*'); $result[] = self::get_caches_purged_message('LiteSpeed Cache'); } // Purge Hyper Cache if (class_exists('HyperCache')) { do_action('autoptimize_action_cachepurged'); $result[] = self::get_caches_purged_message('Hyper Cache'); } // Purge Godaddy Managed WordPress Hosting (Varnish + APC) if (class_exists('WPaaS\Plugin')) { self::godaddy_request('BAN'); // translators: %s is a remote cache system name `Go Daddy Varnish` $result[] = sprintf(__('A cache purge request has been sent to %s.', 'wp-optimize'), 'Go Daddy Varnish') . ' ' . __('Please note that it may not work every time, due to cache rate limiting by your host.', 'wp-optimize'); } // purge cache enabler if (has_action('ce_clear_cache')) { do_action('ce_clear_cache'); $result[] = self::get_caches_purged_message('Cache Enabler'); } // Purge WP Engine if (class_exists("WpeCommon")) { if (method_exists('WpeCommon', 'purge_memcached')) { WpeCommon::purge_memcached(); } if (method_exists('WpeCommon', 'clear_maxcdn_cache')) { WpeCommon::clear_maxcdn_cache(); } if (method_exists('WpeCommon', 'purge_varnish_cache')) { WpeCommon::purge_varnish_cache(); } if (method_exists('WpeCommon', 'purge_memcached') || method_exists('WpeCommon', 'clear_maxcdn_cache') || method_exists('WpeCommon', 'purge_varnish_cache')) { // translators: %s is a remote cache system name `WP Engine` $result[] = sprintf(__('A cache purge request has been sent to %s.', 'wp-optimize'), 'WP Engine') . ' ' . __('Please note that it may not work every time, due to cache rate limiting by your host.', 'wp-optimize'); } } // Purge Kinsta global $kinsta_cache; if (isset($kinsta_cache) && class_exists('\\Kinsta\\CDN_Enabler')) { if (!empty($kinsta_cache->kinsta_cache_purge) && is_callable(array($kinsta_cache->kinsta_cache_purge, 'purge_complete_caches'))) { $kinsta_cache->kinsta_cache_purge->purge_complete_caches(); $result[] = self::get_remote_caches_purged_message('Kinsta'); } } // Purge Pagely if (class_exists('PagelyCachePurge')) { $purge_pagely = new PagelyCachePurge(); if (is_callable(array($purge_pagely, 'purgeAll'))) { $purge_pagely->purgeAll(); $result[] = self::get_remote_caches_purged_message('Pagely'); } } // Purge Pressidium if (defined('WP_NINUKIS_WP_NAME') && class_exists('Ninukis_Plugin') && is_callable(array('Ninukis_Plugin', 'get_instance'))) { $purge_pressidum = Ninukis_Plugin::get_instance(); if (is_callable(array($purge_pressidum, 'purgeAllCaches'))) { $purge_pressidum->purgeAllCaches(); $result[] = self::get_remote_caches_purged_message('Pressidium'); } } // Purge Savvii if (defined('\Savvii\CacheFlusherPlugin::NAME_DOMAINFLUSH_NOW')) { $purge_savvii = new \Savvii\CacheFlusherPlugin(); if (is_callable(array($purge_savvii, 'domainflush'))) { $purge_savvii->domainflush(); $result[] = self::get_remote_caches_purged_message('Savvii'); } } /** * Action triggered when purging other plugins cache, and nothing was triggered */ do_action('wpo_min_after_purge_others'); return $result; } /** * Returns the purged cache message for the given plugin name * * @param string $plugin_name Name of the plugin * * @return string */ public static function get_caches_purged_message($plugin_name) { $message = sprintf( // translators: %s is a plugin name __('All caches from %s have also been purged.', 'wp-optimize'), '' . esc_html($plugin_name) . '' ); return $message; } /** * Returns remote purged cache message for given host name * * @param string $host_name * * @return string */ public static function get_remote_caches_purged_message($host_name) { $message = sprintf( // translators: %s is a remote cache system name __('A cache purge request has been sent to %s.', 'wp-optimize'), '' . esc_html($host_name) . '' ); return $message; } /** * Purge all public files on uninstallation * This will break cached pages that ref minified JS/CSS * * @return Boolean */ public static function purge() { $log = ''; if (is_dir(WPO_CACHE_MIN_FILES_DIR)) { if (wpo_delete_files(WPO_CACHE_MIN_FILES_DIR)) { $log = "[Minify] files and folders are deleted recursively"; } else { $log = "[Minify] recursive files and folders deletion unsuccessful"; } if (wp_optimize_minify_config()->get('debug')) { error_log($log); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return true; } /** * Purge cache files older than 30 days * * @return array */ public static function purge_old() { if (!class_exists('WP_Optimize_Minify_Config')) { include_once WPO_PLUGIN_MAIN_PATH . 'minify/class-wp-optimize-minify-config.php'; } $cache_time = wp_optimize_minify_config()->get('last-cache-update'); $cache_lifespan = wp_optimize_minify_config()->get('cache_lifespan'); /** * Minify cache lifespan * * @param int The minify cache expiry timestamp */ $expires = apply_filters('wp_optimize_minify_cache_expiry_time', time() - 86400 * $cache_lifespan); $log = array(); // get all directories that are a direct child of current directory if (is_dir(WPO_CACHE_MIN_FILES_DIR) && wp_is_writable(dirname(WPO_CACHE_MIN_FILES_DIR))) { if ($handle = opendir(WPO_CACHE_MIN_FILES_DIR)) { while (false !== ($d = readdir($handle))) { if ('.' === $d || '..' === $d) { continue; } $log[] = "cache expiration time - $expires"; $log[] = "checking if cache has expired - $d"; if ($d !== $cache_time && (is_numeric($d) && $d <= $expires)) { $dir = WPO_CACHE_MIN_FILES_DIR.'/'.$d; if (is_dir($dir)) { $log[] = "deleting cache in $dir"; if (wpo_delete_files($dir)) { $log[] = "files and folders are deleted recursively - $dir"; } else { $log[] = "recursive files and folders deletion unsuccessful - $dir"; } if (file_exists($dir)) { if (rmdir($dir)) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- N/A $log[] = "folder deleted successfully - $dir"; } else { $log[] = "folder deletion unsuccessful - $dir"; } } } } } closedir($handle); } } if (wp_optimize_minify_config()->get('debug')) { foreach ($log as $message) { error_log($message); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Used for debugging } } return $log; } /** * Get transients from the disk * * @param string $key * @return string|boolean */ public static function get_transient($key) { $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $f = $tmp_dir.'/'.$key.'.transient'; clearstatcache(); if (file_exists($f)) { return file_get_contents($f); } else { return false; } } /** * Set cache on disk * * @param string $key * @param mixed $code * * @return boolean */ public static function set_transient($key, $code) { if (is_null($code) || empty($code)) { return false; } $cache_path = self::cache_path(); $tmp_dir = $cache_path['tmpdir']; $f = $tmp_dir.'/'.$key.'.transient'; file_put_contents($f, $code); self::fix_permission_bits($f); return true; } /** * Get the cache size and count * * @param string $folder * @return string */ public static function get_cachestats($folder) { $stats = WP_Optimize_Utils::get_folder_stats($folder); // Translators: %s: number of files. $translated_file_count = sprintf(_n('%s file', '%s files', $stats['file_count'], 'wp-optimize'), number_format_i18n($stats['file_count'])); return WP_Optimize()->format_size($stats['size']) . ' (' . $translated_file_count . ')'; } /** * Purge GoDaddy Managed WordPress Hosting (Varnish) * * Source: https://github.com/wp-media/wp-rocket/blob/master/inc/3rd-party/hosting/godaddy.php * * @param string $method * @param string|null $url */ public static function godaddy_request($method, $url = null) { $url = empty($url) ? home_url() : $url; $host = wp_parse_url($url, PHP_URL_HOST); $url = set_url_scheme(str_replace($host, WPaas\Plugin::vip(), $url), 'http'); wp_cache_flush(); update_option('gd_system_last_cache_flush', time()); // purge apc wp_remote_request(esc_url_raw($url), array('method' => $method, 'blocking' => false, 'headers' => array('Host' => $host))); } /** * List all cache files * * @param integer $stamp A timestamp * @param boolean $use_cache If true, do not use transient value * @return array */ public static function get_cached_files($stamp = 0, $use_cache = true) { if ($use_cache && $files = get_transient('wpo_minify_get_cached_files')) { return $files; } $cache_path = self::cache_path(); $cache_dir = $cache_path['cachedir']; $size = self::get_cachestats($cache_dir); $total_size = self::get_cachestats(WPO_CACHE_MIN_FILES_DIR); $o = wp_optimize_minify_config()->get(); $cache_time = (0 === $o['last-cache-update']) ? __('Never.', 'wp-optimize') : self::format_date_time($o['last-cache-update']); $return = array( 'js' => array(), 'css' => array(), 'stamp' => $stamp, 'cachesize' => esc_html($size), 'total_cache_size' => esc_html($total_size), 'cacheTime' => $cache_time, 'cachePath' => $cache_path['cachedir'] ); // Inspect directory with opendir, since glob might not be available in some systems clearstatcache(); if (is_dir($cache_dir.'/') && $handle = opendir($cache_dir.'/')) { while (false !== ($file = readdir($handle))) { $file = $cache_dir.'/'.$file; $ext = pathinfo($file, PATHINFO_EXTENSION); if (in_array($ext, array('js', 'css'))) { $log = self::generate_log($file.'.json' ); $min_css = substr($file, 0, -4).'.min.css'; $minjs = substr($file, 0, -3).'.min.js'; $file_name = basename($file); $file_url = trailingslashit($cache_path['cachedirurl']).$file_name; if ('css' === $ext && file_exists($min_css)) { $file_name = basename($min_css); } if ('js' === $ext && file_exists($minjs)) { $file_name = basename($minjs); } $file_size = WP_Optimize()->format_size(filesize($file)); $uid = hash('adler32', $file_name); array_push($return[$ext], array('uid' => $uid, 'filename' => $file_name, 'file_url' => $file_url, 'log' => $log, 'fsize' => $file_size)); } } closedir($handle); } set_transient('wpo_minify_get_cached_files', $return, DAY_IN_SECONDS); return $return; } /** * Generate log information from a json file. * * @param string $file Full path of log file. * * @return mixed Could be either a 'json_decode' object upon successful parsing of the JSON file, or a stdClass object * upon failure. In the case of stdClass object, $obj->error will contain the error message. */ public static function generate_log($file) { $error_log = new stdClass(); $cache_path = self::cache_path(); $file_name = basename($file); $file_url = trailingslashit($cache_path['cachedirurl']) . $file_name; $file_link_html = '' . $file_name . ''; if (!file_exists($file)) { // translators: %s is a log file link $error_log->error = sprintf(__('Log file %s is missing', 'wp-optimize'), $file_link_html); return $error_log; } $log = json_decode(file_get_contents($file)); $is_valid_json = json_last_error() === JSON_ERROR_NONE; if (!$is_valid_json) { // translators: %1$s is a log file link, %2$s is the error message $error_log->error = sprintf(__('JSON error in file %1$s | Error details: %2$s', 'wp-optimize'), $file_link_html, json_last_error_msg()); return $error_log; } if (!isset($log->header) || !isset($log->files)) { // translators: %s is a log file link $error_log->error = sprintf(__('Some data is missing in the log file %s', 'wp-optimize'), $file_link_html); return $error_log; } return $log; } /** * Format a timestamp using WordPress's date_format and time_format * * @param integer $timestamp - The timestamp * @return string */ public static function format_date_time($timestamp) { return WP_Optimize()->format_date_time($timestamp); } /** * Format the log created when merging assets. Called via array_map * * @param array $files The files array, containing the 'log' object or array. * @return array */ public static function format_file_logs($files) { $files['log'] = WP_Optimize()->include_template( 'minify/cached-file-log.php', true, array( 'log' => $files['log'], 'minify_config' => wp_optimize_minify_config()->get(), ) ); return $files; } } Best Fusion International Cuisines in Islamabad: El Momento
Enjoy the thrill of the World Cup with our Delectable Platters.

How El Momento Blends Pakistani and International Cuisines

Islamabad’s culinary scene is a vibrant tapestry, but few restaurants weave together flavors with the artistry and flair of El Momento. In a city where traditional tastes reign supreme, El Momento stands out as a pioneer in fusion cuisine, masterfully blending the rich, aromatic heritage of Pakistani dishes with the sophisticated techniques and diverse ingredients of international gastronomy. This is not a question of mixing ingredients; it is a matter of creating a cacophony of tastes that excites the palate and tells the world story.

The Art of Fusion Flavors

A Celebration of Creativity and Culture

In its heart, fusion cooking is a matter of creativity – evolving what is known and redefining it in terms of something new. El Momento does exactly that with enthusiasm, taking comfort food Pakistani essentials and elevating them, and global favorites and infusing them with a local twist. Imagine the tender, slow-cooked richness of a Pakistani stew, but now infused with the spices of the Mediterranean, or a flawlessly grilled international steak with a kick from a spicy Pakistani spice mix. This is what happens in the kitchen at El Momento.

Spices as the Soul of Fusion

A source of strength for Pakistani food is its rich use of spices. The earthy heat of coriander and cumin, fiery undertones of red chili, and sweet perfumes of cardamom all make up the heart of Pakistani cuisine. El Momento’s chefs understand this well, and rather than masking these flavors, they integrate them in a smart manner into foreign dishes. This results in dishes that are familiar and yet excitingly new. Take, for instance, their highly-recommended steaks. While the chops themselves can be imported across internationally, the side dishes and marinades are prone to having imperceptibly subtle notes of domestic spices infused into them, with a unique depth that is not in line with the typical steakhouse experience in Islamabad.

Cooking Techniques with Global Flair

A Kitchen Without Borders

Beyond the spices, El Momento’s cooking methods also attest to this beautiful blending. This blending of culinary heritage is what makes dining at El Momento such a fully immersive experience. It’s evidence that food has no borders, and that the most satisfying flavors always happen when cultures come together in the kitchen.

The Dining Experience at El Momento

A Harmonious Ambiance

The ambiance at El Momento enhances this international-local sensation even further. Within the restaurant, you’re greeted by a homey, inviting atmosphere, where modern furnishings coexist tastefully with a comfortable, upscale feel. It’s a space that encourages you to unwind regardless of whether you’re dining casually with friends or out celebrating an occasion. This specially chosen atmosphere is the culmination of El Momento’s culinary philosophy: an elegant union of the new and the old, of the universal and the local.

Quality at Every Step

El Momento’s focus on quality ingredients is also the top priority. Whether the freshest local fruits and vegetables or the finest imported meats, each ingredient is chosen with care to provide the very best in taste and freshness. This focus, along with the culinary staff’s knowledge, leads to meals that are not only great-tasting but consistently so.

Why El Momento Leads the Fusion Revolution

In a progressively globalized world, in which the culinary boundaries are being challenged at all times, El Momento is at the forefront of this exciting revolution in Islamabad. They are not just dishing out food; they are crafting experiences, embarking the visitors on a gastronomic experience embracing the finest of Pakistani and international cuisine. If you want to experience new taste sensations and discover the exciting possibility of fusion food in Islamabad, El Momento is a must-visit destination.

Explore:

Best restaurants in Rawalpindi

How Is Steak Different from Traditional Pakistani BBQ?

FAQs

Q1: What exactly is “fusion cuisine” at El Momento?

At El Momento, fusion cuisine means expertly blending the distinct flavors, ingredients, and cooking techniques of traditional Pakistani dishes with those of various international cuisines. This creates unique and exciting dishes that offer a fresh perspective on familiar tastes, ranging from Pakistani-spiced steaks to internationally inspired curries.

Q2: Are there options for different dietary preferences at El Momento?

Yes, El Momento strives to cater to a variety of dietary preferences. Our diverse menu includes a range of chicken, beef, and pasta dishes, along with Chinese and Thai selections. We recommend speaking with our staff about your specific dietary needs or allergies, and they will be happy to guide you through the menu or suggest modifications.

Q3: What makes El Momento a unique dining experience in Islamabad?

El Momento stands out in Islamabad due to its pioneering approach to fusion cuisine, combining the best of Pakistani and international flavors in a sophisticated yet welcoming environment. Our commitment to high-quality ingredients, innovative culinary techniques, and a warm ambiance ensures an unforgettable gastronomic adventure that goes beyond traditional dining.