问题描述

有没有一个简单的方法来防止所有缓存在测试网站的更改的外观时?我使用 WP 超级缓存。我可以使用提供的选项删除其缓存,删除浏览器的缓存,还有一些对 css 或 widgets 的更改不会刷新。我尝试其他 work-arounds 像切换浏览器或电脑,但必须有一个更多的 stream-lined 工作流程,我可以确保我查看我所做的更改,而不是一些缓存的早期格式?这是最好的解决方案?

最佳解决方案

将样式表的 filemtime()添加为版本参数。可以说,您的默认样式表是在 css/default.csscss/default.min.css(不是 style.css) 。当我们在 wp_loaded(不是 init) 上注册样式表时,我们可以将版本作为第四个参数传递。这将是最后修改的时间,因此每次更改文件时都会发生更改。

$min    = WP_DEBUG ? '': '.min';
$file   = "/css/default$min.css";
$url    = get_template_directory_uri() . $file;
$path   = get_template_directory() . $file;
$handle = get_stylesheet() . '-default';

// Overridden?
if ( is_child_theme() && is_readable( get_stylesheet_directory() . $file ) )
{
    $url  = get_stylesheet_directory_uri() . $file;
    $path = get_stylesheet_directory()     . $file;
}

$modified = filemtime( $path );

add_action( 'wp_loaded', function() use ( $handle, $url, $modified ) {
    wp_register_style( $handle, $url, [], $modified );
});

add_action( 'wp_enqueue_scripts', function() use ( $handle ) {
    wp_enqueue_style( $handle );
});

如果您正在使用 Node.js 和 Grunt,我强烈推荐 Browsersync 。它会随时更改文件并立即更新。它还可以在多个打开的浏览器中同步滚动位置,表单提交和更多。很酷。

次佳解决方案

这可能看起来过于简单,但是在完成网站的开发部分之前,如何禁用缓存呢?打开和关闭是非常简单的。

第三种解决方案

我知道这个问题已经得到了接受,但是我认为这个答案对于现在的问题来说还是太复杂了,根据使用者的不同,实际上可能是错误的,所以我以为我还是会分享当我做我的 dev(不只是 Wordpress) 时,我如何绕过缓存。

大多数现代浏览器都有一些称为隐身模式的东西。在这种模式下,您的计算机中没有任何内容被缓存,所以每次刷新都是从服务器上下载新的。在 Internet Explorer 中,按 Ctrl + Shift + P 。在 Firefox 和 Chrome 中,您按 Ctrl + Shift + N

如果您的浏览器没有隐身模式,通常可以通过在 Firefox 和 Chrome 上按 Ctrl + F5 或 IE 或 Ctrl + Shift + R 来强制重新加载。

至于您关于 CSS 文件的问题 (实质上,所有的资源文件,如图像和 Javascript 文件),WP Super Cache 不会以任何方式缓存这些问题。您的设置和/或此插件的使用不会影响这些文件的投放方式。什么是缓存这些文件是您的浏览器,这就是为什么你要重新加载的原因。

插件的作用是评估 Wordpress 如何构建 HTML 文件 (通过 PHP),并存储副本,以便下次有人请求相同的帖子,页面或其他内容时,它将提供副本,而不必再次重新评估 PHP-generated HTML,因此节省了一些计算时间,更快地加载您的网页。 (我希望很清楚。)

问题在于,如果您通过 PHP 函数拍摄 CSS 文件的 URL 上的时间戳,那么这是 HTML 对 HTML 的评估,并且将被 WP Super Cache 缓存。对同一帖子的每个请求将具有相同的时间戳,因为用户正在为原始时间戳评估的副本提供服务。 (如我错了请纠正我。)

WP Super Cache 缓存的正确方法是在插件的设置页面中将 Don't cache for known users 选项设置为 true

最后 (这是一个个人喜好,因为我是一个真正的 stickler,当涉及到编码),诉诸使用隐身或强制重新加载不会要求您添加不必要的标记在您的 HTML 页面。当然,添加时间戳每个请求每个静态文件增加大约 13 个字节,但是像我说的那样,我是一个这样的东西的 stickler 。仍然需要 13 个字节。

第四种方案

在寻找一个简单的解决方案很多次后,我决定找到一些有用的东西!

所以… 在思考之后,我发现了一个伟大的方式来覆盖缓存,而开发新的网站…(和它的容易) 。

我们需要的是告诉 wp 这是一个这样的新的 CSS 版本…

变更前:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), false, 'all' );

变更后:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css?v='.time(), array(), false, 'all' );

这是我们添加的:

?v='.time()

说明:我们基本上添加一个动态版本号到 css 文件,强制浏览器加载新的 css 每次我们更新它。

完成开发后不要忘记删除它,否则您的缓存将无法对此文件起作用,并且会一次又一次地为返回的用户加载。

这种技术适用于 css& js 文件 – 希望这有帮助;)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。