如何让WordPress插件在WP Rocket缓存页面时仍正常执行?
WP Rocket缓存下页面浏览量统计插件的执行解决方案
当WP Rocket启用静态缓存后,缓存页面会直接返回给访客,完全绕过WordPress核心的PHP执行流程,所以wp钩子、普通插件甚至MU插件的代码都不会触发——因为根本没运行WordPress。以下是可行的解决办法:
方法1:利用WP Rocket动态内容功能(官方推荐)
WP Rocket支持标记页面中部分内容为动态,不参与缓存,这部分的PHP代码会在每次请求时执行。
方式A:使用动态块注释
将统计逻辑的调用包裹在WP Rocket的动态块标记中,放在主题模板(比如footer.php)或者插件的输出位置:
<!-- wp:dynamic-block --> <?php $plugin_public->track_page(); ?> <!-- /wp:dynamic-block -->
确保WP Rocket设置的「高级」选项中已启用动态内容支持。
方式B:绑定到WP Rocket动态内容钩子
将统计方法挂到rocket_dynamic_content动作上,然后在页面中调用该动作:
// 在插件初始化时添加钩子 add_action('rocket_dynamic_content', [$plugin_public, 'track_page']);
接着在主题的footer.php或其他合适位置添加:
<?php do_action('rocket_dynamic_content'); ?>
WP Rocket会自动识别这个动作,跳过缓存并每次执行统计逻辑。
方法2:服务器端代理触发统计脚本
如果需要脱离WordPress流程执行统计,可以在服务器配置中,让所有缓存页面请求先触发统计脚本,再返回缓存内容。
Nginx配置示例
在站点的server区块中添加:
location ~* \.(html|htm)$ { # 先执行统计脚本 fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 替换为你的PHP-FPM路径 fastcgi_param SCRIPT_FILENAME /var/www/html/wp-content/plugins/your-plugin/tracking-script.php; fastcgi_param REQUEST_URI $request_uri; fastcgi_param REMOTE_ADDR $remote_addr; # 再返回缓存页面 try_files $uri $uri/ /index.php?$args; }
tracking-script.php中直接实现统计逻辑(比如记录当前URL、访客IP到数据库),无需依赖WordPress核心。
Apache配置示例
在站点根目录的.htaccess中添加:
RewriteEngine On # 对缓存页面请求先触发统计脚本 RewriteCond %{REQUEST_FILENAME} \.(html|htm)$ RewriteRule ^(.*)$ /wp-content/plugins/your-plugin/tracking-script.php?uri=$1 [L,QSA] # 保留WP Rocket原有的缓存规则
tracking-script.php处理完统计后,可通过readfile()输出缓存文件内容返回给访客。
方法3:修改WP Rocket缓存排除规则
如果你的统计只针对特定页面,可以将这些页面排除在WP Rocket缓存之外:
- 进入WP Rocket设置的「缓存」选项卡
- 在「从不缓存的URL」中添加目标页面的路径(比如
/blog/*)
这种方法适合页面数量少的场景,缺点是会失去缓存对这些页面的性能优化效果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

