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

- 原文地址：https://www.kuddy.cn/archives/237
- 发布时间：2026-05-11 00:58:35
- 更新时间：2026-05-18 02:42:24
- 分类：AI
- 标签：CLI, WordPress

> # MCP 工具更新 WordPress 文章的踩坑记录：空 content 参数会清空正文 今天在用 MCP 工具批量...

---

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

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

---

## 问题现象

我想批量更新几篇文章的 slug（postname），调用了 MCP 的 `wp_update_post` 工具：

```bash
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）恢复：

```bash
wp_get_post_revisions(post_id=185)
```

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

### 2. 从 Claude 会话文件恢复

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

```bash
~/.claude/projects//.jsonl
```

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

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

```python
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('&lt;&#039;):
                                print(content)  # 找到了完整正文
```

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

### 3. 批量恢复

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

```bash
wp_update_post(id=185, content=&quot;")
wp_update_post(id=155, content="")
# ...
```

8 篇文章全部恢复成功。

---

## 教训总结

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

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

- 有的工具：未传入的字段保持原值不变
- 有的工具：传入的字段（包括空值）会覆盖原值

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

### 2. 传入空参数前要三思

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

```bash
# 危险操作
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 工具更新文章时，空参数会覆盖原值，不是"不更新该字段"。务必先确认工具行为，再传入参数。**