下面我将为你提供一个详细的指南,涵盖两种主流方法:推荐使用 REST API 和传统的 XML-RPC API。

核心概念:WordPress API
WordPress 本身不直接用 Python 代码修改,而是通过“接口”来暴露其功能,Python 脚本就像一个“客户端”,通过这些接口向 WordPress 网站发送指令(如“创建一篇新文章”、“修改页面标题”等)。
主要有两种接口:
- REST API (推荐):现代、强大、易于使用,从 WordPress 4.7 开始被内置支持,是官方推荐的方式。
- XML-RPC API:较老的技术,但兼容性很好,很多老插件和旧版本 WordPress 仍然依赖它。
准备工作:
在开始之前,你需要准备以下信息:

- WordPress 网站的 URL:
https://your-wordpress-site.com - 用户名:一个有足够权限的管理员或编辑账户。
- 应用程序密码:(强烈推荐,比直接用登录密码更安全)
- 如何获取:登录你的 WordPress 后台,进入
用户->个人资料,向下滚动找到应用程序密码部分。 - 输入一个名称("Python Script"),然后点击
添加新的应用程序密码。 - 它会生成一串唯一的密码,请立即复制并妥善保存,刷新页面后就看不到了。
- 如何获取:登录你的 WordPress 后台,进入
使用 REST API (推荐)
这是最现代、最灵活的方法,我们将使用 requests 库来发送 HTTP 请求。
安装 requests 库
如果你的 Python 环境中没有 requests,请先安装它:
pip install requests
认证方式
WordPress REST API 主要使用两种认证方式:
- Cookie 认证:如果你在同一个会话中(先用 Python 登录),或者你的网站允许 Cookie 传递,可以使用这种方式,比较简单。
- Application Passwords 认证 (推荐):这是最安全的方式,专门用于脚本访问,它使用 HTTP Basic Auth,将你的用户名和“应用程序密码”进行 Base64 编码后放在请求头中。
示例代码:使用 REST API
下面是一个完整的示例,展示如何获取文章、创建文章、修改文章和删除文章。
import requests
import base64
import json
# --- 配置信息 ---
WP_URL = "https://your-wordpress-site.com/wp-json/wp/v2" # WordPress REST API 根路径
USERNAME = "your_username" # 你的 WordPress 用户名
APP_PASSWORD = "your_application_password_xxxxxxxxxx" # 你的应用程序密码
# --- 认证信息 ---
# 将用户名和应用程序密码进行 Base64 编码
credentials = f"{USERNAME}:{APP_PASSWORD}"
token = base64.b64encode(credentials.encode())
headers = {'Authorization': f'Basic {token.decode("utf-8")}'}
# --- API 端点 ---
POSTS_ENDPOINT = f"{WP_URL}/posts"
def get_all_posts():
"""获取所有文章"""
print("正在获取所有文章...")
response = requests.get(POSTS_ENDPOINT, headers=headers)
if response.status_code == 200:
posts = response.json()
for post in posts:
print(f"- ID: {post['id']}, 标题: {post['title']['rendered']}")
return posts
else:
print(f"获取文章失败: {response.status_code} - {response.text}")
return None
def create_post(title, content, status='publish'):
"""创建一篇新文章"""
print(f"\n正在创建文章: '{title}'...")
post_data = {
'title': title,
'content': content,
'status': status # 'draft', 'pending', 'publish'
}
response = requests.post(POSTS_ENDPOINT, headers=headers, json=post_data)
if response.status_code == 201:
new_post = response.json()
print(f"文章创建成功! ID: {new_post['id']}, 链接: {new_post['link']}")
return new_post
else:
print(f"创建文章失败: {response.status_code} - {response.text}")
return None
def update_post(post_id, new_title, new_content):
"""修改一篇现有文章"""
print(f"\n正在修改文章 ID: {post_id}...")
update_endpoint = f"{POSTS_ENDPOINT}/{post_id}"
post_data = {
'title': new_title,
'content': new_content
}
response = requests.post(update_endpoint, headers=headers, json=post_data) # 注意:更新也用 POST 方法
if response.status_code == 200:
updated_post = response.json()
print(f"文章修改成功! 新标题: {updated_post['title']['rendered']}")
return updated_post
else:
print(f"修改文章失败: {response.status_code} - {response.text}")
return None
def delete_post(post_id, force=True):
"""删除一篇文章"""
print(f"\n正在删除文章 ID: {post_id}...")
delete_endpoint = f"{POSTS_ENDPOINT}/{post_id}"
# force=True 表示永久删除,否则会移到回收站
params = {'force': str(force).lower()}
response = requests.delete(delete_endpoint, headers=headers, params=params)
if response.status_code == 200:
print(f"文章 ID: {post_id} 删除成功!")
return True
else:
print(f"删除文章失败: {response.status_code} - {response.text}")
return False
# --- 主程序 ---
if __name__ == "__main__":
# 1. 获取现有文章
get_all_posts()
# 2. 创建一篇新文章
new_post_data = create_post(
title="我的第一篇 Python 发布文章",
content="这是由 <strong>Python 脚本</strong> 自动创建的内容,太棒了!",
status='draft' # 先以草稿状态发布
)
# 如果文章创建成功,我们获取它的 ID
if new_post_data:
created_post_id = new_post_data['id']
# 3. 修改刚刚创建的文章
update_post(
post_id=created_post_id,
new_title="【已更新】我的第一篇 Python 发布文章",
new_content="这是 <strong>更新后</strong> 的内容,Python + WordPress 无缝连接!"
)
# 4. 删除文章 (请谨慎操作!)
# delete_post(post_id=created_post_id)
使用 XML-RPC API
如果你的 WordPress 网站禁用了 REST API 或者你习惯使用 XML-RPC,这个方法依然有效,我们将使用 python-wordpress-xmlrpc 库。
安装 python-wordpress-xmlrpc 库
pip install python-wordpress-xmlrpc
确保启用 XML-RPC
在 WordPress 后台,确保 XML-RPC 功能是开启的。
- 方法一:安装并激活 "XML-RPC" 插件。
- 方法二:检查你的主题
functions.php文件,确保没有类似add_filter('xmlrpc_enabled', '__return_false');的代码来禁用它。
示例代码:使用 XML-RPC
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost, EditPost
from wordpress_xmlrpc.methods.media import UploadFile
from wordpress_xmlrpc.compat import xmlrpc_client
# --- 配置信息 ---
WP_URL = "https://your-wordpress-site.com/xmlrpc.php" # XML-RPC 端点路径
USERNAME = "your_username"
PASSWORD = "your_application_password" # 同样使用应用程序密码
# --- 连接到 WordPress ---
try:
client = Client(WP_URL, USERNAME, PASSWORD)
print("成功连接到 WordPress!")
except Exception as e:
print(f"连接失败: {e}")
exit()
def get_all_posts_xmlrpc():
"""获取所有文章"""
print("\n正在获取所有文章...")
posts = client.call(GetPosts())
for post in posts:
print(f"- ID: {post.id}, 标题: {post.title}")
return posts
def create_post_xmlrpc(title, content, status='draft'):
"""创建一篇新文章"""
print(f"\n正在创建文章: '{title}'...")
post = WordPressPost()
post.title = title
post.content = content
post.post_status = status # 'draft', 'publish', 'private'
post.post_type = 'post' # 也可以是 'page'
try:
post_id = client.call(NewPost(post))
print(f"文章创建成功! ID: {post_id}")
return post_id
except Exception as e:
print(f"创建文章失败: {e}")
return None
def update_post_xmlrpc(post_id, new_title, new_content):
"""修改一篇现有文章"""
print(f"\n正在修改文章 ID: {post_id}...")
try:
# 首先获取文章
post = client.call(EditPost(post_id, {}))
post.title = new_title
post.content = new_content
# 然后编辑文章
client.call(EditPost(post_id, post))
print(f"文章修改成功! 新标题: {new_title}")
return True
except Exception as e:
print(f"修改文章失败: {e}")
return False
def delete_post_xmlrpc(post_id):
"""删除一篇文章"""
# 注意:python-wordpress-xmlrpc 库没有直接的 DeletePost 方法。
# 通常需要调用 WordPress 的底层方法。
print(f"\n正在删除文章 ID: {post_id}...")
try:
# WordPress 的 delete_post 方法需要一个结构化的参数
data = {
'post_id': post_id,
'delete': True # true 表示永久删除
}
client.call(xmlrpc_client.Boolean(True)) # 确保布尔值类型正确
client.call('wp.deletePost', data)
print(f"文章 ID: {post_id} 删除成功!")
return True
except Exception as e:
print(f"删除文章失败: {e}")
return False
# --- 主程序 ---
if __name__ == "__main__":
# 1. 获取现有文章
get_all_posts_xmlrpc()
# 2. 创建一篇新文章
created_post_id = create_post_xmlrpc(
title="我的 XML-RPC 测试文章",
content="这是通过 <strong>XML-RPC API</strong> 和 Python 创建的。",
status='publish'
)
# 3. 修改刚刚创建的文章
if created_post_id:
update_post_xmlrpc(
post_id=created_post_id,
new_title="【已更新】我的 XML-RPC 测试文章",
new_content="这是 <strong>更新后</strong> 的 XML-RPC 内容。"
)
# 4. 删除文章 (请谨慎操作!)
# if created_post_id:
# delete_post_xmlrpc(post_id=created_post_id)
总结与建议
| 特性 | REST API | XML-RPC API |
|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐⭐ (备选) |
| 易用性 | 非常简单,直接用 requests 发送 HTTP 请求 |
需要专门的库,但封装得很好 |
| 功能 | 功能最全面,支持帖子、页面、媒体、评论、分类、标签等 | 功能也很全面,但官方推荐 REST API |
| 安全性 | 支持 Application Passwords,非常安全 | 也支持 Application Passwords,安全性良好 |
| 未来 | WordPress 官方发展方向,持续更新 | 维护较少,部分新功能可能不支持 |
给你的建议:
- 优先选择 REST API:对于新项目,请毫不犹豫地选择 REST API,它与现代 Web 开发标准(HTTP, JSON)保持一致,学习曲线更平缓,功能也更强大。
- 使用应用程序密码:无论使用哪种 API,都请务必使用“应用程序密码”而不是你的登录密码,这是保障网站安全的基本操作。
- 从简单操作开始:先从“获取文章列表”和“创建文章”这样的简单操作开始,成功后再尝试更复杂的修改和删除。
- 处理错误:在实际应用中,一定要加入
try...except错误处理逻辑,并检查 HTTP 状态码或 API 返回的错误信息,让你的脚本更健壮。
希望这个详细的指南能帮助你顺利地使用 Python 和 WordPress 进行自动化工作!
