#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ WordPress REST API 使用示例 演示常见的WordPress操作 """ import os import requests import json from requests.auth import HTTPBasicAuth from datetime import datetime from dotenv import load_dotenv # 加载环境变量 load_dotenv() # WordPress 配置信息 WP_URL = os.getenv('WORDPRESS_URL') WP_USER = os.getenv('WORDPRESS_USERNAME') WP_APP_PASSWORD = os.getenv('WORDPRESS_APP_PASSWORD') # 移除密码中的空格 if WP_APP_PASSWORD: WP_APP_PASSWORD = WP_APP_PASSWORD.replace(" ", "") # 检查必需的环境变量 if not all([WP_URL, WP_USER, WP_APP_PASSWORD]): print("❌ 错误: 请在 .env 文件中配置 WORDPRESS_URL, WORDPRESS_USERNAME, WORDPRESS_APP_PASSWORD") exit(1) class WordPressAPI: def __init__(self, url, username, app_password): self.base_url = url.rstrip('/') self.api_url = f"{self.base_url}/wp-json/wp/v2" self.username = username self.app_password = app_password self.auth = HTTPBasicAuth(username, app_password) def get_posts(self, per_page=10, status='publish'): """获取文章列表""" params = { 'per_page': per_page, 'status': status } response = requests.get(f"{self.api_url}/posts", params=params) if response.status_code == 200: return response.json() else: print(f"获取文章失败: {response.status_code}") return None def get_post_by_id(self, post_id): """根据ID获取特定文章""" response = requests.get(f"{self.api_url}/posts/{post_id}") if response.status_code == 200: return response.json() else: print(f"获取文章失败: {response.status_code}") return None def create_post(self, title, content, status='draft', categories=None, tags=None): """创建新文章""" post_data = { 'title': title, 'content': content, 'status': status } if categories: post_data['categories'] = categories if tags: post_data['tags'] = tags response = requests.post( f"{self.api_url}/posts", json=post_data, auth=self.auth ) if response.status_code == 201: return response.json() else: print(f"创建文章失败: {response.status_code}") print(response.text) return None def update_post(self, post_id, title=None, content=None, status=None): """更新文章""" update_data = {} if title: update_data['title'] = title if content: update_data['content'] = content if status: update_data['status'] = status response = requests.post( f"{self.api_url}/posts/{post_id}", json=update_data, auth=self.auth ) if response.status_code == 200: return response.json() else: print(f"更新文章失败: {response.status_code}") return None def delete_post(self, post_id, force=False): """删除文章""" params = {'force': 'true'} if force else {} response = requests.delete( f"{self.api_url}/posts/{post_id}", params=params, auth=self.auth ) if response.status_code == 200: return response.json() else: print(f"删除文章失败: {response.status_code}") return None def get_categories(self): """获取分类列表""" response = requests.get(f"{self.api_url}/categories") if response.status_code == 200: return response.json() else: print(f"获取分类失败: {response.status_code}") return None def create_category(self, name, description="", parent=0): """创建新分类""" category_data = { 'name': name, 'description': description, 'parent': parent } response = requests.post( f"{self.api_url}/categories", json=category_data, auth=self.auth ) if response.status_code == 201: return response.json() else: print(f"创建分类失败: {response.status_code}") return None def get_tags(self): """获取标签列表""" response = requests.get(f"{self.api_url}/tags") if response.status_code == 200: return response.json() else: print(f"获取标签失败: {response.status_code}") return None def create_tag(self, name, description=""): """创建新标签""" tag_data = { 'name': name, 'description': description } response = requests.post( f"{self.api_url}/tags", json=tag_data, auth=self.auth ) if response.status_code == 201: return response.json() else: print(f"创建标签失败: {response.status_code}") return None def upload_media(self, file_path, title=None, alt_text=None): """上传媒体文件""" if not os.path.exists(file_path): print(f"文件不存在: {file_path}") return None filename = os.path.basename(file_path) with open(file_path, 'rb') as f: files = { 'file': (filename, f, 'application/octet-stream') } data = {} if title: data['title'] = title if alt_text: data['alt_text'] = alt_text response = requests.post( f"{self.api_url}/media", files=files, data=data, auth=self.auth ) if response.status_code == 201: return response.json() else: print(f"上传媒体失败: {response.status_code}") return None def get_media(self, per_page=10): """获取媒体列表""" params = {'per_page': per_page} response = requests.get(f"{self.api_url}/media", params=params) if response.status_code == 200: return response.json() else: print(f"获取媒体失败: {response.status_code}") return None def search_posts(self, search_term, per_page=10): """搜索文章""" params = { 'search': search_term, 'per_page': per_page } response = requests.get(f"{self.api_url}/posts", params=params) if response.status_code == 200: return response.json() else: print(f"搜索文章失败: {response.status_code}") return None def demo_basic_operations(): """演示基本操作""" print("🚀 WordPress REST API 基本操作演示\n") wp = WordPressAPI(WP_URL, WP_USER, WP_APP_PASSWORD) # 1. 获取现有文章 print("📝 获取现有文章...") posts = wp.get_posts(per_page=5) if posts: print(f"找到 {len(posts)} 篇文章:") for post in posts: print(f" - {post['title']['rendered']} (ID: {post['id']})") else: print("没有找到文章") # 2. 获取分类 print("\n📂 获取分类...") categories = wp.get_categories() if categories: print(f"找到 {len(categories)} 个分类:") for cat in categories: print(f" - {cat['name']} (ID: {cat['id']}, 文章数: {cat['count']})") # 3. 获取标签 print("\n🏷️ 获取标签...") tags = wp.get_tags() if tags: print(f"找到 {len(tags)} 个标签:") for tag in tags[:5]: # 只显示前5个 print(f" - {tag['name']} (ID: {tag['id']}, 使用次数: {tag['count']})") else: print("没有找到标签") # 4. 获取媒体文件 print("\n🖼️ 获取媒体文件...") media = wp.get_media(per_page=5) if media: print(f"找到 {len(media)} 个媒体文件:") for item in media: print(f" - {item['title']['rendered']} (类型: {item['media_type']})") print("\n✅ 基本操作演示完成!") def demo_create_content(): """演示内容创建""" print("\n🎨 WordPress 内容创建演示\n") wp = WordPressAPI(WP_URL, WP_USER, WP_APP_PASSWORD) # 创建测试分类 print("📂 创建测试分类...") test_category = wp.create_category( name="API测试分类", description="这是通过API创建的测试分类" ) if test_category: category_id = test_category['id'] print(f"✅ 分类创建成功 (ID: {category_id})") # 创建测试标签 print("\n🏷️ 创建测试标签...") test_tag = wp.create_tag( name="API测试", description="API测试标签" ) if test_tag: tag_id = test_tag['id'] print(f"✅ 标签创建成功 (ID: {tag_id})") # 创建测试文章 print("\n📝 创建测试文章...") current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") test_post = wp.create_post( title=f"API测试文章 - {current_time}", content=f"""
创建时间: {current_time}
这篇文章演示了如何使用WordPress REST API进行内容管理:
注意: 这是一个测试文章,可以安全删除。
""", status='draft', # 草稿状态 categories=[category_id], tags=[tag_id] ) if test_post: post_id = test_post['id'] print(f"✅ 文章创建成功 (ID: {post_id})") print(f" 标题: {test_post['title']['rendered']}") print(f" 状态: {test_post['status']}") print(f" 链接: {test_post['link']}") # 询问是否删除测试内容 print("\n🗑️ 清理测试内容...") # 删除测试文章 if wp.delete_post(post_id, force=True): print(f"✅ 测试文章已删除 (ID: {post_id})") # 删除测试分类和标签需要小心,因为可能有其他内容在使用 print("⚠️ 测试分类和标签保留,请手动删除如果不需要") else: print("❌ 文章创建失败") else: print("❌ 标签创建失败") else: print("❌ 分类创建失败") print("\n✅ 内容创建演示完成!") def main(): """主函数""" print("WordPress REST API 使用示例") print("=" * 40) # 基本操作演示 demo_basic_operations() # 内容创建演示 demo_create_content() print("\n🎉 所有演示完成!") print("\n💡 提示:") print("- 所有创建的测试内容都已清理") print("- 你可以修改这个脚本来适应你的具体需求") print("- 更多API文档: https://developer.wordpress.org/rest-api/") if __name__ == "__main__": main()