实现这个目标最主流、最推荐的方法是使用 WordPress REST API,这是一个现代、强大且官方支持的接口,允许外部程序(如 Python 脚本)通过标准的 HTTP 请求来操作 WordPress。

下面我将为你详细介绍如何使用 Python 和 WordPress REST API 来实现内容导入和管理。
核心方法:使用 WordPress REST API
WordPress 4.7+ 版本内置了 REST API,无需安装额外插件即可使用基本功能(如文章、页面、分类、标签等),对于更复杂的需求(如媒体上传、自定义字段等),可能需要安装特定插件,但核心原理是相通的。
第一步:在 WordPress 网站上获取 API 信息
- 获取 API 端点:打开你的 WordPress 网站的后台,进入
设置->固定链接,确保“普通”设置没有被修改(通常默认就是/postname/格式,这对 REST API 无影响)。 - 测试 API 是否可用:在浏览器中访问
https://你的WordPress网站域名/wp-json/wp/v2/posts,如果能看到类似 JSON 格式的文章列表,说明 REST API 已经启用。 - 获取身份验证信息(推荐):为了安全地创建、修改内容,你应该使用应用密码,这比直接使用管理员用户名和密码更安全。
- 安装插件:如果你的 WordPress 版本低于 5.6,需要安装并激活 Application Passwords 插件,5.6+ 版本通常已内置此功能。
- 创建应用密码:
- 进入
用户->个人资料页面。 - 滚动到最下方的“应用密码”部分。
- 在“新应用名称”中输入一个你喜欢的名字,
Python Content Poster。 - 点击“添加新应用密码”按钮。
- 系统会生成一个密码,请立即复制并妥善保存,因为关闭此页面后将无法再次看到这个密码,这个密码就是你脚本需要的“密码”。
- 进入
第二步:准备 Python 环境
你需要安装 requests 库,这是 Python 中最流行的 HTTP 请求库。
pip install requests
第三步:编写 Python 脚本
下面我将通过几个常见的例子来展示如何使用 Python 与 WordPress 交互。

