说个真事,我之前每天手动登录WordPress后台发文章,一篇一篇复制粘贴,累得要死。后来研究了一下XML-RPC,写了个Python脚本自动发,现在每天定时跑,人不用管,文章自动上线。
但这个过程踩了不少坑,今天把完整实操经验分享出来,全是真实踩过的雷。
一、为什么选XML-RPC而不是REST API?
WordPress有两种自动发布方式:
- REST API:需要先获取token,处理认证头,相对复杂
- XML-RPC:老协议但简单直接,一个请求搞定发布
我选XML-RPC的原因很简单——代码量少,不容易出错。对于批量发布文章这种需求,XML-RPC完全够用。
二、完整操作步骤
第一步:确认XML-RPC已开启
WordPress默认开启XML-RPC,但有些安全插件会禁用它。先测试一下:
import xmlrpc.client
server = xmlrpc.client.ServerProxy('https://你的域名/xmlrpc.php')
print(server.system.listMethods())
如果返回方法列表,说明XML-RPC正常。如果报错,去后台设置里检查是否被禁用。
第二步:写发布脚本
核心代码其实就几行:
import xmlrpc.client
server = xmlrpc.client.ServerProxy('https://你的域名/xmlrpc.php')
post_id = server.wp.newPost(
1, # blog_id,通常是1
'你的用户名',
'你的密码',
{
'post_title': '文章标题',
'post_content': '文章内容,支持HTML',
'post_status': 'publish', # 直接发布
'terms_names': {
'category': ['分类名称']
}
}
)
print(f'发布成功!文章ID: {post_id}')
第三步:批量发布多篇文章
把文章数据放到列表里,循环发布:
ARTICLES = [
{
'title': '第一篇文章标题',
'content': '<p>内容...</p>',
'categories': ['分类名']
},
{
'title': '第二篇文章标题',
'content': '<p>内容...</p>',
'categories': ['分类名']
},
]
for article in ARTICLES:
post_id = server.wp.newPost(
1, USER, PASS,
{
'post_title': article['title'],
'post_content': article['content'],
'post_status': 'publish',
'terms_names': {'category': article['categories']}
}
)
print(f'发布: {article["title"]} -> ID: {post_id}')
time.sleep(1) # 避免请求太快
三、踩过的坑
坑1:SSL证书验证失败
我的网站用的是Let’s Encrypt免费证书,Python默认会验证证书,结果报SSL错误。
解决方法:
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
server = xmlrpc.client.ServerProxy(
'https://你的域名/xmlrpc.php',
context=ctx
)
坑2:分类名称写错导致发布到默认分类
第一次写的时候,分类名写成了中文全角符号,结果文章全发到了”未分类”里。
解决方法:先获取所有分类,确认名称完全匹配:
cats = server.wp.getTerms(1, USER, PASS, 'category')
for c in cats:
print(f'{c["name"]} -> ID: {c["term_id"]}')
坑3:请求太快被服务器拒绝
批量发布时没加延迟,一口气发了20篇,结果服务器返回429 Too Many Requests。
解决方法:每发一篇sleep 1秒,稳稳当当。
四、实际效果
我用这套脚本一次性发布了43篇文章,全部成功。之前手动发一篇要5分钟,现在脚本跑完也就1分钟。
更重要的是,可以配合定时任务实现每天自动发布:
- 写好一批文章存成JSON
- 服务器cron每天早上8点跑脚本
- 人还在睡觉,文章已经上线
五、完整脚本模板
我整理了一个完整模板,可以直接拿去用:
import xmlrpc.client
import ssl
import time
# SSL设置
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
# 连接配置
HOST = '你的域名'
USER = '你的用户名'
PASS = '你的密码'
server = xmlrpc.client.ServerProxy(
f'https://{HOST}/xmlrpc.php',
context=ctx
)
# 文章列表
articles = [
{'title': '标题1', 'content': '内容1', 'categories': ['分类名']},
{'title': '标题2', 'content': '内容2', 'categories': ['分类名']},
]
# 批量发布
for i, art in enumerate(articles):
try:
post_id = server.wp.newPost(
1, USER, PASS,
{
'post_title': art['title'],
'post_content': art['content'],
'post_status': 'publish',
'terms_names': {'category': art['categories']}
}
)
print(f'[{i+1}/{len(articles)}] 成功: {art["title"]} -> {post_id}')
except Exception as e:
print(f'[{i+1}/{len(articles)}] 失败: {e}')
time.sleep(1)
print('全部完成!')
六、服务器配置推荐
如果你也在搭建WordPress网站做内容运营,服务器选择很关键。我用的腾讯云轻量应用服务器,2核2G配置,跑WordPress完全够用,一个月也就几十块钱。
腾讯云服务器直达链接:https://curl.qcloud.com/7Znu7m7b
新用户有优惠,配置选2核2G就够了,WordPress跑得很流畅。
以上就是WordPress XML-RPC自动发布的完整实操经验。这套方案帮我省了大量时间,希望对你也有帮助。
我是牛大奶,专注自动化运营。有问题欢迎留言交流,看到都会回。

