剛在 TranslatePress 的視覺化編輯器裡把英文版的 SEO 標題修好了,興沖沖地把連結貼到 Facebook 準備分享,一看預覽,標題和描述竟然還是舊的?反覆在後台檢查了好幾次,自訂的 OG title 確實改好了,點選網頁原始碼看也正確,偏偏 Facebook 爬蟲抓到的就是一灘死水。這種「明明改對了,外部平台卻沒反應」的挫折感,幾乎是每個多語言網站站長必經的痛。
這其實不是 Facebook 反應太慢,也不是 TranslatePress 沒存好,而是中間有一層快取屏障擋住了爬蟲。因為改動發生在翻譯層,而頁面輸出或效能外掛的快取卻還是舊版本,只要快取沒清乾淨,社群平台的爬蟲就會繼續吃到快取裡的舊標籤,自然不會更新。
內容導覽
快取斷層:為什麼後台改了,前台原始碼卻沒事
TranslatePress 不同於傳統的 .po/.mo 檔案式翻譯,它是將翻譯內容直接儲存在 WordPress 資料庫的 wp_trp_* 資料表中。當你在前台切換語言時,外掛會即時從資料庫抓取對應的翻譯字串來動態替換頁面上的內容。
問題就出在「動態替換」和「靜態快取」的衝突。現代 WordPress 網站幾乎都會安裝 WP Rocket、LiteSpeed Cache 或主機端的物件快取。這些快取機制會將「包含 OG 標籤的整份 HTML」存成靜態檔案。當你更新翻譯後,如果沒有主動告知快取外掛「這個網址的頁面在多個語言下都要打掉重練」,快取外掛就會繼續提供舊的 HTML,直到它自然過期。
清除多語言快取的核心實作
要解決這個問題,必須在兩個關鍵時機點強制介入快取清除:第一,在 WordPress 原生文章更新時;第二,在 TranslatePress 翻譯編輯器儲存翻譯時。以下是清除邏輯的核心程式碼。
文章更新時,一併清除所有語言的快取
掛上 post_updated 勾點,強制取得該篇文章在所有已發佈語言中的完整網址,然後一次傳入 rocket_clean_files() 清空一整批網址的快取。
add_action('post_updated', 'trpc_clear_cache_when_updating_post', 10, 1);
function trpc_clear_cache_when_updating_post($post_id){
$trp = TRP_Translate_Press::get_trp_instance();
$url_converter = $trp->get_component('url_converter');
$settings_component = $trp->get_component('settings');
$trp_settings = $settings_component->get_settings();
$clear_urls = array();
add_filter('trp_add_language_to_home_url_check_for_admin', '__return_false');
$default_language_permalink = get_permalink($post_id);
$clear_urls[] = $default_language_permalink;
foreach($trp_settings['translation-languages'] as $language) {
if ($language === $trp_settings['default-language']){
continue;
}
$clear_urls[] = $url_converter->get_url_for_language($language, $default_language_permalink, '');
}
remove_filter('trp_add_language_to_home_url_check_for_admin', '__return_false');
rocket_clean_files($clear_urls);
}翻譯編輯器儲存時清除 WP Rocket 快取
這一段專門處理你在 TranslatePress 翻譯編輯器中按下儲存的那一刻。利用 trp_save_editor_translations_regular_strings 勾點(需要 TranslatePress 2.5.7 以上版本),精準找出翻譯被修改的語言,只清除有變動的語言網址,避免不必要的整站快取大清洗。
add_action('trp_save_editor_translations_regular_strings', 'trpc_clear_cache_when_updating_translation', 10, 2);
function trpc_clear_cache_when_updating_translation($update_strings, $settings) {
$trp = TRP_Translate_Press::get_trp_instance();
$url_converter = $trp->get_component('url_converter');
$clear_urls = array();
$current_url = remove_query_arg('trp-edit-translation', esc_url($_POST['url']));
foreach ($settings['translation-languages'] as $language) {
if (!empty($update_strings[$language])) {
$clear_urls[] = $url_converter->get_url_for_language($language, $current_url, '');
}
}
rocket_clean_files($clear_urls);
}💡 務必確認語言代碼格式
- • 雙重優勢:上述寫法同時解決了「後台更新文章」與「前台上稿翻譯」兩種情境,讓快取管理沒有死角
- • 關鍵細節:
get_url_for_language()傳入的語言參數必須是完整的語言代碼(如en_US),不能只傳網址 slug(如en),否則網址生成會出錯
手動清除特定語言快取的替代方案
如果不需要大規模自動化,只是想在開發階段手動清掉某個語言的整站快取,可以直接運用 TranslatePress 的 URL 轉換器生成本地化的首頁網址,再丟給快取外掛做網域層級的清除。
$trp = TRP_Translate_Press::get_trp_instance();
$url_converter = $trp->get_component('url_converter');
$language = 'fr_FR';
global $TRP_LANGUAGE;
add_filter('trp_add_language_to_home_url_check_for_admin', '__return_false');
$home_url_for_lang = $url_converter->get_url_for_language($language, home_url(), '');
remove_filter('trp_add_language_to_home_url_check_for_admin', '__return_false');
rocket_clean_files($home_url_for_lang);這種做法非常適合在除錯時使用。當你只想確認法文版的快取是否有問題,不需要驚動其他語言,直接針對 fr_FR 產生的首頁網址執行清除即可。
踩坑提醒與實務開發建議
多語言與快取的整合很容易在「邊界情境」上栽跟頭,以下是幾個實際案場中最常見的陷阱與對策。
一、快取外掛不只 WP Rocket 一種
上面的程式碼以 WP Rocket 為例,使用 rocket_clean_files()。如果你用的是 LiteSpeed Cache,必須改為 do_action( 'litespeed_purge_url', $url );若是主機端的 Varnish 或 Cloudflare APO,則需要額外發送 purge request。務必確認你網站上的快取層有哪些,一層沒清到,問題就還在。
二、物件快取的隱性殺傷力
即使清掉了頁面快取,如果你的網站使用了 Redis 或 Memcached 物件快取,且 TranslatePress 的查詢結果被長期緩存,OG 標籤的資料仍可能來自舊的物件快取。在清除頁面快取後,建議搭配 WP CLI 指令 wp cache flush 或使用 Redis 的管理工具一併清除物件快取。
三、OG 資料流的最後一關:社群平台除錯工具
快取清掉後,別急著直接貼連結。Facebook 和 LinkedIn 都有自己的 OG 快取機制。請務必使用官方除錯工具手動觸發重新抓取:Facebook 使用 分享除錯工具,LinkedIn 則使用 Post Inspector。輸入網址後點擊「取得新資訊」,才能強制爬蟲立刻更新,否則它可能還是會吐給你幾分鐘前的舊版本。
四、坦白限制:程式碼的適用版本與 Hook 穩定性
trp_save_editor_translations_regular_strings 這個勾點從 TranslatePress 2.5.7 版本後才較為穩定,如果你的外掛版本低於此,可能會無法觸發清除,建議升級。另外,TranslatePress 在開發版或小版號更新中偶爾會微調內部 Hook,如果發現快取突然又失效,第一時間檢查外掛更新紀錄與 Hook 參數是否有變動。對多語言營運的網站來說,穩定性永遠優先於新功能,建議在 staging 環境先驗證再上線。


