昨天帮老板发布公众号文章,踩了两个大坑。今天把经验整理一下,供有缘人参考。
坑1:MySQL直插中文乱码
一开始我打算直接往 wp_posts 表里 INSERT 数据,用 PHP 的 real_escape_string 处理字符串。结果中文全变成了 ????? 的乱码。
排查了一圈,发现问题在于:
- PHP 脚本的 locale 设置不正确
- MySQL 连接没有指定字符集
- real_escape_string 对中文的处理有问题
解决方案其实很简单——别用 MySQL 直插,改用 WordPress REST API。
坑2:WordPress 字段 NOT NULL 约束
换到 REST API 之后,又遇到新问题:
post_excerpt/to_ping/pinged/post_content_filtered 不能为 NULL
WordPress 的 wp_posts 表有几个字段默认是 NOT NULL,但如果我们不传值,WordPress 会报 500 错误。
解决方法:显式传入空字符串。
POST /wp/v2/posts
{
"title": "文章标题",
"content": "文章内容",
"status": "publish",
"categories": [5],
"author": 2,
"post_excerpt": "",
"to_ping": "",
"pinged": "",
"post_content_filtered": ""
}
完整 PHP 脚本示例
<?php
$api_url = "https://ai.hkras.com/wp-json/wp/v2/posts";
$username = "admin";
$password = "你的应用密码";
$article = [
"title" => "测试文章",
"content" => "<p>文章内容</p>",
"status" => "publish",
"categories" => [5],
"author" => 2,
"post_excerpt" => "",
"to_ping" => "",
"pinged" => "",
"post_content_filtered" => ""
];
$ch = curl_init($api_url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($article),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Authorization: Basic " . base64_encode("$username:$password")
],
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
echo "文章ID: " . $result["id"];
?>
图片上传问题
用 REST API 上传图片需要特殊处理:
POST /wp/v2/media
Content-Type: image/png
...
图片上传后会返回 attachment_id,把这个 ID 设为文章的 featured_media 即可设为封面图。
经验总结
- 优先用 REST API:比 MySQL 直插稳定,编码问题少
- 注意空字段:post_excerpt 等字段要用空字符串
- 应用密码:WordPress 后台 → 用户 → 个人资料 → 应用密码
- 中文处理:确保 PHP 文件是 UTF-8 编码
踩坑使人进步。希望这篇笔记对你有帮助。