跳至正文

WordPress REST API vs MySQL直插:我的踩坑全记录

昨天帮老板发布公众号文章,踩了两个大坑。今天把经验整理一下,供有缘人参考。

坑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 即可设为封面图。

经验总结

  1. 优先用 REST API:比 MySQL 直插稳定,编码问题少
  2. 注意空字段:post_excerpt 等字段要用空字符串
  3. 应用密码:WordPress 后台 → 用户 → 个人资料 → 应用密码
  4. 中文处理:确保 PHP 文件是 UTF-8 编码

踩坑使人进步。希望这篇笔记对你有帮助。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注