Files
dostavka_vodi/wp-content/plugins/wp-fastest-cache/wpFastestCache.php
User A0264400 75fa754dba fix
2026-04-19 17:13:54 +03:00

2728 lines
91 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
Plugin Name: WP Fastest Cache
Plugin URI: http://wordpress.org/plugins/wp-fastest-cache/
Description: The simplest and fastest WP Cache system
Version: 1.4.7
Author: Emre Vona
Author URI: https://www.wpfastestcache.com/
Text Domain: wp-fastest-cache
Domain Path: /languages/
Copyright (C)2013 Emre Vona
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
if (!defined('WPFC_WP_CONTENT_BASENAME')) {
if (!defined('WPFC_WP_PLUGIN_DIR')) {
if(preg_match("/(\/trunk\/|\/wp-fastest-cache\/)$/", plugin_dir_path( __FILE__ ))){
define("WPFC_WP_PLUGIN_DIR", preg_replace("/(\/trunk\/|\/wp-fastest-cache\/)$/", "", plugin_dir_path( __FILE__ )));
}else if(preg_match("/\\\wp-fastest-cache\/$/", plugin_dir_path( __FILE__ ))){
//D:\hosting\LINEapp\public_html\wp-content\plugins\wp-fastest-cache/
define("WPFC_WP_PLUGIN_DIR", preg_replace("/\\\wp-fastest-cache\/$/", "", plugin_dir_path( __FILE__ )));
}
}
define("WPFC_WP_CONTENT_DIR", dirname(WPFC_WP_PLUGIN_DIR));
define("WPFC_WP_CONTENT_BASENAME", basename(WPFC_WP_CONTENT_DIR));
}
if (!defined('WPFC_MAIN_PATH')) {
define("WPFC_MAIN_PATH", plugin_dir_path( __FILE__ ));
}
if(!isset($GLOBALS["wp_fastest_cache_options"])){
if($wp_fastest_cache_options = get_option("WpFastestCache")){
$GLOBALS["wp_fastest_cache_options"] = json_decode($wp_fastest_cache_options);
}else{
$GLOBALS["wp_fastest_cache_options"] = array();
}
}
function wpfastestcache_activate(){
if($options = get_option("WpFastestCache")){
$post = json_decode($options, true);
include_once('inc/admin.php');
$wpfc = new WpFastestCacheAdmin();
$wpfc->modifyHtaccess($post);
}
}
function wpfastestcache_deactivate(){
$wpfc = new WpFastestCache();
$path = ABSPATH;
if($wpfc->is_subdirectory_install()){
$path = $wpfc->getABSPATH();
}
if(is_file($path.".htaccess") && is_writable($path.".htaccess")){
$htaccess = file_get_contents($path.".htaccess");
$htaccess = preg_replace("/#\s?BEGIN\s?WpFastestCache.*?#\s?END\s?WpFastestCache/s", "", $htaccess);
$htaccess = preg_replace("/#\s?BEGIN\s?GzipWpFastestCache.*?#\s?END\s?GzipWpFastestCache/s", "", $htaccess);
$htaccess = preg_replace("/#\s?BEGIN\s?LBCWpFastestCache.*?#\s?END\s?LBCWpFastestCache/s", "", $htaccess);
$htaccess = preg_replace("/#\s?BEGIN\s?WEBPWpFastestCache.*?#\s?END\s?WEBPWpFastestCache/s", "", $htaccess);
@file_put_contents($path.".htaccess", $htaccess);
}
$wpfc->deleteCache();
}
register_activation_hook( __FILE__, "wpfastestcache_activate");
register_deactivation_hook( __FILE__, "wpfastestcache_deactivate");
class WpFastestCache{
private $systemMessage = "";
private $options = array();
public $noscript = "";
public $content_url = "";
public $deleted_before = false;
public function __construct(){
$this->set_content_url();
$optimize_image_ajax_requests = array("wpfc_revert_image_ajax_request",
"wpfc_statics_ajax_request",
"wpfc_optimize_image_ajax_request",
"wpfc_update_image_list_ajax_request"
);
add_action('wp_ajax_wpfc_delete_cache', array($this, "deleteCacheToolbar"));
add_action('wp_ajax_wpfc_delete_cache_and_minified', array($this, "deleteCssAndJsCacheToolbar"));
add_action('wp_ajax_wpfc_delete_current_page_cache', array($this, "delete_current_page_cache"));
add_action('wp_ajax_wpfc_clear_cache_of_allsites', array($this, "wpfc_clear_cache_of_allsites_callback"));
add_action('wp_ajax_wpfc_toolbar_save_settings', array($this, "wpfc_toolbar_save_settings_callback"));
add_action('wp_ajax_wpfc_toolbar_get_settings', array($this, "wpfc_toolbar_get_settings_callback"));
//add_action('wp_ajax_wpfc_cache_path_save_settings', array($this, "wpfc_cache_path_save_settings_callback"));
add_action( 'wp_ajax_wpfc_save_timeout_pages', array($this, 'wpfc_save_timeout_pages_callback'));
add_action( 'wp_ajax_wpfc_save_exclude_pages', array($this, 'wpfc_save_exclude_pages_callback'));
add_action( 'wp_ajax_wpfc_cdn_options', array($this, 'wpfc_cdn_options_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_remove_cdn_integration', array($this, 'wpfc_remove_cdn_integration_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_pause_cdn_integration', array($this, 'wpfc_pause_cdn_integration_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_start_cdn_integration', array($this, 'wpfc_start_cdn_integration_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_save_cdn_integration', array($this, 'wpfc_save_cdn_integration_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_cdn_template', array($this, 'wpfc_cdn_template_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_check_url', array($this, 'wpfc_check_url_ajax_request_callback'));
add_action( 'wp_ajax_wpfc_cache_statics_get', array($this, 'wpfc_cache_statics_get_callback'));
add_action( 'wp_ajax_wpfc_db_statics', array($this, 'wpfc_db_statics_callback'));
add_action( 'wp_ajax_wpfc_db_fix', array($this, 'wpfc_db_fix_callback'));
add_action( 'rate_post', array($this, 'wp_postratings_clear_fastest_cache'), 10, 2);
add_action( 'user_register', array($this, 'modify_htaccess_for_new_user'), 10, 1);
add_action( 'profile_update', array($this, 'modify_htaccess_for_new_user'), 10, 1);
add_action( 'edit_terms', array($this, 'delete_cache_of_term'), 10, 1);
add_action( 'wp_ajax_wpfc_save_csp', array($this, 'wpfc_save_csp_callback'));
add_action( 'wp_ajax_wpfc_remove_csp', array($this, 'wpfc_remove_csp_callback'));
add_action( 'wp_ajax_wpfc_get_list_csp', array($this, 'wpfc_get_list_csp_callback'));
add_action( 'wp_ajax_wpfc_save_varnish', array($this, 'wpfc_save_varnish_callback'));
add_action( 'wp_ajax_wpfc_remove_varnish', array($this, 'wpfc_remove_varnish_callback'));
add_action( 'wp_ajax_wpfc_pause_varnish', array($this, 'wpfc_pause_varnish_callback'));
add_action( 'wp_ajax_wpfc_start_varnish', array($this, 'wpfc_start_varnish_callback'));
add_action( 'wp_ajax_wpfc_purgecache_varnish', array($this, 'wpfc_purgecache_varnish_callback'));
if(defined("WPFC_CLEAR_CACHE_AFTER_SWITCH_THEME") && WPFC_CLEAR_CACHE_AFTER_SWITCH_THEME){
add_action('after_switch_theme', array($this, 'clear_cache_after_switch_theme'));
}
if(defined("WPFC_CLEAR_CACHE_AFTER_ACTIVATE_DEACTIVATE_PLUGIN") && WPFC_CLEAR_CACHE_AFTER_ACTIVATE_DEACTIVATE_PLUGIN){
add_action('activate_plugin', array($this, 'clear_cache_after_activate_plugin'));
add_action('deactivate_plugin', array($this, 'clear_cache_after_deactivate_plugin'));
}
add_action('upgrader_process_complete', array($this, 'clear_cache_after_update_plugin'), 10, 2);
add_action('upgrader_process_complete', array($this, 'clear_cache_after_update_theme'), 10, 2);
if(defined("WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_CHECKOUT_ORDER_PROCESSED") && WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_CHECKOUT_ORDER_PROCESSED){
}else if(defined("WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_ORDER_STATUS_CHANGED") && WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_ORDER_STATUS_CHANGED){
}else{
// to clear cache after new Woocommerce orders
add_action('woocommerce_order_status_changed', array($this, 'clear_cache_after_woocommerce_order_status_changed'), 1, 1);
}
// kk Star Ratings: to clear the cache of the post after voting
add_action('kksr_rate', array($this, 'clear_cache_on_kksr_rate'));
// Elementor: to clear cache after Maintenance Mode activation/deactivation
add_action('elementor/maintenance_mode/mode_changed', array($this, 'deleteCache'));
// clearing cache hooks
add_action("wpfc_clear_all_cache", array($this, 'deleteCache'), 10, 1);
add_action("wpfc_clear_all_site_cache", array($this, 'wpfc_clear_cache_of_allsites_callback'));
add_action("wpfc_clear_post_cache_by_id", array($this, 'singleDeleteCache'), 10, 2);
// create cache by id hook
add_action("wpfc_create_post_cache_by_id", array($this, 'create_post_cache_by_id'), 10, 1);
// to enable Auto Cache Panel for the classic editor
add_action( 'admin_init', array($this, 'enable_auto_cache_settings_panel'));
// to add settings link
add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array($this, 'action_links'));
// to clear cache after ajax request by other plugins
if(isset($_POST["action"])){
// All In One Schema.org Rich Snippets
if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){
if(isset($_POST["post_id"])){
$this->singleDeleteCache(false, $_POST["post_id"]);
}
}
// Yet Another Stars Rating
if($_POST["action"] == "yasr_send_visitor_rating"){
if(isset($_POST["post_id"])){
// to need call like that because get_permalink() does not work if we call singleDeleteCache() directly
add_action('init', array($this, "singleDeleteCache"));
}
}
}
// to clear /tmpWpfc folder
if(is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
$this->rm_folder_recursively($this->getWpContentDir("/cache/tmpWpfc"));
}
if($this->isPluginActive('wp-polls/wp-polls.php')){
//for WP-Polls
require_once "inc/wp-polls.php";
$wp_polls = new WpPollsForWpFc();
$wp_polls->hook();
}
if(isset($_GET) && isset($_GET["action"]) && in_array($_GET["action"], $optimize_image_ajax_requests)){
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("image.php");
$img = new WpFastestCacheImageOptimisation();
$img->hook();
}
}else if(isset($_GET) && isset($_GET["action"]) && $_GET["action"] == "wpfastestcache"){
if(isset($_GET) && isset($_GET["type"]) && $_GET["type"] == "preload"){
// /?action=wpfastestcache&type=preload
add_action('init', array($this, "create_preload_cache"), 11);
}
if(isset($_GET) && isset($_GET["type"]) && preg_match("/^clearcache(andminified|allsites)*$/i", $_GET["type"])){
// /?action=wpfastestcache&type=clearcache&token=123
// /?action=wpfastestcache&type=clearcacheandminified&token=123
add_action('wp_loaded', array($this, "handle_custom_delete_cache_request"));
}
}else{
$this->setCustomInterval();
$this->options = $this->getOptions();
add_action('transition_post_status', array($this, 'on_all_status_transitions'), 10, 3 );
// when the regular price is updated, the "transition_post_status" action cannot catch it
add_action('woocommerce_update_product', array($this, 'clear_cache_after_woocommerce_update_product'), 10, 1);
$this->commentHooks();
$this->checkCronTime();
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("mobile-cache.php");
if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/statics.php")){
include_once $this->get_premium_path("statics.php");
}
if(!defined('DOING_AJAX')){
include_once $this->get_premium_path("powerful-html.php");
}
}
if(is_admin()){
add_action('wp_loaded', array($this, "load_column"));
if(defined('DOING_AJAX') && DOING_AJAX){
//do nothing
}else{
// to avoid loading menu and optionPage() twice
if(!class_exists("WpFastestCacheAdmin")){
//for wp-panel
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("image.php");
}
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("logs.php");
}
add_action('plugins_loaded', array($this, 'wpfc_load_plugin_textdomain'));
add_action('wp_loaded', array($this, "load_admin_toolbar"));
$this->admin();
}
}
}else{
if(preg_match("/\/([^\/]+)\/([^\/]+(\.css|\.js))(\?.+)?$/", $this->current_url(), $path)){
// for security
if(preg_match("/\.{2,}/", $this->current_url())){
die("May be Directory Traversal Attack");
}
if(is_dir($this->getWpContentDir("/cache/wpfc-minified/").$path[1])){
if($sources = @scandir($this->getWpContentDir("/cache/wpfc-minified/").$path[1], 1)){
if(isset($sources[0])){
// $exist_url = str_replace($path[2], $sources[0], $this->current_url());
// header('Location: ' . $exist_url, true, 301);
// exit;
if(preg_match("/\.css/", $this->current_url())){
header('Content-type: text/css');
}else if(preg_match("/\.js/", $this->current_url())){
header('Content-type: text/js');
}
echo file_get_contents($this->getWpContentDir("/cache/wpfc-minified/").$path[1]."/".$sources[0]);
exit;
}
}
}
if(preg_match("/".basename($this->getWpContentDir("/cache/wpfc-minified/"))."/i", $this->current_url())){
//for non-exists minified files
if(preg_match("/\.css/", $this->current_url())){
header('Content-type: text/css');
die("/* File not found */");
}else if(preg_match("/\.js/", $this->current_url())){
header('Content-type: text/js');
die("//File not found");
}
}
}else{
// to show if the user is logged-in
add_action('wp_loaded', array($this, "load_admin_toolbar"));
//for cache
$this->cache();
}
}
}
}
public function handle_custom_delete_cache_request(){
$action = false;
$wpfc_token = false;
if(defined("WPFC_CLEAR_CACHE_URL_TOKEN") && WPFC_CLEAR_CACHE_URL_TOKEN){
$wpfc_token = WPFC_CLEAR_CACHE_URL_TOKEN;
}else{
$wpfc_token = apply_filters( 'wpfc_clear_cache_url_token', false );
}
if(isset($_GET["token"]) && $_GET["token"]){
if($wpfc_token){
if($wpfc_token == $_GET["token"]){
$action = true;
}else{
die("Wrong token");
}
}else{
die("WPFC_CLEAR_CACHE_URL_TOKEN must be defined");
}
}else{
die("Security token must be set.");
}
if($action){
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("mobile-cache.php");
}
if($_GET["type"] == "clearcache"){
if(isset($_GET["post_id"])){
$this->singleDeleteCache(false, $_GET["post_id"]);
}else{
$this->deleteCache();
}
}
if($_GET["type"] == "clearcacheandminified"){
$this->deleteCache(true);
}
if($_GET["type"] == "clearcacheallsites"){
$this->wpfc_clear_cache_of_allsites_callback();
}
die("Done");
}
exit;
}
public function enable_auto_cache_settings_panel(){
if($this->isPluginActive('classic-editor/classic-editor.php') || $this->isPluginActive('disable-gutenberg/disable-gutenberg.php') || has_filter("use_block_editor_for_post", "__return_false")){
add_action("add_meta_boxes", array($this, "add_meta_box"), 10, 2);
add_action('admin_notices', array($this, 'single_preload_inline_js'));
add_action('wp_ajax_wpfc_preload_single_save_settings', array($this, "wpfc_preload_single_save_settings_callback"));
add_action('wp_ajax_wpfc_preload_single', array($this, "wpfc_preload_single_callback"));
}
}
public function clear_cache_after_activate_plugin(){
$this->deleteCache(true);
}
public function clear_cache_after_deactivate_plugin(){
$this->deleteCache(true);
}
public function clear_cache_after_switch_theme(){
$this->deleteCache(true);
}
public function clear_cache_after_update_plugin($upgrader_object, $options){
if(isset($options['action']) && isset($options['type'])){
if($options['action'] == 'update'){
if($options['type'] == 'plugin' && (isset($options['plugins']) || isset($options['plugin']))){
$options_json = json_encode($options);
if(preg_match("/elementor\\\\\/elementor\.php/i", $options_json)){
$this->deleteCache(true);
}
if(defined("WPFC_CLEAR_CACHE_AFTER_PLUGIN_UPDATE") && WPFC_CLEAR_CACHE_AFTER_PLUGIN_UPDATE){
$this->deleteCache(true);
}
}
}
}
}
public function clear_cache_after_update_theme($upgrader_object, $options){
if(isset($options['action']) && isset($options['type'])){
if($options['action'] == 'update'){
if($options['type'] == 'theme' && isset($options['themes'])){
if(defined("WPFC_CLEAR_CACHE_AFTER_THEME_UPDATE") && WPFC_CLEAR_CACHE_AFTER_THEME_UPDATE){
$this->deleteCache(true);
}
}
}
}
}
public function action_links($actions){
$actions['powered_settings'] = sprintf(__( '<a href="%s">Settings</a>', 'wp-fastest-cache'), esc_url( admin_url( 'admin.php?page=wpfastestcacheoptions')));
return array_reverse($actions);
}
public function wpfc_preload_single_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
include_once('inc/single-preload.php');
SinglePreloadWPFC::create_cache();
}
public function create_post_cache_by_id($id){
include_once('inc/single-preload.php');
SinglePreloadWPFC::init($id);
$res = SinglePreloadWPFC::create_cache_for_all_urls();
return $res;
}
public function single_preload_inline_js(){
include_once('inc/single-preload.php');
SinglePreloadWPFC::init();
SinglePreloadWPFC::put_inline_js();
}
public function add_meta_box(){
include_once('inc/single-preload.php');
SinglePreloadWPFC::add_meta_box();
}
public function wpfc_preload_single_save_settings_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
include_once('inc/single-preload.php');
SinglePreloadWPFC::save_settings();
}
public function notify($message = array()){
if(isset($message[0]) && $message[0]){
if(function_exists("add_settings_error")){
add_settings_error('wpfc-notice', esc_attr( 'settings_updated' ), $message[0], $message[1]);
}
}
}
public function set_content_url(){
$content_url = content_url();
// Hide My WP
if($this->isPluginActive('hide_my_wp/hide-my-wp.php')){
$hide_my_wp = get_option("hide_my_wp");
if(isset($hide_my_wp["new_content_path"]) && $hide_my_wp["new_content_path"]){
$hide_my_wp["new_content_path"] = trim($hide_my_wp["new_content_path"], "/");
$content_url = str_replace(basename(WPFC_WP_CONTENT_DIR), $hide_my_wp["new_content_path"], $content_url);
}
}
// to change content url if a different url is used for other langs
if($this->isPluginActive('polylang/polylang.php') || $this->isPluginActive('polylang-pro/polylang.php')){
$url = parse_url($content_url);
if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST']){
if($url["host"] != $_SERVER['HTTP_HOST']){
$protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$content_url = $protocol.$_SERVER['HTTP_HOST'].$url['path'];
}
}
}
if (!defined('WPFC_WP_CONTENT_URL')) {
define("WPFC_WP_CONTENT_URL", $content_url);
}
$this->content_url = $content_url;
}
public function clear_cache_on_kksr_rate($id){
$this->singleDeleteCache(false, $id);
}
public function clear_cache_after_woocommerce_order_status_changed($order_id = false){
if(function_exists("wc_get_order")){
if($order_id){
$order = wc_get_order($order_id);
if($order){
foreach($order->get_items() as $item_key => $item_values ){
if(method_exists($item_values, 'get_product_id')){
$this->singleDeleteCache(false, $item_values->get_product_id());
}
}
}
}
}
}
public function wpfc_db_fix_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
if(current_user_can('manage_options')){
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("db.php");
if(class_exists("WpFastestCacheDatabaseCleanup")){
WpFastestCacheDatabaseCleanup::clean($_GET["type"]);
}else{
die(json_encode(array("success" => false, "showupdatewarning" => true, "message" => "Only available in Premium version")));
}
}else{
die(json_encode(array("success" => false, "message" => "Only available in Premium version")));
}
}else{
wp_die("Must be admin");
}
}
public function wpfc_db_statics_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
global $wpdb;
$statics = array("all_warnings" => 0,
"post_revisions" => 0,
"trashed_contents" => 0,
"trashed_spam_comments" => 0,
"trackback_pingback" => 0,
"transient_options" => 0,
"orphaned_post_meta" => 0,
"orphaned_comment_meta" => 0,
"orphaned_user_meta" => 0,
"orphaned_term_meta" => 0,
"orphaned_term_relationships" => 0
);
$statics["post_revisions"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->posts` WHERE post_type = 'revision';");
$statics["all_warnings"] = $statics["all_warnings"] + $statics["post_revisions"];
$statics["trashed_contents"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->posts` WHERE post_status = 'trash';");
$statics["all_warnings"] = $statics["all_warnings"] + $statics["trashed_contents"];
$statics["trashed_spam_comments"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->comments` WHERE comment_approved = 'spam' OR comment_approved = 'trash' ;");
$statics["all_warnings"] = $statics["all_warnings"] + $statics["trashed_spam_comments"];
$statics["trackback_pingback"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->comments` WHERE comment_type = 'trackback' OR comment_type = 'pingback' ;");
$statics["all_warnings"] = $statics["all_warnings"] + $statics["trackback_pingback"];
$element = "SELECT COUNT(*) FROM `$wpdb->options` WHERE option_name LIKE '%\_transient\_%' ;";
$statics["transient_options"] = $wpdb->get_var( $element ) > 100 ? $wpdb->get_var( $element ) : 0;
$statics["all_warnings"] = $statics["all_warnings"] + $statics["transient_options"];
$statics["orphaned_post_meta"] = $wpdb->get_var("SELECT COUNT(pm.meta_id) FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE p.ID IS NULL");
$statics["all_warnings"] += $statics["orphaned_post_meta"];
$statics["orphaned_comment_meta"] = $wpdb->get_var("SELECT COUNT(cm.meta_id) FROM {$wpdb->commentmeta} cm LEFT JOIN {$wpdb->comments} c ON c.comment_ID = cm.comment_id WHERE c.comment_ID IS NULL");
$statics["all_warnings"] += $statics["orphaned_comment_meta"];
$statics["orphaned_user_meta"] = $wpdb->get_var("SELECT COUNT(um.umeta_id) FROM {$wpdb->usermeta} um LEFT JOIN {$wpdb->users} u ON u.ID = um.user_id WHERE u.ID IS NULL");
$statics["all_warnings"] += $statics["orphaned_user_meta"];
$statics["orphaned_term_meta"] = $wpdb->get_var("SELECT COUNT(tm.meta_id) FROM {$wpdb->termmeta} tm LEFT JOIN {$wpdb->terms} t ON t.term_id = tm.term_id WHERE t.term_id IS NULL");
$statics["all_warnings"] += $statics["orphaned_term_meta"];
$statics["orphaned_term_relationships"] = $wpdb->get_var("SELECT COUNT(tr.object_id) FROM {$wpdb->term_relationships} tr LEFT JOIN {$wpdb->posts} p ON p.ID = tr.object_id WHERE p.ID IS NULL");
$statics["all_warnings"] += $statics["orphaned_term_relationships"];
die(json_encode($statics));
}
public function is_trailing_slash(){
// no need to check if Custom Permalinks plugin is active (https://tr.wordpress.org/plugins/custom-permalinks/)
if($this->isPluginActive("custom-permalinks/custom-permalinks.php")){
return false;
}
if($permalink_structure = get_option('permalink_structure')){
if(preg_match("/\/$/", $permalink_structure)){
return true;
}
}
return false;
}
public function wpfc_cache_statics_get_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/statics.php")){
include_once $this->get_premium_path("statics.php");
$cache_statics = new WpFastestCacheStatics();
$res = $cache_statics->get();
echo json_encode($res);
exit;
}
}
}
public function wpfc_check_url_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::check_url();
}
public function wpfc_cdn_template_ajax_request_callback(){
include_once('inc/cdn.php');
CdnWPFC::cdn_template();
}
public function wpfc_save_cdn_integration_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::save_cdn_integration();
}
public function wpfc_start_cdn_integration_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::start_cdn_integration();
}
public function wpfc_pause_cdn_integration_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::pause_cdn_integration();
}
public function wpfc_remove_cdn_integration_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::remove_cdn_integration();
}
public function wpfc_cdn_options_ajax_request_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){
die( 'Security check' );
}
include_once('inc/cdn.php');
CdnWPFC::cdn_options();
}
public function wpfc_save_exclude_pages_callback(){
if(!wp_verify_nonce($_POST["security"], 'wpfc-save-exclude-ajax-nonce')){
die( 'Security check' );
}
if(current_user_can('manage_options')){
if(isset($_POST["rules"])){
foreach ($_POST["rules"] as $key => &$value) {
$value["prefix"] = strip_tags($value["prefix"]);
$value["content"] = strip_tags($value["content"]);
$value["prefix"] = preg_replace("/\'|\"/", "", $value["prefix"]);
if($value["prefix"] == "regex"){
$value["content"] = stripslashes($value["content"]);
$value["content"] = esc_attr($value["content"]);
}else{
$value["content"] = preg_replace("/\'|\"/", "", $value["content"]);
$value["content"] = preg_replace("/(\#|\s|\(|\)|\*)/", "", $value["content"]);
}
if($value["prefix"] == "homepage"){
$this->deleteHomePageCache(false);
}
}
$data = json_encode($_POST["rules"]);
if(get_option("WpFastestCacheExclude")){
update_option("WpFastestCacheExclude", $data);
}else{
add_option("WpFastestCacheExclude", $data, null, "yes");
}
}else{
delete_option("WpFastestCacheExclude");
}
$this->modify_htaccess_for_exclude();
echo json_encode(array("success" => true));
exit;
}else{
wp_die("Must be admin");
}
}
public function modify_htaccess_for_exclude(){
$path = ABSPATH;
if($this->is_subdirectory_install()){
$path = $this->getABSPATH();
}
$htaccess = @file_get_contents($path.".htaccess");
if(preg_match("/\#\s?Start\sWPFC\sExclude/", $htaccess)){
$exclude_rules = $this->excludeRules();
$htaccess = preg_replace("/\#\s?Start\sWPFC\sExclude[^\#]*\#\s?End\sWPFC\sExclude\s+/", $exclude_rules, $htaccess);
}
@file_put_contents($path.".htaccess", $htaccess);
}
public function wpfc_purgecache_varnish_callback(){
if(!wp_verify_nonce($_REQUEST["security"], 'wpfc-varnish-ajax-nonce')){
die( 'Security check' );
}
if($varnish_datas = get_option("WpFastestCacheVarnish")){
include_once('inc/varnish.php');
$res_arr = VarnishWPFC::purge_cache($varnish_datas["server"]);
wp_send_json($res_arr);
}
}
public function wpfc_save_varnish_callback(){
include_once('inc/varnish.php');
VarnishWPFC::save();
}
public function wpfc_remove_varnish_callback(){
include_once('inc/varnish.php');
VarnishWPFC::remove();
}
public function wpfc_start_varnish_callback(){
include_once('inc/varnish.php');
VarnishWPFC::start();
}
public function wpfc_pause_varnish_callback(){
include_once('inc/varnish.php');
VarnishWPFC::pause();
}
public function wpfc_status_varnish(){
include_once('inc/varnish.php');
VarnishWPFC::status();
}
public function wpfc_get_list_csp_callback(){
include_once('inc/clearing-specific-pages.php');
ClearingSpecificPagesWPFC::get_list();
}
public function wpfc_save_csp_callback(){
include_once('inc/clearing-specific-pages.php');
ClearingSpecificPagesWPFC::save();
}
public function wpfc_remove_csp_callback(){
include_once('inc/clearing-specific-pages.php');
ClearingSpecificPagesWPFC::remove();
}
public function wpfc_save_timeout_pages_callback(){
if(!wp_verify_nonce($_POST["security"], 'wpfc-save-timeout-ajax-nonce')){
die( 'Security check' );
}
if(current_user_can('manage_options')){
$this->setCustomInterval();
$crons = _get_cron_array();
foreach ($crons as $cron_key => $cron_value) {
foreach ( (array) $cron_value as $hook => $events ) {
if(preg_match("/^wp\_fastest\_cache(.*)/", $hook, $id)){
if(!$id[1] || preg_match("/^\_(\d+)$/", $id[1])){
foreach ( (array) $events as $event_key => $event ) {
if($id[1]){
wp_clear_scheduled_hook("wp_fastest_cache".$id[1], $event["args"]);
}else{
wp_clear_scheduled_hook("wp_fastest_cache", $event["args"]);
}
}
}
}
}
}
if(isset($_POST["rules"]) && count($_POST["rules"]) > 0){
$i = 0;
foreach ($_POST["rules"] as $key => $value) {
if(preg_match("/^(daily|onceaday)$/i", $value["schedule"]) && isset($value["hour"]) && isset($value["minute"]) && strlen($value["hour"]) > 0 && strlen($value["minute"]) > 0){
$args = array("prefix" => $value["prefix"], "content" => $value["content"], "hour" => $value["hour"], "minute" => $value["minute"]);
$timestamp = mktime($value["hour"],$value["minute"],0,date("m"),date("d"),date("Y"));
$timestamp = $timestamp > time() ? $timestamp : $timestamp + 60*60*24;
}else{
$args = array("prefix" => $value["prefix"], "content" => $value["content"]);
$timestamp = time();
}
wp_schedule_event($timestamp, $value["schedule"], "wp_fastest_cache_".$i, array(json_encode($args)));
$i = $i + 1;
}
}
echo json_encode(array("success" => true));
exit;
}else{
wp_die("Must be admin");
}
}
public function wp_postratings_clear_fastest_cache($rate_userid, $post_id){
// to remove cache if vote is from homepage or category page or tag
if(isset($_SERVER["HTTP_REFERER"]) && $_SERVER["HTTP_REFERER"]){
$url = parse_url($_SERVER["HTTP_REFERER"]);
$url["path"] = isset($url["path"]) ? $url["path"] : "/index.html";
if(isset($url["path"])){
if($url["path"] == "/"){
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/index.html"));
}else{
// to prevent changing path with ../ or with another method
if($url["path"] == realpath(".".$url["path"])){
$this->rm_folder_recursively($this->getWpContentDir("/cache/all").$url["path"]);
}
}
}
}
if($post_id){
$this->singleDeleteCache(false, $post_id);
}
}
private function admin(){
if(isset($_GET["page"]) && $_GET["page"] == "wpfastestcacheoptions"){
include_once('inc/admin.php');
$wpfc = new WpFastestCacheAdmin();
$wpfc->addMenuPage();
}else{
add_action('admin_menu', array($this, 'register_my_custom_menu_page'));
}
}
public function load_column(){
if(!defined('WPFC_HIDE_CLEAR_CACHE_BUTTON') || (defined('WPFC_HIDE_CLEAR_CACHE_BUTTON') && !WPFC_HIDE_CLEAR_CACHE_BUTTON)){
include_once plugin_dir_path(__FILE__)."inc/column.php";
$column = new WpFastestCacheColumn();
$column->add();
}
}
public function load_admin_toolbar(){
$display = true;
if(apply_filters('wpfc_hide_toolbar', false )){
$display = "";
}
if(defined('WPFC_HIDE_TOOLBAR') && WPFC_HIDE_TOOLBAR){
$display = "";
}
if($display){
$user = wp_get_current_user();
$allowed_roles = array('administrator');
$wpfc_role_status = get_option("WpFastestCacheToolbarSettings");
if(is_array($wpfc_role_status) && !empty($wpfc_role_status)){
foreach ($wpfc_role_status as $key => $value){
$key = str_replace("wpfc_toolbar_", "", $key);
array_push($allowed_roles, strtolower($key));
}
}
if(array_intersect($allowed_roles, $user->roles)){
include_once plugin_dir_path(__FILE__)."inc/admin-toolbar.php";
if(preg_match("/\/cache\/all/", $this->getWpContentDir("/cache/all"))){
$is_multi = false;
}else{
$is_multi = true;
}
$toolbar = new WpFastestCacheAdminToolbar($is_multi);
$toolbar->add();
}
}
}
public function tmp_saveOption(){
if(!empty($_POST)){
if(isset($_POST["wpFastestCachePage"])){
include_once('inc/admin.php');
$wpfc = new WpFastestCacheAdmin();
$wpfc->optionsPageRequest();
}
}
}
public function register_mysettings(){
register_setting('wpfc-group', 'wpfc-group', array($this, 'tmp_saveOption'));
}
public function register_my_custom_menu_page(){
if(function_exists('add_menu_page')){
if(defined("WPFC_MOVE_MENU_ITEM_UNDER_SETTINGS") && WPFC_MOVE_MENU_ITEM_UNDER_SETTINGS){
add_options_page("WP Fastest Cache Settings", "WP Fastest Cache", 'manage_options', 'wpfastestcacheoptions', array($this, 'optionsPage'));
}else{
add_menu_page("WP Fastest Cache Settings", "WP Fastest Cache", 'manage_options', "wpfastestcacheoptions", array($this, 'optionsPage'), plugins_url("wp-fastest-cache/images/icon.svg"));
}
add_action('admin_init', array($this, 'register_mysettings'));
wp_enqueue_style("wp-fastest-cache", plugins_url("wp-fastest-cache/css/style.css"), array(), time(), "all");
}
if(isset($_GET["page"]) && $_GET["page"] == "wpfastestcacheoptions"){
wp_enqueue_style("wp-fastest-cache-buycredit", plugins_url("wp-fastest-cache/css/buycredit.css"), array(), time(), "all");
wp_enqueue_style("wp-fastest-cache-flaticon", plugins_url("wp-fastest-cache/css/flaticon.css"), array(), time(), "all");
wp_enqueue_style("wp-fastest-cache-dialog", plugins_url("wp-fastest-cache/css/dialog.css"), array(), time(), "all");
}
}
public function deleteCacheToolbar(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
$this->deleteCache();
}
public function deleteCssAndJsCacheToolbar(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
$this->deleteCache(true);
}
public function wpfc_toolbar_get_settings_callback(){
if(current_user_can('manage_options')){
$result = array("success" => true, "roles" => false);
$wpfc_role_status = get_option("WpFastestCacheToolbarSettings");
if(is_array($wpfc_role_status) && !empty($wpfc_role_status)){
$result["roles"] = $wpfc_role_status;
}
die(json_encode($result));
}else{
wp_die("Must be admin");
}
}
public function wpfc_cache_path_save_settings_callback(){
if(current_user_can('manage_options')){
foreach($_POST as $key => &$value){
$value = esc_html(esc_sql($value));
}
$path_arr = array(
"cachepath" => sanitize_text_field($_POST["cachepath"]),
"optimizedpath" => sanitize_text_field($_POST["optimizedpath"])
);
if(get_option("WpFastestCachePathSettings") === false){
add_option("WpFastestCachePathSettings", $path_arr, 1, "no");
}else{
update_option("WpFastestCachePathSettings", $path_arr);
}
die(json_encode(array("success" => true)));
}else{
wp_die("Must be admin");
}
}
public function wpfc_toolbar_save_settings_callback(){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
if(current_user_can('manage_options')){
if(isset($_GET["roles"]) && is_array($_GET["roles"]) && !empty($_GET["roles"])){
$roles_arr = array();
foreach($_GET["roles"] as $key => $value){
$value = esc_html(esc_sql($value));
$key = esc_html(esc_sql($key));
$roles_arr[$key] = $value;
}
if(get_option("WpFastestCacheToolbarSettings") === false){
add_option("WpFastestCacheToolbarSettings", $roles_arr, 1, "no");
}else{
update_option("WpFastestCacheToolbarSettings", $roles_arr);
}
}else{
delete_option("WpFastestCacheToolbarSettings");
}
die(json_encode(array("Saved","success")));
}else{
wp_die("Must be admin");
}
}
public function wpfc_clear_cache_of_allsites_callback(){
if(defined('DOING_AJAX') && DOING_AJAX){
if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){
die( 'Security check' );
}
}
include_once('inc/cdn.php');
CdnWPFC::cloudflare_clear_cache();
$path = $this->getWpContentDir("/cache/*");
$files = glob($this->getWpContentDir("/cache/*"));
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){
//tmpWpfc has been created
}
}
foreach ((array)$files as $file){
@rename($file, $this->getWpContentDir("/cache/tmpWpfc/").basename($file)."-".time());
}
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX){
die(json_encode(array("The cache of page has been cleared","success")));
}
}
public function delete_current_page_cache(){
if(!wp_verify_nonce($_GET["nonce"], "wpfc")){
die(json_encode(array("Security Error!", "error", "alert")));
}
if($varnish_datas = get_option("WpFastestCacheVarnish")){
include_once('inc/varnish.php');
VarnishWPFC::purge_cache($varnish_datas);
}
include_once('inc/cdn.php');
CdnWPFC::cloudflare_clear_cache();
if(isset($_GET["path"])){
if($_GET["path"]){
if($_GET["path"] == "/"){
$_GET["path"] = $_GET["path"]."index.html";
}
}else{
$_GET["path"] = "/index.html";
}
$_GET["path"] = urldecode(esc_url_raw($_GET["path"]));
// for security
if(preg_match("/\.{2,}/", $_GET["path"])){
die("May be Directory Traversal Attack");
}
$paths = array();
array_push($paths, $this->getWpContentDir("/cache/all").$_GET["path"]);
if(class_exists("WpFcMobileCache")){
$wpfc_mobile = new WpFcMobileCache();
array_push($paths, $this->getWpContentDir("/cache/wpfc-mobile-cache").$_GET["path"]);
}
foreach ($paths as $key => $value){
if(file_exists($value)){
if(preg_match("/\/(all|wpfc-mobile-cache)\/index\.html$/i", $value)){
@unlink($value);
}else{
$this->rm_folder_recursively($value);
}
}
}
$this->delete_multiple_domain_mapping_cache();
die(json_encode(array("The cache of page has been cleared","success")));
}else{
die(json_encode(array("Path has NOT been defined", "error", "alert")));
}
exit;
}
private function cache(){
if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST']){
include_once('inc/cache.php');
$wpfc = new WpFastestCacheCreateCache();
$wpfc->createCache();
}
}
protected function slug(){
return "wp_fastest_cache";
}
public function getWpContentDir($path = false){
/*
Sample Paths;
/cache/
/cache/all/
/cache/all
/cache/all/page
/cache/all/index.html
/cache/wpfc-minified
/cache/wpfc-widget-cache
/cache/wpfc-mobile-cache/
/cache/wpfc-mobile-cache/page
/cache/wpfc-mobile-cache/index.html
/cache/tmpWpfc
/cache/tmpWpfc/
/cache/tmpWpfc/mobile_
/cache/tmpWpfc/m
/cache/tmpWpfc/w
/cache/testWpFc/
/cache/all/testWpFc/
/cache/wpfc-widget-cache/
/cache/wpfc-widget-cache
/cache/wpfc-widget-cache/".$args["widget_id"].".html
*/
if($path){
if(preg_match("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", $path)){
//WPML language switch
//https://wpml.org/forums/topic/wpml-language-switch-wp-fastest-cache-issue/
$language_negotiation_type = apply_filters('wpml_setting', false, 'language_negotiation_type');
if(($language_negotiation_type == 2) && $this->isPluginActive('sitepress-multilingual-cms/sitepress.php')){
$my_home_url = apply_filters('wpml_home_url', get_option('home'));
$my_home_url = preg_replace("/https?\:\/\//i", "", $my_home_url);
$my_home_url = trim($my_home_url, "/");
$path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$my_home_url."/$1", $path);
}else if(($language_negotiation_type == 1) && $this->isPluginActive('sitepress-multilingual-cms/sitepress.php')){
$my_current_lang = apply_filters('wpml_current_language', NULL);
if($my_current_lang){
$path = preg_replace("/\/cache\/wpfc-widget-cache\/(.+)/", "/cache/wpfc-widget-cache/".$my_current_lang."-"."$1", $path);
}
}
if($this->isPluginActive('multiple-domain-mapping-on-single-site/multidomainmapping.php')){
$path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path);
}
if($this->isPluginActive('polylang/polylang.php') || $this->isPluginActive('polylang-pro/polylang.php')){
$polylang_settings = get_option("polylang");
if(isset($polylang_settings["force_lang"])){
if($polylang_settings["force_lang"] == 2 || $polylang_settings["force_lang"] == 3){
// The language is set from the subdomain name in pretty permalinks
// The language is set from different domains
$path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path);
}
}
}
if($this->isPluginActive('multiple-domain/multiple-domain.php')){
$path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path);
}
if(is_multisite()){
$path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path);
}
}
return WPFC_WP_CONTENT_DIR.$path;
}else{
return WPFC_WP_CONTENT_DIR;
}
}
protected function getOptions(){
return $GLOBALS["wp_fastest_cache_options"];
}
protected function getSystemMessage(){
return $this->systemMessage;
}
protected function get_excluded_useragent(){
return "facebookexternalhit|WP_FASTEST_CACHE_CSS_VALIDATOR|Twitterbot|LinkedInBot|WhatsApp|Mediatoolkitbot";
}
// protected function detectNewPost(){
// if(isset($this->options->wpFastestCacheNewPost) && isset($this->options->wpFastestCacheStatus)){
// add_filter ('save_post', array($this, 'deleteCache'));
// }
// }
public function deleteWidgetCache(){
$widget_cache_path = $this->getWpContentDir("/cache/wpfc-widget-cache");
if(is_dir($widget_cache_path)){
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){
//tmpWpfc has been created
}
}
if(@rename($widget_cache_path, $this->getWpContentDir("/cache/tmpWpfc/w").time())){
//DONE
}
}
}
public function clear_cache_after_woocommerce_update_product($product_id){
if(!$this->deleted_before){
$this->singleDeleteCache(false, $product_id);
}
}
public function on_all_status_transitions($new_status, $old_status, $post){
$this->deleted_before = true;
if(!wp_is_post_revision($post->ID)){
if(isset($post->post_type)){
if($post->post_type == "nf_sub"){
return 0;
}
}
if($new_status == "publish" && $old_status != "publish"){
$this->specificDeleteCache();
if(isset($this->options->wpFastestCacheNewPost) && isset($this->options->wpFastestCacheStatus)){
if(isset($this->options->wpFastestCacheNewPost_type) && $this->options->wpFastestCacheNewPost_type){
if($this->options->wpFastestCacheNewPost_type == "all"){
$this->deleteCache();
}else if($this->options->wpFastestCacheNewPost_type == "homepage"){
$this->deleteHomePageCache();
//to clear category cache and tag cache
$this->singleDeleteCache(false, $post->ID);
//to clear widget cache
$this->deleteWidgetCache();
}
}else{
$this->deleteCache();
}
}
}
if(isset($this->options->wpFastestCacheStatus) && $new_status == "publish" && $old_status == "publish"){
// if(isset($this->options->wpFastestCacheUpdatePost) && isset($this->options->wpFastestCacheStatus)){
// if($this->options->wpFastestCacheUpdatePost_type == "post"){
// $this->singleDeleteCache(false, $post->ID);
// }else if($this->options->wpFastestCacheUpdatePost_type == "all"){
// $this->deleteCache();
// }
// }
$this->specificDeleteCache();
if(isset($this->options->wpFastestCacheUpdatePost)){
if($this->options->wpFastestCacheUpdatePost_type == "post"){
$this->singleDeleteCache(false, $post->ID);
}else if($this->options->wpFastestCacheUpdatePost_type == "all"){
$this->deleteCache();
}
}else{
// to clear only cache of content even though the "update post" option is disabled
$this->singleDeleteCache(false, $post->ID, false);
}
}
if($new_status == "trash" && $old_status == "publish"){
if($post->post_type == "shop_coupon"){
// YITH WooCommerce Coupon Email System Premium
return;
}
$this->singleDeleteCache(false, $post->ID);
}else if(($new_status == "draft" || $new_status == "pending" || $new_status == "private") && $old_status == "publish"){
$this->deleteCache();
}
}
}
protected function commentHooks(){
//it works when the status of a comment changes
add_action('wp_set_comment_status', array($this, 'detect_comment_status_change'), 10, 2);
//it works when a comment is saved in the database
add_action('comment_post', array($this, 'detectNewComment'), 10, 2);
// it work when a commens is updated
add_action('edit_comment', array($this, 'detectEditComment'), 10, 2);
}
public function detect_comment_status_change($comment_id, $new_status) {
$comment = get_comment($comment_id);
if (!$comment) {
return; // Exit if the comment doesn't exist
}
// Check if the comment was pending and is now marked as spam
if($comment->comment_status == 'open' && $new_status === 'spam'){
return;
}
// Check if the comment was pending and is now marked as trash
if($comment->comment_status == 'open' && $new_status === 'trash'){
return;
}
$this->singleDeleteCache($comment_id);
}
public function detectEditComment($comment_id, $comment_data){
if($comment_data["comment_approved"] == 1){
$this->singleDeleteCache($comment_id);
}
}
public function detectNewComment($comment_id, $comment_approved){
// if(current_user_can( 'manage_options') || !get_option('comment_moderation')){
if($comment_approved === 1){
$this->singleDeleteCache($comment_id);
}
}
public function specificDeleteCache(){
$urls = get_option("WpFastestCacheCSP");
$files = array();
if(!empty($urls)){
foreach ($urls as $key => $value) {
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $value->url, $out)){
if(preg_match("/\.{2,}/", $out[1])){
// to prevent Directory Traversal Attack
continue;
}
if(preg_match("/\/\(\.\*\)/", $out[1])){
$out[1] = str_replace("(.*)", "", $out[1]);
$path = $this->getWpContentDir("/cache/all/").$out[1];
$mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
}else{
$out[1] = $out[1]."index.html";
$path = $this->getWpContentDir("/cache/all/").$out[1];
$mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
}
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true);
}
if(is_dir($path)){
rename($path, $this->getWpContentDir("/cache/tmpWpfc/").time());
}else if(is_file($path)){
@unlink($path);
}
if(is_dir($mobile_path)){
rename($mobile_path, $this->getWpContentDir("/cache/tmpWpfc/mobile_").time());
}else if(is_file($mobile_path)){
@unlink($mobile_path);
}
}
}
}
}
public function singleDeleteCache($comment_id = false, $post_id = false, $to_clear_parents = true){
if($varnish_datas = get_option("WpFastestCacheVarnish")){
include_once('inc/varnish.php');
VarnishWPFC::purge_cache($varnish_datas);
}
include_once('inc/cdn.php');
CdnWPFC::cloudflare_clear_cache();
$to_clear_feed = true;
// not to clear cache of homepage/cats/tags after ajax request by other plugins
if(isset($_POST) && isset($_POST["action"])){
// kk Star Rating
if($_POST["action"] == "kksr_ajax"){
$to_clear_parents = false;
}
// All In One Schema.org Rich Snippets
if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){
$to_clear_parents = false;
}
// Yet Another Stars Rating
if($_POST["action"] == "yasr_send_visitor_rating"){
$to_clear_parents = false;
$post_id = sanitize_text_field($_POST["post_id"]);
}
// All In One Schema.org Rich Snippets
if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){
$to_clear_feed = false;
}
}
if($comment_id){
$comment_id = intval($comment_id);
$comment = get_comment($comment_id);
if($comment && $comment->comment_post_ID){
$post_id = $comment->comment_post_ID;
}
}
if($post_id){
$post_id = intval($post_id);
$permalink = get_permalink($post_id);
$permalink = urldecode(get_permalink($post_id));
//for trash contents
if(preg_match("/\/\?(p|page_id)\=\d+/i", $permalink)){
$post = get_post($post_id);
$clone_post = clone $post;
$clone_post->post_status = 'publish';
$permalink = get_permalink($clone_post);
$permalink = rtrim($permalink, "/");
$permalink = preg_replace("/__trashed$/", "", $permalink);
//for /%postname%/%post_id% : sample-url__trashed/57595
$permalink = preg_replace("/__trashed\/(\d+)$/", "/$1", $permalink);
}
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){
$path = $this->getWpContentDir("/cache/all/").$out[1];
$mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("logs.php");
$log = new WpFastestCacheLogs("delete");
$log->action();
}
$files = array();
if(is_dir($path)){
array_push($files, $path);
}
if(is_dir($mobile_path)){
array_push($files, $mobile_path);
}
if(defined('WPFC_CACHE_QUERYSTRING') && WPFC_CACHE_QUERYSTRING){
$files_with_query_string = glob($path."\?*");
$mobile_files_with_query_string = glob($mobile_path."\?*");
if(is_array($files_with_query_string) && (count($files_with_query_string) > 0)){
$files = array_merge($files, $files_with_query_string);
}
if(is_array($mobile_files_with_query_string) && (count($mobile_files_with_query_string) > 0)){
$files = array_merge($files, $mobile_files_with_query_string);
}
}
if($to_clear_feed){
// to clear cache of /feed
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", get_feed_link(), $feed_out)){
array_push($files, $this->getWpContentDir("/cache/all/").$feed_out[1]);
}
// to clear cache of /comments/feed/
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", get_feed_link("comments_"), $comment_feed_out)){
array_push($files, $this->getWpContentDir("/cache/all/").$comment_feed_out[1]);
}
}
foreach((array)$files as $file){
$this->rm_folder_recursively($file);
}
}
if($to_clear_parents){
// to clear cache of homepage
$this->deleteHomePageCache();
// to clear cache of author page
$this->delete_author_page_cache($post_id);
// to clear sitemap cache
$this->delete_sitemap_cache();
// to clear cache of next post and cache of prev post
$this->delete_next_prev_cache($post_id);
// to clear cache of cats and tags which contains the post (only first page)
global $wpdb;
$terms = $wpdb->get_results("SELECT * FROM `".$wpdb->prefix."term_relationships` WHERE `object_id`=".$post_id, ARRAY_A);
foreach ($terms as $term_key => $term_val){
$this->delete_cache_of_term($term_val["term_taxonomy_id"]);
}
}
$this->delete_multiple_domain_mapping_cache();
}
}
public function delete_next_prev_cache($post_id){
global $wpdb;
$post = get_post($post_id);
$next_post_query = "SELECT * FROM `".$wpdb->prefix."posts` WHERE ID = (SELECT min(ID) FROM `".$wpdb->prefix."posts` where ID > ".$post_id." AND `post_type` = '".$post->post_type."' AND `post_status` = 'publish')";
$prev_post_query = "SELECT * FROM `".$wpdb->prefix."posts` WHERE ID = (SELECT max(ID) FROM `".$wpdb->prefix."posts` where ID < ".$post_id." AND `post_type` = '".$post->post_type."' AND `post_status` = 'publish')";
$res = $wpdb->get_results($next_post_query." UNION ".$prev_post_query);
if(isset($res[0])){
foreach ($res as $key => $value) {
$permalink = urldecode(get_permalink($value->ID));
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){
$path = $this->getWpContentDir("/cache/all/").$out[1];
$mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
if(is_dir($path)){
$this->rm_folder_recursively($path);
}
if(is_dir($mobile_path)){
$this->rm_folder_recursively($mobile_path);
}
}
}
}
}
public function delete_sitemap_cache(){
//to clear sitemap.xml and sitemap-(.+).xml
$files = array_merge(glob($this->getWpContentDir("/cache/all/")."sitemap*.xml"), glob($this->getWpContentDir("/cache/wpfc-mobile-cache/")."sitemap*.xml"));
foreach((array)$files as $file){
$this->rm_folder_recursively($file);
}
}
public function delete_multiple_domain_mapping_cache($minified = false){
//https://wordpress.org/plugins/multiple-domain-mapping-on-single-site/
if($this->isPluginActive("multiple-domain-mapping-on-single-site/multidomainmapping.php")){
$multiple_arr = get_option('falke_mdm_mappings');
if(isset($multiple_arr) && isset($multiple_arr["mappings"]) && isset($multiple_arr["mappings"][0])){
foreach($multiple_arr["mappings"] as $mapping_key => $mapping_value){
if($minified){
$mapping_domain_path = preg_replace("/(\/cache\/[^\/]+\/all\/)/", "/cache/".$mapping_value["domain"]."/", $this->getWpContentDir("/cache/all/"));
if(is_dir($mapping_domain_path)){
if(@rename($mapping_domain_path, $this->getWpContentDir("/cache/tmpWpfc/").$mapping_value["domain"]."_".time())){
}
}
}else{
$mapping_domain_path = preg_replace("/(\/cache\/[^\/]+\/all)/", "/cache/".$mapping_value["domain"]."/all", $this->getWpContentDir("/cache/all/index.html"));
@unlink($mapping_domain_path);
}
}
}
}
}
public function delete_author_page_cache($post_id){
$author_id = get_post_field ('post_author', $post_id);
$permalink = get_author_posts_url($author_id);
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){
$path = $this->getWpContentDir("/cache/all/").$out[1];
$mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
$this->move_folder_to_tmpWpfc($path);
$this->move_folder_to_tmpWpfc($mobile_path);
}
}
public function move_folder_to_tmpWpfc($path = false){
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true);
}
if(!$path){
return false;
}
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
return false;
}
if(is_dir($path)){
preg_match("/\/([^\/]+)\/?$/", $path, $type);
if(isset($type[1])){
if(preg_match("/\/cache\/wpfc-mobile-cache\//", $path)){
$type[1] = "m_".$type[1];
}
$move_to = $this->getWpContentDir("/cache/tmpWpfc/").$type[1]."_".time();
rename($path, $move_to);
}
}
}
public function delete_cache_of_term($term_taxonomy_id){
$term = get_term_by("term_taxonomy_id", $term_taxonomy_id);
if(!$term || is_wp_error($term)){
return false;
}
//if(preg_match("/cat|tag|store|listing/", $term->taxonomy)){}
$url = get_term_link($term->term_id, $term->taxonomy);
if(preg_match("/^http/", $url)){
$path = preg_replace("/https?\:\/\/[^\/]+/i", "", $url);
$path = trim($path, "/");
$path = urldecode($path);
// to remove the cache of tag/cat
if(file_exists($this->getWpContentDir("/cache/all/").$path."/index.html")){
@unlink($this->getWpContentDir("/cache/all/").$path."/index.html");
}
if(file_exists($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/index.html")){
@unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/index.html");
}
// to remove the cache of the pages
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$path."/page");
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/page");
// to remove the cache of the feeds
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$path."/feed");
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/feed");
}
if($term->parent > 0){
$parent = get_term_by("id", $term->parent, $term->taxonomy);
if(isset($parent->term_taxonomy_id)){
$this->delete_cache_of_term($parent->term_taxonomy_id);
}
}
}
public function unlink($path){
if(file_exists($path)){
unlink($path);
}
}
public function deleteHomePageCache($log = true){
if($varnish_datas = get_option("WpFastestCacheVarnish")){
include_once('inc/varnish.php');
VarnishWPFC::purge_cache($varnish_datas);
}
include_once('inc/cdn.php');
CdnWPFC::cloudflare_clear_cache();
$site_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", site_url());
$home_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", home_url());
if($site_url_path){
$site_url_path = trim($site_url_path, "/");
if($site_url_path){
$this->unlink($this->getWpContentDir("/cache/all/").$site_url_path."/index.html");
$this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$site_url_path."/index.html");
//to clear pagination of homepage cache
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$site_url_path."/page");
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$site_url_path."/page");
}
}
if($home_url_path){
$home_url_path = trim($home_url_path, "/");
if($home_url_path){
$this->unlink($this->getWpContentDir("/cache/all/").$home_url_path."/index.html");
$this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$home_url_path."/index.html");
//to clear pagination of homepage cache
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$home_url_path."/page");
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$home_url_path."/page");
}
}
if(function_exists("wc_get_page_id")){
if($shop_id = wc_get_page_id('shop')){
$store_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", get_permalink($shop_id));
if($store_url_path){
$store_url_path = trim($store_url_path, "/");
if($store_url_path){
if(file_exists($this->getWpContentDir("/cache/all/").$store_url_path."/index.html")){
@unlink($this->getWpContentDir("/cache/all/").$store_url_path."/index.html");
}
if(file_exists($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/index.html")){
@unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/index.html");
}
//to clear pagination of store homepage cache
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$store_url_path."/page");
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/page");
}
}
}
}
$this->unlink($this->getWpContentDir("/cache/all/index.html"));
$this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/index.html"));
//to clear pagination of homepage cache
$this->rm_folder_recursively($this->getWpContentDir("/cache/all/page"));
$this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/page"));
// options-reading.php - static posts page
if($page_for_posts_id = get_option('page_for_posts')){
$page_for_posts_permalink = urldecode(get_permalink($page_for_posts_id));
$page_for_posts_permalink = rtrim($page_for_posts_permalink, "/");
$page_for_posts_permalink = preg_replace("/__trashed$/", "", $page_for_posts_permalink);
//for /%postname%/%post_id% : sample-url__trashed/57595
$page_for_posts_permalink = preg_replace("/__trashed\/(\d+)$/", "/$1", $page_for_posts_permalink);
if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $page_for_posts_permalink, $out)){
$page_for_posts_path = $this->getWpContentDir("/cache/all/").$out[1];
$page_for_posts_mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1];
$this->rm_folder_recursively($page_for_posts_path);
$this->rm_folder_recursively($page_for_posts_mobile_path);
}
}
if($log){
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("logs.php");
$log = new WpFastestCacheLogs("delete");
$log->action();
}
}
}
public function deleteCache($minified = false){
if($varnish_datas = get_option("WpFastestCacheVarnish")){
include_once('inc/varnish.php');
VarnishWPFC::purge_cache($varnish_datas);
}
include_once('inc/cdn.php');
CdnWPFC::cloudflare_clear_cache();
$this->set_preload();
$created_tmpWpfc = false;
$cache_deleted = false;
$minifed_deleted = false;
$cache_path = $this->getWpContentDir("/cache/all");
$minified_cache_path = $this->getWpContentDir("/cache/wpfc-minified");
if(class_exists("WpFcMobileCache")){
if(is_dir($this->getWpContentDir("/cache/wpfc-mobile-cache"))){
if(is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
rename($this->getWpContentDir("/cache/wpfc-mobile-cache"), $this->getWpContentDir("/cache/tmpWpfc/mobile_").time());
}else if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){
rename($this->getWpContentDir("/cache/wpfc-mobile-cache"), $this->getWpContentDir("/cache/tmpWpfc/mobile_").time());
}
}
}
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){
$created_tmpWpfc = true;
}else{
$created_tmpWpfc = false;
//$this->systemMessage = array("Permission of <strong>/wp-content/cache</strong> must be <strong>755</strong>", "error");
}
}else{
$created_tmpWpfc = true;
}
//to clear widget cache path
$this->deleteWidgetCache();
$this->delete_multiple_domain_mapping_cache($minified);
if(is_dir($cache_path)){
if(@rename($cache_path, $this->getWpContentDir("/cache/tmpWpfc/").time())){
delete_option("WpFastestCacheHTML");
delete_option("WpFastestCacheHTMLSIZE");
delete_option("WpFastestCacheMOBILE");
delete_option("WpFastestCacheMOBILESIZE");
$cache_deleted = true;
}
}else{
$cache_deleted = true;
}
if($minified){
if(is_dir($minified_cache_path)){
if(@rename($minified_cache_path, $this->getWpContentDir("/cache/tmpWpfc/m").time())){
delete_option("WpFastestCacheCSS");
delete_option("WpFastestCacheCSSSIZE");
delete_option("WpFastestCacheJS");
delete_option("WpFastestCacheJSSIZE");
$minifed_deleted = true;
}
}else{
$minifed_deleted = true;
}
}else{
$minifed_deleted = true;
}
if($created_tmpWpfc && $cache_deleted && $minifed_deleted){
do_action('wpfc_delete_cache');
$this->notify(array("All cache files have been deleted", "updated"));
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("logs.php");
$log = new WpFastestCacheLogs("delete");
$log->action();
}
}else{
$this->notify(array("Permissions Problem: <a href='http://www.wpfastestcache.com/warnings/delete-cache-problem-related-to-permission/' target='_blank'>Read More</a>", "error"));
}
// for ajax request
if(isset($_GET["action"]) && in_array($_GET["action"], array("wpfc_delete_cache", "wpfc_delete_cache_and_minified"))){
die(json_encode($this->systemMessage));
}
}
public function checkCronTime(){
$crons = _get_cron_array();
foreach ((array)$crons as $cron_key => $cron_value) {
foreach ( (array) $cron_value as $hook => $events ) {
if(preg_match("/^wp\_fastest\_cache(.*)/", $hook, $id)){
if(!$id[1] || preg_match("/^\_(\d+)$/", $id[1])){
foreach ( (array) $events as $event_key => $event ) {
add_action("wp_fastest_cache".$id[1], array($this, 'setSchedule'));
}
}
}
}
}
add_action($this->slug()."_Preload", array($this, 'create_preload_cache'), 11);
}
public function set_preload(){
include_once('inc/preload.php');
PreloadWPFC::set_preload($this->slug());
}
public function create_preload_cache(){
$this->options = $this->getOptions();
include_once('inc/preload.php');
PreloadWPFC::create_preload_cache($this->options);
}
public function wpfc_remote_get($url, $user_agent, $return_content = false){
//$response = wp_remote_get($url, array('timeout' => 10, 'sslverify' => false, 'headers' => array("cache-control" => array("no-store, no-cache, must-revalidate", "post-check=0, pre-check=0"),'user-agent' => $user_agent)));
$response = wp_remote_get($url, array('user-agent' => $user_agent, 'timeout' => 10, 'sslverify' => false, 'headers' => array("cache-control" => "no-store, no-cache, must-revalidate, post-check=0, pre-check=0")));
if (!$response || is_wp_error($response)){
echo $response->get_error_message()." - ";
return false;
}else{
if(wp_remote_retrieve_response_code($response) != 200){
return false;
}
if($return_content){
if(wp_remote_retrieve_response_code($response) == 200){
$data = wp_remote_retrieve_body($response);
return $data;
}
}
}
return true;
}
public function setSchedule($args = ""){
if($args){
$rule = json_decode($args);
if($rule->prefix == "all"){
$this->deleteCache();
}else if($rule->prefix == "homepage"){
$this->deleteHomePageCache();
if(isset($this->options->wpFastestCachePreload_homepage) && $this->options->wpFastestCachePreload_homepage){
$this->wpfc_remote_get(get_option("home"), "WP Fastest Cache Preload Bot - After Cache Timeout");
$this->wpfc_remote_get(get_option("home"), "WP Fastest Cache Preload iPhone Mobile Bot - After Cache Timeout");
}
}else if($rule->prefix == "startwith"){
if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){
if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){}
}
$rule->content = trim($rule->content, "/");
$files = glob($this->getWpContentDir("/cache/all/").$rule->content."*");
foreach ((array)$files as $file) {
$mobile_file = str_replace("/cache/all/", "/cache/wpfc-mobile-cache/", $file);
@rename($file, $this->getWpContentDir("/cache/tmpWpfc/").time());
@rename($mobile_file, $this->getWpContentDir("/cache/tmpWpfc/mobile_").time());
}
}else if($rule->prefix == "exact"){
$rule->content = trim($rule->content, "/");
@unlink($this->getWpContentDir("/cache/all/").$rule->content."/index.html");
@unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$rule->content."/index.html");
}
if($rule->prefix != "all"){
if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){
include_once $this->get_premium_path("logs.php");
$log = new WpFastestCacheLogs("delete");
$log->action($rule);
}
}
}else{
//for old cron job
$this->deleteCache();
}
}
public function modify_htaccess_for_new_user($user_id){
$path = ABSPATH;
if($this->is_subdirectory_install()){
$path = $this->getABSPATH();
}
$htaccess = @file_get_contents($path.".htaccess");
if(preg_match("/\#\s?Start_WPFC_Exclude_Admin_Cookie/", $htaccess)){
$rules = $this->excludeAdminCookie();
$htaccess = preg_replace("/\#\s?Start_WPFC_Exclude_Admin_Cookie[^\#]*\#\s?End_WPFC_Exclude_Admin_Cookie\s+/", $rules, $htaccess);
}
@file_put_contents($path.".htaccess", $htaccess);
}
public function excludeAdminCookie(){
$usernames = array();
$users_groups = array_chunk(get_users(array("role" => "administrator", "fields" => array("user_login"))), 5);
foreach ($users_groups as $group_key => $group) {
$tmp_user = "";
$tmp_rule = "";
foreach ($group as $key => $value) {
$tmp_user = sanitize_user(wp_unslash($value->user_login), true);
/*
to replace spaces with %20
1. Empty space character causes 500 internal server error
2. "\s" is not detected by htaccess so we added "%20"
*/
$tmp_user = preg_replace("/\s/", "%20", $tmp_user);
array_push($usernames, $tmp_user);
}
}
$rule = "# Start_WPFC_Exclude_Admin_Cookie\n";
$rule = $rule."RewriteCond %{HTTP:Cookie} !wordpress_logged_in_[^\=]+\=".implode("|", $usernames);
$rule = $rule."\n# End_WPFC_Exclude_Admin_Cookie\n";
return $rule;
}
public function excludeRules(){
$htaccess_page_rules = "";
$htaccess_page_useragent = "";
$htaccess_page_cookie = "";
$rules_json = get_option("WpFastestCacheExclude");
if(!empty($rules_json) && $rules_json !== "null"){
$rules_std = json_decode($rules_json);
// JSON hatalıysa çık
if (json_last_error() !== JSON_ERROR_NONE || !is_array($rules_std)) {
return "";
}
foreach ($rules_std as $value) {
// default type
$value->type = isset($value->type) ? $value->type : "page";
// content yoksa skip
if(empty($value->content)){
continue;
}
// HTML entity decode (örn: &lt; &gt;)
$content = html_entity_decode($value->content, ENT_QUOTES, 'UTF-8');
// ---------- PAGE RULES ----------
if($value->type == "page"){
// REGEX (escape yok!)
if(isset($value->prefix) && $value->prefix == "regex"){
// basit regex validation (çok kırılmayı önler)
if(@preg_match("/".$content."/", null) === false){
continue; // hatalı regex skip
}
$htaccess_page_rules .= "RewriteCond %{REQUEST_URI} !".$content." [NC]\n";
}
// NORMAL RULES (escape var)
else{
// regex injection önleme
$safe_content = preg_quote($content, "/");
if($value->prefix == "startwith"){
$safe_content = ltrim($safe_content, "/");
$htaccess_page_rules .= "RewriteCond %{REQUEST_URI} !^/".$safe_content." [NC]\n";
}
if($value->prefix == "contain"){
$htaccess_page_rules .= "RewriteCond %{REQUEST_URI} !".$safe_content." [NC]\n";
}
if($value->prefix == "exact"){
$safe_content = trim($safe_content, "/");
$htaccess_page_rules .= "RewriteCond %{REQUEST_URI} !^/".$safe_content."$ [NC]\n";
}
}
}
// ---------- USER AGENT ----------
else if($value->type == "useragent"){
$safe_content = preg_quote($content, "/");
$htaccess_page_useragent .= "RewriteCond %{HTTP_USER_AGENT} !".$safe_content." [NC]\n";
}
// ---------- COOKIE ----------
else if($value->type == "cookie"){
$safe_content = preg_quote($content, "/");
$htaccess_page_cookie .= "RewriteCond %{HTTP:Cookie} !".$safe_content." [NC]\n";
}
}
}
return "# Start WPFC Exclude\n"
.$htaccess_page_rules
.$htaccess_page_useragent
.$htaccess_page_cookie
."# End WPFC Exclude\n";
}
public function getABSPATH(){
if(function_exists("get_home_path")){
return get_home_path();
}else{
$path = ABSPATH;
$siteUrl = site_url();
$homeUrl = home_url();
$diff = str_replace($homeUrl, "", $siteUrl);
$diff = trim($diff,"/");
$pos = strrpos($path, $diff);
if($pos !== false){
$path = substr_replace($path, "", $pos, strlen($diff));
$path = trim($path,"/");
$path = "/".$path."/";
}
return $path;
}
}
public function rm_folder_recursively($dir, $i = 1) {
if (!is_dir($dir)) {
return true;
}
$files = scandir($dir);
if ($files === false) {
return true;
}
foreach ($files as $file) {
if ($file === '.' || $file === '..') {
continue;
}
if ($i > 50 && !preg_match("/wp-fastest-cache-premium/i", $dir)) {
return true;
}
$path = $dir . '/' . $file;
if (is_dir($path)) {
$this->rm_folder_recursively($path, $i + 1);
} else {
if (file_exists($path)) {
unlink($path);
}
}
}
if (is_dir($dir)) {
$files_tmp = scandir($dir);
if ($files_tmp !== false && count($files_tmp) <= 2) {
rmdir($dir);
}
}
return true;
}
public function is_subdirectory_install(){
if(strlen(site_url()) > strlen(home_url())){
return true;
}
return false;
}
protected function getMobileUserAgents(){
return implode("|", $this->get_mobile_browsers())."|".implode("|", $this->get_operating_systems());
}
public function get_premium_path($name){
return WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/".$name;
}
public function cron_add_minute( $schedules ) {
$schedules['everyminute'] = array(
'interval' => 60*1,
'display' => __( 'Once Every 1 Minute' ),
'wpfc' => true
);
$schedules['everyfiveminute'] = array(
'interval' => 60*5,
'display' => __( 'Once Every 5 Minutes' ),
'wpfc' => true
);
$schedules['everyfifteenminute'] = array(
'interval' => 60*15,
'display' => __( 'Once Every 15 Minutes' ),
'wpfc' => true
);
$schedules['twiceanhour'] = array(
'interval' => 60*30,
'display' => __( 'Twice an Hour' ),
'wpfc' => true
);
$schedules['onceanhour'] = array(
'interval' => 60*60,
'display' => __( 'Once an Hour' ),
'wpfc' => true
);
$schedules['everytwohours'] = array(
'interval' => 60*60*2,
'display' => __( 'Once Every 2 Hours' ),
'wpfc' => true
);
$schedules['everythreehours'] = array(
'interval' => 60*60*3,
'display' => __( 'Once Every 3 Hours' ),
'wpfc' => true
);
$schedules['everyfourhours'] = array(
'interval' => 60*60*4,
'display' => __( 'Once Every 4 Hours' ),
'wpfc' => true
);
$schedules['everyfivehours'] = array(
'interval' => 60*60*5,
'display' => __( 'Once Every 5 Hours' ),
'wpfc' => true
);
$schedules['everysixhours'] = array(
'interval' => 60*60*6,
'display' => __( 'Once Every 6 Hours' ),
'wpfc' => true
);
$schedules['everysevenhours'] = array(
'interval' => 60*60*7,
'display' => __( 'Once Every 7 Hours' ),
'wpfc' => true
);
$schedules['everyeighthours'] = array(
'interval' => 60*60*8,
'display' => __( 'Once Every 8 Hours' ),
'wpfc' => true
);
$schedules['everyninehours'] = array(
'interval' => 60*60*9,
'display' => __( 'Once Every 9 Hours' ),
'wpfc' => true
);
$schedules['everytenhours'] = array(
'interval' => 60*60*10,
'display' => __( 'Once Every 10 Hours' ),
'wpfc' => true
);
$schedules['onceaday'] = array(
'interval' => 60*60*24,
'display' => __( 'Once a Day' ),
'wpfc' => true
);
$schedules['everythreedays'] = array(
'interval' => 60*60*24*3,
'display' => __( 'Once Every 3 Days' ),
'wpfc' => true
);
$schedules['everysevendays'] = array(
'interval' => 60*60*24*7,
'display' => __( 'Once Every 7 Days' ),
'wpfc' => true
);
$schedules['everytendays'] = array(
'interval' => 60*60*24*10,
'display' => __( 'Once Every 10 Days' ),
'wpfc' => true
);
$schedules['everyfifteendays'] = array(
'interval' => 60*60*24*15,
'display' => __( 'Once Every 15 Days' ),
'wpfc' => true
);
$schedules['montly'] = array(
'interval' => 60*60*24*30,
'display' => __( 'Once a Month' ),
'wpfc' => true
);
$schedules['yearly'] = array(
'interval' => 60*60*24*30*12,
'display' => __( 'Once a Year' ),
'wpfc' => true
);
return $schedules;
}
public function setCustomInterval(){
add_filter( 'cron_schedules', array($this, 'cron_add_minute'));
}
public function isPluginActive( $plugin ) {
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || $this->isPluginActiveForNetwork( $plugin );
}
public function isPluginActiveForNetwork( $plugin ) {
if ( !is_multisite() )
return false;
$plugins = get_site_option( 'active_sitewide_plugins');
if ( isset($plugins[$plugin]) )
return true;
return false;
}
public function current_url(){
global $wp;
$current_url = home_url($_SERVER['REQUEST_URI']);
return $current_url;
// if(defined('WP_CLI')){
// $_SERVER["SERVER_NAME"] = isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : "";
// $_SERVER["SERVER_PORT"] = isset($_SERVER["SERVER_PORT"]) ? $_SERVER["SERVER_PORT"] : 80;
// }
// $pageURL = 'http';
// if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
// $pageURL .= 's';
// }
// $pageURL .= '://';
// if($_SERVER['SERVER_PORT'] != '80'){
// $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI'];
// }else{
// $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
// }
// return $pageURL;
}
public function wpfc_load_plugin_textdomain(){
load_plugin_textdomain('wp-fastest-cache', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' );
}
public function cdn_replace_urls($matches){
if(count($this->cdn) > 0){
foreach ($this->cdn as $key => $cdn) {
if($cdn->id == "cloudflare"){
continue;
}
if(isset($cdn->status) && $cdn->status == "pause"){
continue;
}
if(preg_match("/manifest\.json\.php/i", $matches[0])){
return $matches[0];
}
//https://site.com?brizy_media=AttachmentName.jpg&brizy_crop=CropSizes&brizy_post=TheCurrentPost
if(preg_match("/brizy_media\=/i", $matches[0])){
return $matches[0];
}
//https://cdn.shortpixel.ai/client/q_glossy,ret_img,w_736/http://wpfc.com/stories.png
if(preg_match("/cdn\.shortpixel\.ai\/client/i", $matches[0])){
return $matches[0];
}
if(preg_match("/^\/\/random/", $cdn->cdnurl) || preg_match("/\/\/i\d\.wp\.com/", $cdn->cdnurl)){
// Photon will no longer be supported
continue;
}
$cdnurl = $cdn->cdnurl;
$cdn->file_types = str_replace(",", "|", $cdn->file_types);
if(preg_match("/\.(".$cdn->file_types.")(\"|\'|\?|\)|\s|\&quot\;)/i", $matches[0])){
//nothing
}else{
if(preg_match("/js/", $cdn->file_types)){
if(!preg_match("/\/revslider\/public\/assets\/js/", $matches[0])){
continue;
}
}else{
continue;
}
}
if($cdn->keywords){
$cdn->keywords = str_replace(",", "|", $cdn->keywords);
if(!preg_match("/".preg_quote($cdn->keywords, "/")."/i", $matches[0])){
continue;
}
}
if(isset($cdn->excludekeywords) && $cdn->excludekeywords){
$cdn->excludekeywords = str_replace(",", "|", $cdn->excludekeywords);
if(preg_match("/".preg_quote($cdn->excludekeywords, "/")."/i", $matches[0])){
continue;
}
}
if(preg_match("/(data-product_variations|data-siteorigin-parallax)\=[\"\'][^\"\']+[\"\']/i", $matches[0])){
$cdnurl = preg_replace("/(https?\:)?(\/\/)(www\.)?/", "", $cdnurl);
// if(preg_match("/i\d\.wp\.com/i", $cdnurl)){
// $matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", "$1$2$3".$cdnurl, $matches[0]);
// }else{
// $matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", "$1$2$3$4".$cdnurl, $matches[0]);
// }
$matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", '${1}${2}${3}'.$cdnurl, $matches[0]);
}else if(preg_match("/\{\"concatemoji\"\:\"[^\"]+\"\}/i", $matches[0])){
$matches[0] = preg_replace("/(http(s?)\:)?".preg_quote("\/\/", "/")."(www\.)?/i", "", $matches[0]);
$matches[0] = preg_replace("/".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]);
}else if(isset($matches[2]) && preg_match("/".preg_quote($cdn->originurl, "/")."/", $matches[2])){
$matches[0] = preg_replace("/(http(s?)\:)?\/\/(www\.)?".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]);
}else if(isset($matches[2]) && preg_match("/^(\/?)(wp-includes|wp-content)/", $matches[2])){
$matches[0] = preg_replace("/(\/?)(wp-includes|wp-content)/i", $cdnurl."/"."$2", $matches[0]);
}else if(preg_match("/[\"\']https?\:\\\\\/\\\\\/[^\"\']+[\"\']/i", $matches[0])){
if(preg_match("/^(logo|url|image)$/i", $matches[1])){
//If the url is called with "//", it causes an error on https://search.google.com/structured-data/testing-tool/u/0/
//<script type="application/ld+json">"logo":{"@type":"ImageObject","url":"\/\/cdn.site.com\/image.png"}</script>
//<script type="application/ld+json">{"logo":"\/\/cdn.site.com\/image.png"}</script>
//<script type="application/ld+json">{"image":"\/\/cdn.site.com\/image.jpg"}</script>
}else{
//<script>var loaderRandomImages=["https:\/\/www.site.com\/wp-content\/uploads\/2016\/12\/image.jpg"];</script>
$matches[0] = preg_replace("/\\\\\//", "/", $matches[0]);
if(preg_match("/".preg_quote($cdn->originurl, "/")."/", $matches[0])){
$matches[0] = preg_replace("/(http(s?)\:)?\/\/(www\.)?".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]);
$matches[0] = preg_replace("/\//", "\/", $matches[0]);
}
}
}
}
}
return $matches[0];
}
public function read_file($url){
if(!preg_match("/\.php/", $url)){
$url = preg_replace("/\?.*/", "", $url);
if(preg_match("/wp-content/", $url)){
$path = preg_replace("/.+\/wp-content\/(.+)/", WPFC_WP_CONTENT_DIR."/"."$1", $url);
}else if(preg_match("/wp-includes/", $url)){
$path = preg_replace("/.+\/wp-includes\/(.+)/", ABSPATH."wp-includes/"."$1", $url);
}
if(isset($path)){
if(@file_exists($path)){
$filesize = filesize($path);
if($filesize > 0){
$myfile = fopen($path, "r") or die("Unable to open file!");
$data = fread($myfile, $filesize);
fclose($myfile);
return $data;
}else{
return false;
}
}
}
}
return false;
}
public function get_operating_systems(){
$operating_systems = array(
'Android',
'blackberry|\bBB10\b|rim\stablet\sos',
'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino',
'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b',
'Windows\sCE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window\sMobile|Windows\sPhone\s[0-9.]+|WCE;',
'Windows\sPhone\s10.0|Windows\sPhone\s8.1|Windows\sPhone\s8.0|Windows\sPhone\sOS|XBLWP7|ZuneWP7|Windows\sNT\s6\.[23]\;\sARM\;',
'\biPhone.*Mobile|\biPod|\biPad',
'Apple-iPhone7C2',
'MeeGo',
'Maemo',
'J2ME\/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135
'webOS|hpwOS',
'\bBada\b',
'BREW'
);
return $operating_systems;
}
public function get_mobile_browsers(){
$mobile_browsers = array(
'\bCrMo\b|CriOS|Android.*Chrome\/[.0-9]*\s(Mobile)?',
'\bDolfin\b',
'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+',
'Skyfire',
'Mobile\sSafari\/[.0-9]*\sEdge',
'IEMobile|MSIEMobile', // |Trident/[.0-9]+
'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS',
'bolt',
'teashark',
'Blazer',
'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari',
'Tizen',
'UC.*Browser|UCWEB',
'baiduboxapp',
'baidubrowser',
'DiigoBrowser',
'Puffin',
'\bMercury\b',
'Obigo',
'NF-Browser',
'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger',
'Android.*PaleMoon|Mobile.*PaleMoon'
);
return $mobile_browsers;
}
}
// Load WP CLI command(s) on demand.
if ( defined( 'WP_CLI' ) && WP_CLI ) {
require_once "inc/cli.php";
}
function wpfc_clear_all_site_cache(){
if(defined('WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE') && WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE){
return array("success" => false, "message" => "Clearing Cache Hook system has been disabled");
}
do_action("wpfc_clear_all_cache");
}
function wpfc_clear_all_cache($minified = false){
if(defined('WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE') && WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE){
return array("success" => false, "message" => "Clearing Cache Hook system has been disabled");
}
do_action("wpfc_clear_all_cache", $minified);
}
function wpfc_exclude_current_page(){
do_action("wpfc_exclude_current_page");
}
function wpfc_clear_post_cache_by_id($post_id = false){
if($post_id){
do_action("wpfc_clear_post_cache_by_id", false, $post_id);
}
}
function wpfc_create_post_cache_by_id($post_id = false){
if($post_id){
do_action("wpfc_create_post_cache_by_id", $post_id);
}
}
$GLOBALS["wp_fastest_cache"] = new WpFastestCache();
?>