分享技术 · 探索极限 · Code is Art
后端开发 发布 2026-05-11 201阅读 约 6分钟阅读

MCP 工具更新 WordPress 文章的踩坑记录:空 content 参数会清空正文

MCP 工具更新 WordPress 文章的踩坑记录:空 content 参数会清空正文

今天在用 MCP 工具批量处理 WordPress 文章时,踩了一个坑:调用 wp_update_post 时传入了空的 content 参数,导致文章正文被清空。记录一下问题原因、恢复过程和教训。


问题现象

我想批量更新几篇文章的 slug(postname),调用了 MCP 的 wp_update_post 工具:

wp_update_post(id=185, content="")
wp_update_post(id=155, content="")
# ... 多篇文章

执行后提示 “Post updated successfully”,但打开文章发现正文内容全没了,只剩标题和摘要。


问题原因

wp_update_post 这个 MCP 工具的实现逻辑是:传入的参数会直接覆盖文章对应字段

我原本只想更新 slug,但工具没有单独的 slug 参数。传入 content="" 后,WordPress 直接把正文替换成了空字符串。

这不是 MCP 工具的 bug,而是我没有仔细阅读工具的行为逻辑。错误在于:在不确定参数效果的情况下,贸然传入空值。


恢复过程

1. 检查 WordPress Revision

先尝试通过 WordPress 的修订版本(Revision)恢复:

wp_get_post_revisions(post_id=185)

结果返回空数组——因为文章刚创建不久,没有历史修订记录。

2. 从 Claude 会话文件恢复

想到了 Claude Code 会把历史对话保存到本地。查找路径:

~/.claude/projects//.jsonl

这些 .jsonl 文件记录了完整的对话历史,包括 MCP 工具的返回结果。

用 Python 解析 JSONL,搜索包含完整文章内容的记录:

import json

file_path = "~/.claude/projects//.jsonl"

with open(file_path, 'r') as f:
    for line in f:
        data = json.loads(line)
        msg = data.get('message', {})
        content_list = msg.get('content', [])

        for item in content_list:
            if isinstance(item, dict) and item.get('type') == 'tool_result':
                inner_content = item.get('content', [])
                for text_item in inner_content:
                    if isinstance(text_item, dict) and text_item.get('type') == 'text':
                        text = text_item.get('text', '')
                        inner_json = json.loads(text)
                        if inner_json.get('id') == 185:
                            content = inner_json.get('content', '')
                            if content and content.startswith('<'):
                                print(content)  # 找到了完整正文

成功从历史会话中提取出 8 篇被清空文章的完整内容。

3. 批量恢复

将提取的内容重新写入 WordPress:

wp_update_post(id=185, content="")
wp_update_post(id=155, content="")
# ...

8 篇文章全部恢复成功。


教训总结

1. MCP 工具的参数行为要仔细确认

不同 MCP 工具的参数行为可能不同:

  • 有的工具:未传入的字段保持原值不变
  • 有的工具:传入的字段(包括空值)会覆盖原值

在不确定行为时,先用测试数据验证,不要直接操作生产环境。

2. 传入空参数前要三思

以下几种情况尤其要警惕:

# 危险操作
wp_update_post(id=xxx, content="")
wp_update_post(id=xxx, title="")
wp_update_post(id=xxx, excerpt="")

# 安全做法:只传需要更新的字段,不传其他字段
wp_update_post(id=xxx, title="新标题")  # 不传 content,避免覆盖

3. 做好操作前备份

批量操作前建议:

  • 导出目标文章的当前内容(可通过 MCP 或数据库)
  • 确认有可回滚的方案
  • 先在测试环境验证

4. Claude 会话文件是意外恢复源

Claude Code 的会话记录保存在 ~/.claude/projects/ 下,包含完整的工具调用历史。这在某些情况下可以作为数据恢复的来源。


一句话总结

MCP 工具更新文章时,空参数会覆盖原值,不是”不更新该字段”。务必先确认工具行为,再传入参数。

发表回复