Loading...
Loading...
Compare original and translation side by side
/wp-json/wp/v2curl + jq$WORDPRESS_SITE_URLhttps://blog.example.com$WORDPRESS_USERNAME$WORDPRESS_APP_PASSWORDusername:app_passwordundefinedcurl + jq/wp-json/wp/v2$WORDPRESS_SITE_URLhttps://blog.example.com$WORDPRESS_USERNAME$WORDPRESS_APP_PASSWORDusername:app_passwordundefined
Errors come back as `{"code": "...", "message": "...", "data": {"status": 401}}` —
show `message` verbatim. Common codes:
| HTTP | Meaning | What to tell the user |
|------|---------|-----------------------|
| 401 | `incorrect_password` / bad Basic auth | Application Password wrong or revoked → regenerate it and reconnect the WordPress connector |
| 403 | `rest_cannot_create` / insufficient role | The user's role can't publish; needs Author/Editor/Admin, or Application Passwords are disabled on the site |
| 404 | `rest_no_route` | REST API disabled or a security plugin blocks `/wp-json` → the user must re-enable it |
| 400 | `rest_invalid_param` | Bad field (e.g. unknown category id) → fix and retry |
> **`content` is HTML, not Markdown.** Convert Markdown to HTML first
> (`pandoc -f markdown -t html`, or a simple converter). Raw Markdown renders literally.
错误返回格式为`{"code": "...", "message": "...", "data": {"status": 401}}`——直接显示`message`内容。常见错误码:
| HTTP | 含义 | 需告知用户的内容 |
|------|---------|-----------------------|
| 401 | `incorrect_password` / 无效Basic认证 | 应用密码错误或已失效 → 重新生成密码并重新连接WordPress连接器 |
| 403 | `rest_cannot_create` / 角色权限不足 | 用户角色无发布权限;需要作者/编辑/管理员权限,或站点已禁用应用密码功能 |
| 404 | `rest_no_route` | REST API已禁用或安全插件拦截了`/wp-json` → 用户需重新启用REST API |
| 400 | `rest_invalid_param` | 参数无效(如未知分类ID) → 修正后重试 |
> **`content`字段为HTML格式,而非Markdown。** 需先将Markdown转换为HTML(可使用`pandoc -f markdown -t html`或简易转换器)。原始Markdown会被原样渲染。"${WP[@]}" "$API/users/me" | jq '{id, name, slug, roles: (.roles // [])}'"${WP[@]}" "$API/users/me" | jq '{id, name, slug, roles: (.roles // [])}'status=publishstatus=draftjq -n --arg t "国内如何稳定调用 Claude API" \
--arg c "<p>正文 HTML……</p>" \
--arg s "draft" \
'{title:$t, content:$c, status:$s}' \
| "${WP[@]}" -X POST "$API/posts" \
-H "Content-Type: application/json" -d @- \
| jq '{id, status, link, edit: "\(env.WORDPRESS_SITE_URL)/wp-admin/post.php?action=edit&post=\(.id)"}'jq -n --arg t "标题" --arg c "<p>正文</p>" --arg e "一句话摘要" \
'{title:$t, content:$c, excerpt:$e, status:"draft",
categories:[5], tags:[12,34]}' \
| "${WP[@]}" -X POST "$API/posts" -H "Content-Type: application/json" -d @- \
| jq '{id, status, link}'POST $API/posts/<id>{"status":"publish"}POST $API/posts/<id>"${WP[@]}" -X DELETE "$API/posts/<id>"status=publishstatus=draftjq -n --arg t "国内如何稳定调用 Claude API" \
--arg c "<p>正文 HTML……</p>" \
--arg s "draft" \
'{title:$t, content:$c, status:$s}' \
| "${WP[@]}" -X POST "$API/posts" \
-H "Content-Type: application/json" -d @- \
| jq '{id, status, link, edit: "\(env.WORDPRESS_SITE_URL)/wp-admin/post.php?action=edit&post=\(.id)"}'jq -n --arg t "标题" --arg c "<p>正文</p>" --arg e "一句话摘要" \
'{title:$t, content:$c, excerpt:$e, status:"draft",
categories:[5], tags:[12,34]}' \
| "${WP[@]}" -X POST "$API/posts" -H "Content-Type: application/json" -d @- \
| jq '{id, status, link}'POST $API/posts/<id>{"status":"publish"}POST $API/posts/<id>"${WP[@]}" -X DELETE "$API/posts/<id>""${WP[@]}" "$API/posts?per_page=10&status=publish,draft&_fields=id,title,status,link,date" \
| jq '.[] | {id, title: .title.rendered, status, link, date}'&page=2X-WP-TotalPages-D -"${WP[@]}" "$API/posts?per_page=10&status=publish,draft&_fields=id,title,status,link,date" \
| jq '.[] | {id, title: .title.rendered, status, link, date}'&page=2X-WP-TotalPages-D -undefinedundefined
Creating a term that already exists returns
`{"code":"term_exists", ... "data":{"status":400,"term_id":<id>}}` — reuse
`.data.term_id` instead of failing.
创建已存在的分类/标签会返回`{"code":"term_exists", ... "data":{"status":400,"term_id":<id>}}`——请复用`.data.term_id`而非报错。FILE="./cover.png"
NAME="$(basename "$FILE")"
MEDIA_ID=$("${WP[@]}" -X POST "$API/media" \
-H "Content-Disposition: attachment; filename=\"$NAME\"" \
-H "Content-Type: image/png" \
--data-binary @"$FILE" | jq -r '.id')
echo "media id=$MEDIA_ID"FILE="./cover.png"
NAME="$(basename "$FILE")"
MEDIA_ID=$("${WP[@]}" -X POST "$API/media" \
-H "Content-Disposition: attachment; filename=\"$NAME\"" \
-H "Content-Type: image/png" \
--data-binary @"$FILE" | jq -r '.id')
echo "media id=$MEDIA_ID"undefinedundefinedhttp:///wp-jsonrest_no_routeabcd efgh ijkl mnopcurl -uwp-adminhttp:///wp-jsonrest_no_routeabcd efgh ijkl mnopcurl -uwp-adminpublish_artifactpublish_artifact(kind="article", channel="wordpress", title="<title>", url="<the REAL returned URL>", status="delivered")status="failed"_shared/artifacts.mdpublish_artifactpublish_artifact(kind="article", channel="wordpress", title="<title>", url="<the REAL returned URL>", status="delivered")status="failed"_shared/artifacts.md