让 FlyingPress 的 Preload 队列变少,减轻 PHP 和数据库压力

下面给你一份可以直接照着做的操作指南。目标只有一个:

让 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/
    • 作用:
      1. 英语(根目录)=> 全部正常预加载
      1. 其他语种 => 只预加载各自首页
      1. 可选:其他语种内页不缓存(默认关闭)
        */

    /**

    • =========================

    • 只改这里

    • =========================
      */
      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);
    }

    /**

    • =========================

      1. 控制 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));
      });

    /**

    • =========================

      1. 可选:控制实际缓存
    • 默认关闭。开启后:

      • 英语 => 正常缓存
      • 其他语种首页 => 正常缓存
      • 其他语种内页 => 不缓存
    • =========================
      */
      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 的,是两个官方支持的过滤器:


三、你只需要改一处配置

如果你的语种是:

  • 法语 /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,那么结果应该是:

  • 英语页面:正常缓存 / 预加载

  • 法语首页:参与预加载

  • 法语内页:不参与主动预加载,但访问后仍可被动缓存


八、如果你还想继续减负,再做这两件事

如果你自己或其他插件用了 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)


九、最简执行清单

你照着这一版做就够了:

  1. 关闭 Separate Mobile Cache & Optimizations 。(FlyingPress Documentation)

  2. 清空 Separate Cache for Query Parameters 。(FlyingPress Documentation)

  3. 如果开启了 Cache for Logged-in Users by Role ,先关闭。(FlyingPress Documentation)

  4. 备份 functions.php

  5. 把我给你的代码粘贴到 functions.php 最底部。

  6. 不要再额外加新的 <?php

  7. 保存文件。

  8. FlyingPress → Settings → Tools → Purge Everything 。(FlyingPress Documentation)

  9. 回 FlyingPress 后台看 URLs in Queue 是否下降。(FlyingPress Documentation)


十、你当前最推荐的配置

你先这样用:

复制代码
'secondary_languages' => ['fr', 'de', 'es'],
'block_secondary_inner_cache' => false,

这就是目前最适合你的版本:

  • 队列会明显减少

  • 风险比"直接禁掉其他语种内页缓存"小很多

  • 出问题时也好回退

如果你愿意,我下一条可以继续给你一份**"如何判断代码是否生效"的排错指南**,也是按小白步骤写。

相关推荐
2301_816660212 小时前
如何处理MongoDB分片集群的连接池耗尽危机_客户端连接与mongos到shard的连接乘数效应
jvm·数据库·python
恋猫de小郭2 小时前
WasmGC 是什么?为什么它对 Dart 和 Kotlin 在 Web 领域很重要?
android·前端·flutter
qq_413847402 小时前
SQL如何利用JOIN提升数据质量检查_查找不一致的关联数据
jvm·数据库·python
电商API&Tina2 小时前
【1688API接口】1688 开放平台 API 接入心得
java·开发语言·数据库·python·sql·json
2301_773553622 小时前
CSS如何制作响应式图片集布局_利用object-fit填充空间
jvm·数据库·python
吕源林2 小时前
如何获取SQL字符串左侧字符_利用LEFT函数快速截取
jvm·数据库·python
baidu_340998822 小时前
如何正确使用 React 的 useContext Hook 管理组件状态
jvm·数据库·python
m0_674294642 小时前
mysql如何通过脚本自动化创建用户_使用shell配合mysql命令
jvm·数据库·python
weixin_408717772 小时前
HTML函数能否用游戏本开发_游戏本硬件冗余分析【指南】
jvm·数据库·python