下面给你一份可以直接照着做的操作指南。目标只有一个:
让 FlyingPress 的 Preload 队列变少,减轻 PHP 和数据库压力。
你当前的站点规则是:
-
英语 = 主站根目录
/ -
其他语种 = 子目录 ,例如
/fr/、/de/、/es/
这份方案会做到:
-
英语全站正常预加载
-
其他语种只预加载首页
-
默认情况下,其他语种内页仍然可以被动缓存
-
如果你后面想更狠一点,也可以改成:其他语种只有首页缓存,内页不缓存
FlyingPress 官方支持用 flying_press_preload_urls 自定义预加载 URL,用 flying_press_is_cacheable 自定义页面是否可缓存,而且这类代码可以放在主题的 functions.php、自定义插件,或者 Code Snippets 里。(FlyingPress Documentation)
一、先做后台里的两个设置
第 1 步:关闭移动端独立缓存
你前面已经找到了这个开关。
进入 FlyingPress 的缓存设置页,把:
Separate Mobile Cache & Optimizations
改成 关闭。
FlyingPress 官方说明,队列里的 URLs in Queue 会包含各种 URL 变体,其中就包括移动端和桌面端的独立版本 ;也就是说,开着移动端独立缓存时,同一个页面可能会拆成更多待处理任务。(FlyingPress Documentation)
第 2 步:清空 Query Parameters 独立缓存
在同一个缓存设置页里,找到:
Separate Cache for Query Parameters
如果里面有你手动填过的参数,比如:
-
lang -
filter -
sort -
page -
country -
currency
全部删空,然后保存。
FlyingPress 官方说明,默认情况下带 query 参数的 URL 不会被缓存 ;只有你把某个参数加入这个设置后,它才会为该参数生成单独缓存版本,每种变化都会变成独立缓存文件。(FlyingPress Documentation)
第 3 步:如果你看到了登录用户缓存,也建议先关
如果你在缓存设置里看到了:
Cache for Logged-in Users by Role
建议先关闭。
如果你暂时不想关,至少不要给管理员、编辑、店长之类后台角色做缓存。
官方说明,这个功能一旦开启,就会按用户角色生成独立缓存版本 。角色越多,缓存版本越多。(FlyingPress Documentation)
二、把代码加到 functions.php
第 4 步:先备份
在动代码前,先备份当前主题的 functions.php。
如果你用的是子主题,优先改子主题 的 functions.php。
第 5 步:打开 functions.php
常见方式有两种:
方法 A:WordPress 后台
外观 → 主题文件编辑器 → functions.php
方法 B:主机文件管理器 / FTP
进入当前主题目录,找到:
/wp-content/themes/你的主题/functions.php
第 6 步:粘贴代码时,不要再加新的 <?php
如果你是往现有 functions.php 里粘贴,不要再多贴一个新的 <?php 。
直接把下面代码粘贴到文件底部即可。
第 7 步:粘贴下面这段最终版代码
这版已经按你的要求改好了:
-
语种只在一个地方定义
-
英语默认就是根目录
/ -
改语种时,只改一处
-
默认只限制 Preload 队列
-
不会一上来就把其他语种内页彻底禁缓存
/**
- FlyingPress language rules
- 站点结构:
-
- 英语:主站根目录 /
-
- 其他语种:例如 /fr/ /de/ /es/
- 作用:
-
- 英语(根目录)=> 全部正常预加载
-
- 其他语种 => 只预加载各自首页
-
- 可选:其他语种内页不缓存(默认关闭)
*/
- 可选:其他语种内页不缓存(默认关闭)
/**
-
=========================
-
只改这里
-
=========================
*/
function fp_lang_rules_config() {
return [
// 其他语种目录,只需要在这里定义一次,不要带前后斜杠
'secondary_languages' => ['fr', 'de', 'es'],// false = 只限制 preload,其他语种内页仍可被动缓存(推荐) // true = 其他语种只有首页可缓存,其他内页不缓存(更激进) 'block_secondary_inner_cache' => true,];
}
/**
- =========================
- 工具函数
- =========================
*/
function fp_lang_rules_normalize_path(path) { path = is_string(path) ? path : '/';
path = '/' . ltrim(path, '/');
return trailingslashit($path);
}
function fp_lang_rules_get_secondary_prefixes() {
$config = fp_lang_rules_config();return array_map(function ($lang) { return '/' . trim($lang, '/') . '/'; }, $config['secondary_languages']);}
function fp_lang_rules_is_secondary_path(path) { path = fp_lang_rules_normalize_path($path);
foreach (fp_lang_rules_get_secondary_prefixes() as $prefix) { if (strpos($path, $prefix) === 0) { return true; } } return false;}
function fp_lang_rules_is_secondary_home(path) { path = fp_lang_rules_normalize_path(path); return in_array(path, fp_lang_rules_get_secondary_prefixes(), true);
}function fp_lang_rules_is_default_language_path(path) { // 英语是根目录语言: // 只要不是其他语种前缀,就视为英语 return !fp_lang_rules_is_secondary_path(path);
}/**
-
=========================
-
- 控制 preload 队列
-
英语全保留;其他语种只保留首页
-
=========================
*/
add_filter('flying_press_preload_urls', function (urls) { filtered = [];foreach (urls as url) {
path = wp_parse_url(url, PHP_URL_PATH);
path = fp_lang_rules_normalize_path(path);// 英语(根目录语言)=> 全部保留 if (fp_lang_rules_is_default_language_path($path)) { $filtered[] = $url; continue; } // 其他语种 => 只保留首页 if (fp_lang_rules_is_secondary_home($path)) { $filtered[] = $url; continue; }}
return array_values(array_unique($filtered));
});
/**
-
=========================
-
- 可选:控制实际缓存
-
默认关闭。开启后:
-
- 英语 => 正常缓存
-
- 其他语种首页 => 正常缓存
-
- 其他语种内页 => 不缓存
-
=========================
*/
add_filter('flying_press_is_cacheable', function (is_cacheable) { config = fp_lang_rules_config();// 默认不开这个狠规则
if (empty(config['block_secondary_inner_cache'])) { return is_cacheable;
}request_uri = isset(_SERVER['REQUEST_URI']) ? _SERVER['REQUEST_URI'] : '/'; path = wp_parse_url(request_uri, PHP_URL_PATH); path = fp_lang_rules_normalize_path($path);
// 英语(根目录语言)=> 正常缓存
if (fp_lang_rules_is_default_language_path(path)) { return is_cacheable;
}// 其他语种首页 => 正常缓存
if (fp_lang_rules_is_secondary_home(path)) { return is_cacheable;
}// 其他语种内页 => 不缓存
return false;
});
备注,下面的代码是上面的优化版:
/**
* FlyingPress language rules
* 英语 = 根目录 /
* 其他语种 = 只在一个地方定义
*/
function fp_lang_rules_config() {
return [
'secondary_languages' => ['fr', 'de', 'es'],
'block_secondary_inner_cache' => true,
];
}
function fp_lang_rules_normalize_path($path) {
$path = is_string($path) ? $path : '/';
$path = '/' . ltrim($path, '/');
return trailingslashit($path);
}
function fp_lang_rules_get_secondary_prefixes() {
static $prefixes = null;
if ($prefixes !== null) {
return $prefixes;
}
$config = fp_lang_rules_config();
$prefixes = array_map(function ($lang) {
return '/' . trim($lang, '/') . '/';
}, $config['secondary_languages']);
return $prefixes;
}
function fp_lang_rules_is_secondary_path($path) {
$path = fp_lang_rules_normalize_path($path);
foreach (fp_lang_rules_get_secondary_prefixes() as $prefix) {
if (strpos($path, $prefix) === 0) {
return true;
}
}
return false;
}
function fp_lang_rules_is_secondary_home($path) {
$path = fp_lang_rules_normalize_path($path);
return in_array($path, fp_lang_rules_get_secondary_prefixes(), true);
}
function fp_lang_rules_is_default_language_path($path) {
return !fp_lang_rules_is_secondary_path($path);
}
function fp_lang_rules_allow_url($url) {
$path = wp_parse_url($url, PHP_URL_PATH);
$path = fp_lang_rules_normalize_path($path);
if (fp_lang_rules_is_default_language_path($path)) {
return true;
}
if (fp_lang_rules_is_secondary_home($path)) {
return true;
}
return false;
}
add_filter('flying_press_preload_urls', function ($urls) {
$filtered = array_filter($urls, 'fp_lang_rules_allow_url');
return array_values(array_unique($filtered));
});
add_filter('flying_press_is_cacheable', function ($is_cacheable) {
$config = fp_lang_rules_config();
if (empty($config['block_secondary_inner_cache'])) {
return $is_cacheable;
}
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
$path = wp_parse_url($request_uri, PHP_URL_PATH);
$path = fp_lang_rules_normalize_path($path);
if (fp_lang_rules_is_default_language_path($path)) {
return $is_cacheable;
}
if (fp_lang_rules_is_secondary_home($path)) {
return $is_cacheable;
}
return false;
});
add_filter('flying_press_auto_purge_urls', function ($urls, $post_id) {
$filtered = array_filter($urls, 'fp_lang_rules_allow_url');
return array_values(array_unique($filtered));
}, 10, 2);
这段代码里真正控制 FlyingPress 的,是两个官方支持的过滤器:
-
flying_press_preload_urls:用于修改预加载 URL 列表。(FlyingPress Documentation) -
flying_press_is_cacheable:用于按条件决定当前请求是否可以缓存。(FlyingPress Documentation)
三、你只需要改一处配置
如果你的语种是:
-
法语
/fr/ -
德语
/de/ -
意大利语
/it/ -
西班牙语
/es/
你只改这一行:
'secondary_languages' => ['fr', 'de', 'it', 'es'],
别的地方都不用动。
四、默认推荐你先用"保守模式"
现在先保持:
'block_secondary_inner_cache' => false,
这表示:
-
英语全站参与预加载
-
其他语种只有首页进入主动预加载队列
-
其他语种内页不进主动预加载
-
但用户访问这些内页时,它们仍可以正常被缓存
这是最稳的方案。它主要减少的是Preload 任务量 ,不会立刻把其他语种内页打成完全无缓存。官方文档也说明,flying_press_is_cacheable 只有在你返回 false 时,才会直接阻止当前请求被缓存。(FlyingPress Documentation)
五、如果你后面想更狠一点
把这一行:
'block_secondary_inner_cache' => false,
改成:
'block_secondary_inner_cache' => true,
这样就会变成:
-
英语全站缓存
-
其他语种只有首页缓存
-
其他语种内页不缓存
这个效果来自 flying_press_is_cacheable 返回 false。官方文档明确写了:返回 false 就是阻止当前请求被缓存。(FlyingPress Documentation)
六、保存后必须做的事
第 8 步:保存 functions.php
保存文件。
如果保存时报语法错误,先把刚粘贴的代码删掉,恢复备份,再检查是不是多贴了一个 <?php,或者少了括号。
第 9 步:清空 FlyingPress 旧缓存
进入:
FlyingPress → Settings → Tools → Purge Everything
点一次 Purge Everything。
官方文档明确写了这个路径,并说明它会清掉所有缓存文件和数据。(FlyingPress Documentation)
七、做完后怎么检查是否生效
第 10 步:先观察队列有没有下降
进入 FlyingPress 后台,看:
-
Pages Cached
-
URLs in Queue
官方说明:
-
Pages Cached是已经成功缓存的主页面路径数量 -
URLs in Queue是还在排队的 URL 变体数量,里面会包含设备版本、参数版本等独立变体。(FlyingPress Documentation)
你做完这套调整后,正常情况应该看到:
-
URLs in Queue比之前少 -
多语言页面不再全量灌进预加载队列
-
移动端关闭后,设备变体减少
-
query parameter 删空后,参数变体减少
第 11 步:抽查页面
你可以手动打开几类页面看看:
-
英语首页
/ -
英语文章页
/some-post/ -
法语首页
/fr/ -
法语内页
/fr/some-page/
如果你当前用的是默认保守模式 false,那么结果应该是:
-
英语页面:正常缓存 / 预加载
-
法语首页:参与预加载
-
法语内页:不参与主动预加载,但访问后仍可被动缓存
八、如果你还想继续减负,再做这两件事
1)不要随便加 Cookie 变体
如果你自己或其他插件用了 flying_press_cache_include_cookies,FlyingPress 会按这些 cookie 生成独立缓存键。官方明确提醒:
-
只有必要时才用
-
频繁变化的 cookie 会增加缓存文件数量
-
可能导致缓存碎片化。(FlyingPress Documentation)
所以你现在的目标是减队列,不要额外加 cookie variation。
2)别让安全规则拦住预加载
如果你发现不是"队列太大",而是"队列一直卡住、不动、反复重来",官方排查重点有两个:
-
放行 User-Agent 含
FlyingPress的请求 -
不要拦截或限流
admin-ajax.php
因为 FlyingPress v5 之后会从云端抓取页面做预加载分析,而 admin-ajax.php 用于触发和管理预加载。被拦住时,预加载可能卡住或失败。(FlyingPress Documentation)
九、最简执行清单
你照着这一版做就够了:
-
关闭 Separate Mobile Cache & Optimizations 。(FlyingPress Documentation)
-
清空 Separate Cache for Query Parameters 。(FlyingPress Documentation)
-
如果开启了 Cache for Logged-in Users by Role ,先关闭。(FlyingPress Documentation)
-
备份
functions.php。 -
把我给你的代码粘贴到
functions.php最底部。 -
不要再额外加新的
<?php。 -
保存文件。
-
去 FlyingPress → Settings → Tools → Purge Everything 。(FlyingPress Documentation)
-
回 FlyingPress 后台看
URLs in Queue是否下降。(FlyingPress Documentation)
十、你当前最推荐的配置
你先这样用:
'secondary_languages' => ['fr', 'de', 'es'],
'block_secondary_inner_cache' => false,
这就是目前最适合你的版本:
-
队列会明显减少
-
风险比"直接禁掉其他语种内页缓存"小很多
-
出问题时也好回退
如果你愿意,我下一条可以继续给你一份**"如何判断代码是否生效"的排错指南**,也是按小白步骤写。