返回上一级

Wordpress 使用 REST API 批量发布文章,提交 HTTP Post 请求即可发布

看了一下Wordpress远程发布文章的方式,基本围绕着 XML-RPC 。

但是这功能并不安全,很多爬虫都会扫描 /xmlrpc.php 路径url,导致许多主题和优化插件都自动禁用该功能了,甚至有的防火墙也建议添加到 URL 黑名单。

没办法只能手写暴露一个发布接口了

安装一个 WPCode 插件加入以下PHP代码,或者干脆放入function.php文件中

 1<?php
 2// rest初始化
 3add_action('rest_api_init', function () {
 4
 5  // 注册API接口,地址参考:https://www.krjojo.com/wp-json/api/publish
 6  register_rest_route('api', 'publish', [
 7    
 8    // 接收post提交   
 9    'methods' => 'POST',
10    'callback' => function ($request) {
11
12      // 验证Token密码,可以自行修改
13      if ((getallheaders()['Token'] ?? '') !== 'VH6AudNa%8Z*TYSg') return;
14
15      // 获取json参数并发布文章
16      $jsonData = file_get_contents("php://input");
17      $post_id  = wp_insert_post(json_decode($jsonData, true));
18
19      // 返回发布成功或失败
20      if (is_wp_error($post_id)) {
21        return [
22          'code' => 400,
23          'id' => 0,
24          'msg' => $post_id->get_error_message(),
25        ];
26      } else {
27        return [
28          'code' => 200,
29          'id' => $post_id,
30          'msg' => 'ok',
31        ];
32      }
33    },
34    'permission_callback' => function () {
35      return true;
36    }
37  ], 1);
38});

上面的 api 地址和 Token 可以自行修改

由于使用官方的 wp_insert_post() 函数进行发布,所以会正常触发系统依赖,meta数据也会进行判断并更新写入,包括像点赞浏览量等。

也因为使用了json提交数据,可操作的内容也非常的大,甚至可以修改已有文章,详细可以看 wp_insert_post 的官方文档:

https://developer.wordpress.org/reference/functions/wp_insert_post/

下面分享一下 python 的发布文章的写法

 1import requests
 2
 3url = 'https://www.krjojo.com/wp-json/api/publish'
 4headers = {
 5    'Token': 'VH6AudNa%8Z*TYSg',        # 上面的Token
 6    'Content-Type': 'application/json'  # json格式数据
 7}
 8data = {
 9    'post_author': 1,                   # 作者id,一般是站长
10    'post_date': "2024-10-08 20:40:34", # 发布时间
11    'post_content': "这是内容",
12    'post_title': "这是标题",
13    "post_status": "publish",           # publish代表已发布,默认为 draft 草稿
14    "post_category": [20, 8537],        # 分类id
15    "tags_input": ["标签","测试"]        # 可以多个标签,自动识别同名
16}
17
18# 发送POST请求
19response = requests.post(url, json=data, headers=headers)
20
21# 检查响应状态码
22if response.status_code == 200:
23    if response.json()['code'] == 200:
24        print('发布成功,文章id:', response.json()['id'])
25    else :
26        print('发布失败:', response.json()['msg'])
27        exit()
28else:
29    print('请求失败,状态码:', response.status_code)
30    exit()

由于分类比较特殊,可以存在同名,并且有上下级关系,所以只能手动填写分类id。

如果是批量发布,只需要封装到for循环即可。

看看效果图,轻松导入5W文章

文章