应优先比对 post_status、post_modified、guid 和 post_content 的 MD5 哈希值,并通过 guid 关联 wp_postmeta,避免依赖 ID;对近期更新文章用 mysqldump 按 ID 子集导出比对。
直接查 wp_posts 表里发布时间和修改时间不一致的记录
本地和线上文章内容一致但状态不同(比如线上已发布、本地草稿),最常见原因是 post_status 或 post_modified 不同步。别急着导全表比对,先聚焦「可能出问题的字段」:post_status、post_date、post_modified、guid(它常被当成 url 用,但其实只是历史遗留标识,不能当唯一键)。
实操建议:
- 用
SELECT ID, post_title, post_status, post_modified, guid FROM wp_posts WHERE post_type = 'post' ORDER BY post_modified DESC LIMIT 20;在两边各跑一次,肉眼扫一眼最近几条的状态和时间戳是否对得上 - 重点看
guid:如果本地是http://localhost/...、线上是https://example.com/...,说明没做 URL 替换就导入,后续内链、RSS 都会出错 - 别依赖
ID做比对——本地重装过 WordPress?ID 很可能不连续、甚至重复分配过
用 MD5 对 post_content 做哈希比对(避开 HTML 格式干扰)
直接 WHERE post_content != ... 会因空格、换行、自动加的 或编辑器插入的零宽字符而误报。WordPress 存文本时本身就不规范,比字符串等于没意义。
实操建议:
- 在两边数据库分别执行:
SELECT ID, post_title, MD5(post_content) AS content_hash FROM wp_posts WHERE post_type = 'post'; - 把结果导出成 CSV,在 Excel 或
diff工具里按content_hash列对比——相同 hash 基本可认定内容一致 - 注意:如果用了 Block Editor(Gutenberg),
post_content里含 JSON 结构,不同版本 WordPress 可能微调空格或引号风格,导致 hash 不同但实际渲染无差别;这时要人工抽检几个 hash 不同的 ID
wp_postmeta 表里关键字段漏同步(比如封面图、自定义字段)
文章正文对了,但封面图丢了、SEO 描述没生效、分类扩展字段为空——八成是 wp_postmeta 没同步干净。这个表靠 post_id 关联,而 post_id 在本地和线上大概率不一致,不能直接按 ID 匹配。
实操建议:
- 先确认哪些 meta_key 是业务强依赖的,比如
_thumbnail_id、_yoast_wpseo_metadesc、_custom_excerpt,别全表拉 - 用
JOIN+guid关联:SELECT m1.meta_key, m1.meta_value FROM wp_postmeta m1 JOIN wp_posts p1 ON m1.post_id = p1.ID WHERE p1.guid = 'https://example.com/hello-world/' AND m1.meta_key IN ('_thumbnail_id', '_yoast_wpseo_metadesc');,再在线上用同样guid查一遍 - 注意
_thumbnail_id是媒体库附件的 ID,它本身也要同步;如果附件表(wp_posts类型为attachment)没同步,光同步这个 ID 没用
用 mysqldump 加 --where 条件导出差异子集(避免全库传输)
手动一条条查太慢,全量 dump 又太大、还容易带进测试数据。真正高效的比对,是只导出「可疑范围」的数据做离线 diff。
实操建议:
- 找出最近 7 天有更新的文章 ID 列表:
SELECT ID FROM wp_posts WHERE post_type = 'post' AND post_modified > DATE_SUB(NOW(), INTERVAL 7 DAY);,保存为recent_ids.txt - 用
mysqldump --where="ID IN (1,2,3,4,5)" wordpress wp_posts wp_postmeta > subset.sql导出这些 ID 关联的主表和元数据 - 导出时加
--skip-extended-insert,方便用diff工具逐行比对;否则单条 INSERT 太长,diff 会失效 - 注意:
wp_postmeta要连带导出对应post_id的所有行,不能只导指定 ID 的主记录——一个文章可能有十几个 meta 字段
真正麻烦的不是 SQL 写法,而是 WordPress 把业务逻辑散落在多张表、多种机制里:GUID 不唯一、meta 依赖主表 ID、block 内容格式不稳定……比对前先想清楚你到底要验证什么——是发布状态?还是用户可见的内容?还是 SEO 字段?目标一模糊,SQL 就容易跑偏。











