問題描述

有沒有一個簡單的方法來防止所有快取在測試網站的更改的外觀時?我使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。