杰瑞科技汇

Python如何修改WordPress内容?

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

Python如何修改WordPress内容?-图1
(图片来源网络,侵删)

核心概念:WordPress API

WordPress 本身不直接用 Python 代码修改,而是通过“接口”来暴露其功能,Python 脚本就像一个“客户端”,通过这些接口向 WordPress 网站发送指令(如“创建一篇新文章”、“修改页面标题”等)。

主要有两种接口:

  1. REST API (推荐):现代、强大、易于使用,从 WordPress 4.7 开始被内置支持,是官方推荐的方式。
  2. XML-RPC API:较老的技术,但兼容性很好,很多老插件和旧版本 WordPress 仍然依赖它。

准备工作:

在开始之前,你需要准备以下信息:

Python如何修改WordPress内容?-图2
(图片来源网络,侵删)
  • WordPress 网站的 URLhttps://your-wordpress-site.com
  • 用户名:一个有足够权限的管理员或编辑账户。
  • 应用程序密码(强烈推荐,比直接用登录密码更安全)
    • 如何获取:登录你的 WordPress 后台,进入 用户 -> 个人资料,向下滚动找到 应用程序密码 部分。
    • 输入一个名称("Python Script"),然后点击 添加新的应用程序密码
    • 它会生成一串唯一的密码,请立即复制并妥善保存,刷新页面后就看不到了。

使用 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 官方发展方向,持续更新 维护较少,部分新功能可能不支持

给你的建议:

  1. 优先选择 REST API:对于新项目,请毫不犹豫地选择 REST API,它与现代 Web 开发标准(HTTP, JSON)保持一致,学习曲线更平缓,功能也更强大。
  2. 使用应用程序密码:无论使用哪种 API,都请务必使用“应用程序密码”而不是你的登录密码,这是保障网站安全的基本操作。
  3. 从简单操作开始:先从“获取文章列表”和“创建文章”这样的简单操作开始,成功后再尝试更复杂的修改和删除。
  4. 处理错误:在实际应用中,一定要加入 try...except 错误处理逻辑,并检查 HTTP 状态码或 API 返回的错误信息,让你的脚本更健壮。

希望这个详细的指南能帮助你顺利地使用 Python 和 WordPress 进行自动化工作!

分享:
扫描分享到社交APP
上一篇
下一篇