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 工具更新文章时,空参数会覆盖原值,不是”不更新该字段”。务必先确认工具行为,再传入参数。