lang=en 参数来筛选英文内容
脚本通过在所有 REST 请求里添加 lang=en 参数来筛选英文内容,逻辑如下:
- 常量定义
const LANG = "en";
- getAll 函数接受第二个参数 query,并把其中的键值对(包括 lang)写入 URL 查询串:
async function getAll(endpoint, query = {}) {
// ...existing code...
const searchParams = new URLSearchParams({ per_page: "100", page: String(page) });
for (const [k, v] of Object.entries(query)) {
if (v !== undefined && v !== null) searchParams.append(k, String(v));
}
const res = await fetch(`${API_URL}/${endpoint}?${searchParams.toString()}`);
// ...existing code...
}
- 调用时显式传入 { lang: LANG }:
// filepath
const categoriesArr = await getAll("categories", { lang: LANG });
const tagsArr = await getAll("tags", { lang: LANG });
const posts = await getAll("posts", { lang: LANG });
const mediaArr = await getAll("media", { lang: LANG });
- 生成的请求示例(第 1 页):
- https://csrwiki.com/wp-json/wp/v2/posts?per_page=100&page=1&lang=en
Polylang 在服务器端按语言过滤,所以返回结果已是英文版本,不需要再在本地过滤。
- front matter 中的 language 字段只是标记;真正筛选动作发生在上述带 lang=en 的 API 请求上。
验证方式(任选):
- 浏览器访问 https://csrwiki.com/wp-json/wp/v2/posts?lang=en 查看返回语言是否为英文。
- 去掉 lang 比较数量差异。
- PowerShell:
curl "https://csrwiki.com/wp-json/wp/v2/posts?per_page=1&lang=en"
&lang=en
是 Polylang 提供的,不是 WordPress 核心功能。
说明如下:
- WordPress 核心本身不支持多语言内容隔离,也没有 [lang](vscode-file://vscode-app/c:/Users/wingxu/AppData/Local/Programs/Microsoft VS Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) 这个 REST 查询参数。加上它也不会生效。
- 安装 Polylang 后,它在:
- 前台查询(WP_Query)
- REST API (
/wp-json/wp/v2/...
) 中注册一个 [lang](vscode-file://vscode-app/c:/Users/wingxu/AppData/Local/Programs/Microsoft VS Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) 查询变量,并拦截请求,根据语言代码过滤内容(posts、categories、tags、media 等)。
- 因此你现在代码里对
/wp-json/wp/v2/posts?lang=en
的请求,过滤行为来自 Polylang。 - 若停用 Polylang:
- 该参数将被忽略(返回所有语言的原始文章集合,实际上文章仍然只是“单语”版本记录,失去语言区分)。
- 你的脚本仍会收到数据,但不再有语言过滤效果。
- 语言代码值使用 Polylang 后台设置的“语言 slug”(例如 en、zh、fr)。若你在后台改成
en-us
,就要改脚本常量。
快速验证:
- 浏览器打开:
/wp-json/wp/v2/posts?per_page=2&lang=en
- 再打开:
/wp-json/wp/v2/posts?per_page=2
(不带 lang) - 比较返回的 post id 集合是否不同(或看某篇的中文/英文是否只在其中一组出现)。
扩展(可选):
- 同时导出多语言:循环语言数组
[ 'en','zh' ]
,分别调用 [getAll(‘posts’, { lang })](vscode-file://vscode-app/c:/Users/wingxu/AppData/Local/Programs/Microsoft VS Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html),放到不同目录。 - 如果改用 WPML,参数名称仍是 [lang](vscode-file://vscode-app/c:/Users/wingxu/AppData/Local/Programs/Microsoft VS Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html),但语言代码可能不同(如
en
,zh-hans
)。