示例 1:获取所有文章
import requests
import base64
# --- 配置信息 ---
WP_URL = "https://你的WordPress网站域名"
WP_USERNAME = "你的WordPress用户名"
WP_PASSWORD = "你在上一步生成的应用密码" # 直接粘贴在这里
# 将用户名和密码进行 base64 编码
auth_string = f"{WP_USERNAME}:{WP_PASSWORD}"
auth_bytes = auth_string.encode('ascii')
auth_base64 = base64.b64encode(auth_bytes).decode('ascii')
# 设置请求头
headers = {
'Authorization': f'Basic {auth_base64}'
}
# API 端点
api_url = f"{WP_URL}/wp-json/wp/v2/posts"
try:
# 发送 GET 请求
response = requests.get(api_url, headers=headers, timeout=10)
# 检查请求是否成功
response.raise_for_status() # 如果请求失败 (401, 404), 会抛出异常
# 解析 JSON 数据
posts = response.json()
# 打印文章标题
for post in posts:
print(f"文章ID: {post['id']}, 标题: {post['title']['rendered']}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
示例 2:创建一篇新文章
这是最常见的“导入”场景,你可以从 CSV、数据库、其他 API 等地方获取数据,然后通过 Python 脚本批量发布到 WordPress。
import requests
import base64
import json
# --- 配置信息 (同上) ---
WP_URL = "https://你的WordPress网站域名"
WP_USERNAME = "你的WordPress用户名"
WP_PASSWORD = "你的应用密码"
auth_string = f"{WP_USERNAME}:{WP_PASSWORD}"
auth_bytes = auth_string.encode('ascii')
auth_base64 = base64.b64encode(auth_bytes).decode('ascii')
headers = {
'Authorization': f'Basic {auth_base64}',
'Content-Type': 'application/json' # 发送 JSON 数据需要设置此头
}
# API 端点
api_url = f"{WP_URL}/wp-json/wp/v2/posts"
# 准备要发布的新文章数据
# status 可以是 'draft' (草稿), 'pending' (待审), 'publish' (已发布)
new_post_data = {: '我的第一篇 Python 发布的文章',
'content': '这是通过 Python 脚本自动发布到 WordPress 的文章内容,支持 <strong>HTML</strong> 标签。',
'status': 'publish',
'author': 1, # 作者ID,1 通常是管理员
'categories': [1], # 分类ID数组,1 通常是“未分类”
'tags': ['python', '自动化'] # 标签名数组
}
try:
# 发送 POST 请求
response = requests.post(api_url, headers=headers, data=json.dumps(new_post_data), timeout=10)
# 检查请求是否成功
response.raise_for_status()
# 获取新创建文章的信息
created_post = response.json()
print(f"文章发布成功!文章ID: {created_post['id']}, 链接: {created_post['link']}")
except requests.exceptions.RequestException as e:
print(f"发布失败: {e}")
# 如果失败,打印服务器返回的错误信息
if response is not None:
print(f"服务器响应: {response.text}")
示例 3:上传图片并作为文章特色图片
这是一个稍微复杂但非常实用的例子。
import requests
import base64
# --- 配置信息 ---
WP_URL = "https://你的WordPress网站域名"
WP_USERNAME = "你的WordPress用户名"
WP_PASSWORD = "你的应用密码"
# 1. 上传图片
image_path = 'path/to/your/image.jpg' # 替换为你的图片路径
# 计算文件名
filename = image_path.split('/')[-1]
# 读取图片文件内容
with open(image_path, 'rb') as f:
image_data = f.read()
# 构造上传请求
upload_url = f"{WP_URL}/wp-json/wp/v2/media"
headers = {
'Authorization': f'Basic {base64.b64encode(f"{WP_USERNAME}:{WP_PASSWORD}".encode()).decode()}',
'Content-Disposition': f'attachment; filename={filename}',
'Content-Type': 'image/jpeg' # 根据图片类型设置
}
try:
# 发送 POST 请求上传图片
image_response = requests.post(upload_url, data=image_data, headers=headers, timeout=30)
image_response.raise_for_status()
# 获取上传后的媒体信息
media_item = image_response.json()
print(f"图片上传成功!媒体ID: {media_item['id']}")
# 2. 使用上传的图片作为特色图片创建文章
auth_string = f"{WP_USERNAME}:{WP_PASSWORD}"
auth_bytes = auth_string.encode('ascii')
auth_base64 = base64.b64encode(auth_bytes).decode('ascii')
post_headers = {
'Authorization': f'Basic {auth_base64}',
'Content-Type': 'application/json'
}
post_api_url = f"{WP_URL}/wp-json/wp/v2/posts"
new_post_with_featured_image = {
'title': '带特色图片的文章',
'content': '这篇文章包含了一张通过 Python 上传的特色图片。',
'status': 'publish',
'featured_media': media_item['id'] # 使用刚刚上传的媒体ID
}
post_response = requests.post(post_api_url, headers=post_headers, data=json.dumps(new_post_with_featured_image), timeout=10)
post_response.raise_for_status()
created_post = post_response.json()
print(f"文章发布成功!特色图片已设置,文章链接: {created_post['link']}")
except requests.exceptions.RequestException as e:
print(f"操作失败: {e}")
if 'image_response' in locals() and image_response is not None:
print(f"图片上传错误: {image_response.text}")
if 'post_response' in locals() and post_response is not None:
print(f"文章发布错误: {post_response.text}")
其他方法(了解即可)
除了 REST API,还有其他一些方式可以实现与 WordPress 的交互,但它们通常不如 REST API 灵活和现代。
-
XML-RPC
(图片来源网络,侵删)- 简介:这是一个更老的远程调用协议,WordPress 也支持,它功能强大,但配置相对复杂,且官方社区对其未来的支持态度不如 REST API 积极。
- Python 库:可以使用
xmlrpc.client(Python 内置) 或第三方库如python-wordpress-xmlrpc。 - 适用场景:如果你在使用一个非常老的 WordPress 版本,或者使用的特定插件/主题只支持 XML-RPC。
-
直接操作数据库
- 简介:通过 Python 的数据库连接库(如
pymysql,psycopg2)直接连接 WordPress 的 MySQL 数据库,并插入或修改wp_posts,wp_postmeta等表的数据。 - 优点:速度极快,绕过了 WordPress 的所有逻辑。
- 缺点:
- 极度危险:容易破坏数据库结构,导致网站崩溃。
- 脆弱:WordPress 更新后,数据库表结构可能改变,导致你的脚本失效。
- 无法处理附件:上传文件并生成正确的路径和元数据非常复杂。
- 适用场景:仅限于高级开发者进行底层数据迁移,并且对数据库结构有非常深入的了解。绝对不推荐初学者使用。
- 简介:通过 Python 的数据库连接库(如
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| WordPress REST API | 官方支持、现代、安全、功能全面、易于使用 | 需要理解 HTTP 请求和 JSON | ⭐⭐⭐⭐⭐ (强烈推荐) |
| XML-RPC | 功能强大,历史较长 | 配置复杂,社区支持度下降 | ⭐⭐☆☆☆ (备选方案) |
| 直接操作数据库 | 速度最快,无性能开销 | 极度危险、脆弱、不维护 | ⭐☆☆☆☆ (不推荐,除非有特殊需求) |
对于绝大多数用户来说,学习和使用 WordPress REST API 是与 Python 交互的最佳方式。 它安全、灵活,并且是 WordPress 官方主推的标准化接口,上面的示例代码为你提供了一个坚实的基础,你可以基于此进行扩展,例如从 CSV 文件批量读取数据、处理 Markdown 格式内容、定时发布文章等。
