WP Rocket缓存插件会自动清除缓存,WP Rocket插件的官方给出了解决办法,给出了一个叫 wp-rocket-no-cache-auto-purge的禁用自动缓存清除插件,可以禁止WP Rocket自动删除缓存。有朋友用了这个缓存插件并开启了WP Rocket预缓存,结果过两天发现WP Rocket缓存文件自动消失,在wp-content/cache/wp-rocket/xxxx.com目录中没有相应的缓存文件,特别是侧边栏设置随机文章或者最新文章的朋友,因此怀疑是主题或插件存在兼容性。至于WP Rocket何时清除缓存?下面给出一些说明。
WP火箭何时清除缓存?
完全或部分缓存删除的最常见触发器包括:
- 缓存生命周期:
在“缓存设置”选项卡上,可以指定缓存生命周期。只会删除早于指定生存期的缓存文件。cron 作业将每小时运行一次,以检查应删除哪些文件。 - 新内容:
当您发布新内容或更新/编辑现有内容时,该帖子/页面、主页以及相关内容(例如分类存档)的缓存将被清除,并且(如果您的设置允许)之后将预加载。 - 对WP Rocket设置的更改:
当您更改WP Rocket中影响站点前端的某些选项(例如文件优化)时,缓存将自动清除。 - 对于托管/缓存兼容性:保持缓存同步(例如,在WP引擎和其他设备上) )
完全缓存删除
这些WordPress操作会触发完全缓存删除:
- 更新WP火箭,具体取决于新版本中包含的更改类型
- 更改/更新当前主题和父主题 (子主题)
- 更新导航菜单
- 更新主题选项
- 创建/更新/删除侧边栏小部件
- 创建/更新/删除类别、标签或永久链接结构
- 创建/更新/删除注册为“公共”的术语
- 创建/更新/删除链接(在3.5版中从WorPress核心中删除的帖子类型“链接”,但仍可以通过插件使用)
- 当任何选项保存在定制器中时
- 当 Avada 主题清除自己的缓存时
- 当触发使用该函数的任何代码段时,例如此 cron 作业
rocket_clean_domain()
部分缓存删除
将触发部分缓存删除的操作:
- 创建/更新/删除帖子、页面或公共自定义帖子类型
- 创建/更新/删除帖子的评论
- 如果启用了用户缓存并更新或删除用户,则只会删除该用户的缓存。
- 相关内容:更新帖子时,主页,主页Feed,下一个和上一个帖子(按ID和同一类别),帖子页面,帖子类型存档页面,作者页面以及所有帖子祖先也将被清除。使用WooCommerce时,保存产品变体将触发父产品的清除。
- 触发使用该函数的任何代码段时。
rocket_clean_post()
WP Rocket官方插件禁用自动缓存清除插件的主要代码如下:
<?php
/**
* Plugin Name: WP Rocket|禁用缓存清除
* Description:禁用所有WP火箭的自动缓存清除。
* Plugin URI: https://blog.jinlinet.com/
* Author: wp操
* Author URI: https://blog.jinlinet.com/
* License: GNU 通用公共许可证 v2 或更高版本
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
*
* 版权所有 SAS WP MEDIA 2022
*/
namespace WP_Rocket\Helpers\cache\no_cache_auto_purge;
// 标准插件安全性,请保持此行。
defined( 'ABSPATH' ) or die();
/**
* 删除所有WP火箭的缓存清除操作。
*
* @author wp操
*/
function remove_purge_hooks() {
// WP核心动作钩子完全缓存删除被钩住
$clean_domain_hooks = array(
//当用户更改主题时
'switch_theme',
// 添加用户时
'user_register',
// 当用户更新时
'profile_update',
// 删除用户时
'deleted_user',
// 更新自定义菜单时
'wp_update_nav_menu',
// 当任何主题修改更新时
'update_option_theme_mods_' . get_option( 'stylesheet' ),
// 更改小部件的顺序时
'update_option_sidebars_widgets',
//当类别永久链接前缀更新时
'update_option_category_base',
// 当标记永久链接前缀更新时
'update_option_tag_base',
// 当永久链接结构更新时
'permalink_structure_changed',
// 创建术语时(在 WP Rocket 3.5.5 之前)
'create_term',
// 当术语更新时(在WP Rocket 3.5.5之前)
'edited_terms',
// 当一个术语被删除时(在WP Rocket 3.5.5之前)
'delete_term',
// 添加链接(帖子类型)时
'add_link',
// 当链接(帖子类型)更新时
'edit_link',
// 删除链接(帖子类型)时
'delete_link',
// 当结果保存在定制器中时
'customize_save',
// 当 Avada 主题清除其自己的缓存时
'avada_clear_dynamic_css_cache',
);
// WP核心动作钩子部分缓存删除被钩住
$clean_post_hooks = array(
// 在编辑内容时禁用部分缓存的刷新
'wp_trash_post',
'delete_post',
'clean_post_cache',
'wp_update_comment_count',
);
//从核心操作挂钩中删除 完全缓存删除
foreach ( $clean_domain_hooks as $key => $handle ) {
remove_action( $handle, 'rocket_clean_domain' );
}
// 核心操作挂钩中删除 部分缓存删除
foreach ( $clean_post_hooks as $key => $handle ) {
remove_action( $handle, 'rocket_clean_post' );
}
// 在更新小组件时阻止缓存清除
remove_filter( 'widget_update_callback' , 'rocket_widget_update_callback' );
// 在更新当前主题时阻止缓存清除
remove_action( 'upgrader_process_complete', 'rocket_clean_cache_theme_update', 10, 2 );
// 防止在帖子状态从“发布”更改为“草稿”时清除缓存
remove_action( 'pre_post_update', 'rocket_clean_post_cache_on_status_change', 10, 2 );
// 防止在帖子的辅助信息域发生更改时清除缓存
remove_action( 'pre_post_update', 'rocket_clean_post_cache_on_slug_change', PHP_INT_MAX, 2 );
}
add_action( 'wp_rocket_loaded', __NAMESPACE__ . '\remove_purge_hooks' );
/**
* 在为WP Rocket 3.5.5或更高版本创建/更新/删除术语时禁用缓存清除。
* 禁用WP Rocket 3.5或更高版本的用户缓存清除。
*/
function wp_rocket_disable_user_cache_purging(){
$container = apply_filters( 'rocket_container', '');
// 更新配置文件后(仅限用户缓存)
$container->get('event_manager')->remove_callback( 'profile_update', [ $container->get('purge_actions_subscriber'), 'purge_user_cache'] );
// 删除用户后(仅限用户缓存
$container->get('event_manager')->remove_callback( 'delete_user', [ $container->get('purge_actions_subscriber'), 'purge_user_cache'] );
// 创建术语后
$container->get('event_manager')->remove_callback( 'create_term' , [ $container->get('purge_actions_subscriber'), 'maybe_purge_cache_on_term_change'] );
// 编辑术语后
$container->get('event_manager')->remove_callback( 'edit_term' , [ $container->get('purge_actions_subscriber'), 'maybe_purge_cache_on_term_change'] );
// 在期限被删除后
$container->get('event_manager')->remove_callback( 'delete_term' , [ $container->get('purge_actions_subscriber'), 'maybe_purge_cache_on_term_change'] );
}
add_action( 'wp_rocket_loaded', __NAMESPACE__ . '\wp_rocket_disable_user_cache_purging' );
// 使用 Elementor 时防止缓存清除
function wp_rocket_disable_elementor_cache_clearing(){
add_action( 'wp_loaded', function() {
$container = apply_filters( 'rocket_container', '');
$container->get('event_manager')->remove_callback( 'added_post_meta', [ $container->get('elementor_subscriber'), 'maybe_clear_cache'], 10, 3 );
$container->get('event_manager')->remove_callback( 'deleted_post_meta', [ $container->get('elementor_subscriber'), 'maybe_clear_cache'], 10, 3 );
$container->get('event_manager')->remove_callback( 'elementor/core/files/clear_cache', [ $container->get('elementor_subscriber'), 'clear_cache'] );
$container->get('event_manager')->remove_callback( 'update_option__elementor_global_css', [ $container->get('elementor_subscriber'), 'clear_cache'] );
$container->get('event_manager')->remove_callback( 'delete_option__elementor_global_css', [ $container->get('elementor_subscriber'), 'clear_cache'] );
} );
}
add_action( 'wp_rocket_loaded', __NAMESPACE__ . '\wp_rocket_disable_elementor_cache_clearing' );
// 防止在使用 Avada 时清除缓存
add_action( 'wp', function(){
remove_action( 'avada_clear_dynamic_css_cache', 'rocket_clean_domain' );
remove_action( 'fusion_cache_reset_after', 'rocket_avada_clear_cache_fusion_patcher' );
});
/**
* 在保存WooCoommerce产品变体后禁用缓存清除
*
* @author wp操
*/
function wp_rocket_disable_woocommerce_variation_cache_clear(){
$container = apply_filters( 'rocket_container', '');
$container->get('event_manager')->remove_callback( 'woocommerce_save_product_variation', [ $container->get('woocommerce_subscriber'), 'clean_cache_after_woocommerce_save_product_variation'] );
}
add_action( 'wp_rocket_loaded', __NAMESPACE__ . '\wp_rocket_disable_woocommerce_variation_cache_clear' );
/**
* 也许呈现管理员通知
*
* @author wp操
*/
function maybe_render_admin_notice() {
if ( ! maybe_is_admin_on_settings_page() ) {
return false;
}
// 呈现消息
printf(
'<div class="notice notice-info"><p>%s</p></div>',
__( '<strong>WP Rocket | Disable Cache Clearing:</strong> Automatic Cache Clearing is programmatically disabled.' )
);
}
add_action( 'admin_notices', __NAMESPACE__ . '\maybe_render_admin_notice', 100 );
/**
* 检查我们是否在WP Rocket的设置页面上的admin_notices过滤器中
* 并且当前用户有权管理 WP Rocket.
*
* @author wp操
*
* @return bool True 如果以上所有,否则为 false
*/
function maybe_is_admin_on_settings_page() {
// 仅用于admin_notices过滤器
if ( 'admin_notices' !== current_filter() ) {
return false;
}
// 仅当 WP Rocket 处于活动状态时。
if ( ! function_exists( 'get_rocket_option' ) ) {
return false;
}
// 仅适用于 WP Rocket 管理员
if ( ! current_user_can( apply_filters( 'rocket_capacity', 'manage_options' ) ) ) {
return false;
}
// 确定屏幕ID,我们可能处于白标模式 - WP Rocket的兼容性 < = 2.9.11
$current_screen = get_current_screen();
$rocket_wl_name = get_rocket_option( 'wl_plugin_name', null );
$wp_rocket_screen_id = isset( $rocket_wl_name ) ? 'settings_page_' . sanitize_key( $rocket_wl_name ) : 'settings_page_wprocket';
// 仅在 WP Rocket 设置页面上
if ( $wp_rocket_screen_id !== $current_screen->base ) {
return false;
}
return true;
}
以上钩子可以自行更改需要的部分
WP Rocket非常好用且功能强大,开发者为了让用户使用起来更便捷,所以增加了很多自动化的功能
需要下载的朋友可以从此处下载WP-ROCKET插件 以及 禁用自动缓存清除插件:
链接: https://pan.baidu.com/s/1gDMBKSpUq4N23FDP072BHQ
提取码: 6mi9
安装方法与其他插件一样。