返回上一级
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文章