WordPress已经成为最常用的内容管理系统(CMS),这在很大程度上是由于它的应用编程接口(API)。WordPress的REST API使WordPress能够与其他用各种语言编写的应用程序 “对话”–包括Python。
Python是一种可扩展的编程语言,具有多种用途和人类可读的语法,使它成为远程管理WordPress内容的强大工具。
下面是一些WordPress REST API对你的应用程序的用例,以及你如何使用Python来支持它们。
- 使用预定义模板,使你的应用程序能够快速地将原始数据转化为带有解释的格式化文章。
- 在Django和Python上建立一个后台应用程序,在每次特定对象的折扣或销售事件发生时向你的客户显示限时优惠。
- 整合Python脚本,在你的WordPress网站内运行
本教程将帮助你创建一个简单的Python控制台应用程序,与WordPress REST API进行通信并执行操作。完整的项目代码也是可用的。
- 安装和配置WordPress
- 如何从Python中控制WordPress
- 在代码中获取文章
- 用代码创建文章
- 更新代码中的文章
- 删除代码中的文章
安装和配置WordPress
首先,让我们在你的开发机器上本地安装和运行一个WordPress网站。这是开始使用WordPress的一个很好的方法,因为你不需要创建一个账户或购买一个虚拟主机的域名。
在本地安装WordPress之前,需要在你的电脑上运行一些组件,包括Apache网络服务器、本地数据库和编写WordPress的PHP语言。
幸运的是,我们可以使用DevKinsta,一个免费的本地WordPress开发套件,可用于所有主要的操作系统(你不需要成为Kinsta的客户来使用它)。
DevKinsta可用于Windows、Mac和Linux,并在你的本地机器上安装WordPress和它的所有依赖项。
在安装DevKinsta之前,你必须在本地运行Docker,所以如果你还没有下载并安装Docker引擎。
安装Docker Desktop后,你可以自动下载适合你的操作系统的软件包。
DevKinsta安装页面
当你运行DevKinsta安装程序时,Docker立即开始初始化。
DevKinsta的创建新网站菜单
现在,DevKinsta安装程序要求你创建WordPress管理账户的凭据。
DevKinsta显示新WordPress网站表格
一旦安装,DevKinsta就是一个独立的应用程序。现在你可以同时访问WordPress网站(通过Open Site按钮)和WordPress管理仪表板(WP Admin按钮)。
DevKinsta的网站信息面板
接下来,你需要为你的网站启用SSL和HTTPS。这可以通过SSL证书提高你网站的安全性。
DevKinsta的 “SSL和HTTPS “选项
现在进入DevKinsta应用程序,点击Open site按钮。一个新的浏览器标签将显示你的WordPress网站的主页。
WordPress主页
这是你的WordPress博客,你可以在这里开始写作。但是为了使Python能够访问和使用WordPress REST API,我们必须首先配置WordPress Admin。
现在点击DevKinsta应用程序上的WP Admin按钮,然后提供你的用户和密码以访问WordPress仪表板。
WordPress登录表单
一旦你登录了,你会看到WordPress仪表盘。
WordPress仪表板页面
WordPress使用cookie认证作为它的标准方法。但是,如果你想用REST API来控制它,你必须用一种允许访问WordPress REST API的技术来认证。
为此,你将使用应用密码。这些是WordPress生成的24个字符的长字符串,并与有权限管理你的网站的用户配置文件联系起来。
要使用应用密码,请点击仪表板上的插件菜单,然后搜索同名的插件。然后安装并激活应用程序密码插件。
WordPress的应用密码插件
要开始创建你的应用程序密码,首先要展开Users菜单,点击All Users。
扩展的用户菜单
现在,点击你的管理员用户名下面的编辑。
WP-Admin WordPress界面
向下滚动 “编辑用户 “页面,找到 “应用密码 “部分。在这里,为应用程序密码提供一个名称,以后你将用它来验证你的Python应用程序的请求和消费REST API。
申请密码页
点击Add New Application Password,这样WordPress就可以为你生成一个随机的24个字符的密码。
新的申请密码页面
接下来,复制这个密码并将其保存在一个安全的地方,以便以后使用。记住,一旦你关闭这个页面,你将无法找回这个密码。
最后,你必须配置permalinks。WordPress允许你为你的permalinks和archives创建一个自定义的URL结构。让我们改变它,使一个WordPress的文章标题,例如,”你的第一个WordPress网站”,可以通过直观的URL https://your-website.local:port/your-first-wordpress-website/。这种方法带来了一些好处,包括改善可用性和美观性。
要配置固定链接,展开设置部分并点击固定链接菜单。在这里,将常用设置改为文章名称。
使用Post name结构来设置固定链接结构也是必要的,因为它将允许我们在以后的Python代码中使用JSON格式来检索文章。否则,将抛出一个JSON解码错误。
如何从Python中控制WordPress
WordPress是用PHP编写的,但它有一个REST API,使其他编程语言、网站和应用程序能够消费其内容。在REST架构中暴露WordPress的内容,使其以JSON格式提供。因此,其他服务可以与WordPress集成,执行创建、读取、更新和删除(CRUD)操作,而不需要安装本地的WordPress。
接下来,你将建立一个简单的Python应用程序,看看你如何使用WordPress REST API来创建、检索、更新和删除文章。
为你的新的简单Python项目创建一个新的目录,并命名为 PythonWordPress
之类的。
../PythonWordPress
现在,你将为你的项目创建一个虚拟环境,让它保持一套独立的已安装的 Python 包,将它们与你的系统目录隔离,避免版本冲突。通过执行venv
命令来创建一个虚拟环境。
python3 -m venv .venv
现在,运行一个命令来激活.venv虚拟环境。这个命令因操作系统而异。
- Windows:
.venvScriptsactivate
- Mac/Linux:
.venv/bin/activate
接下来,存储与你的WordPress帐户相关的配置。为了将应用程序的配置与你的Python代码分开,在你的项目目录下创建一个.env文件,并将这些环境变量添加到该文件中。
WEBSITE_URL="" API_USERNAME="" API_PASSWORD=""
幸运的是,从Python应用中读取上述数据很容易。你可以安装Python-dotenv包,这样你的应用程序就可以从.env文件中读取配置。
pip install python-dotenv
然后,安装 aiohttp,一个用于 Python 的异步 HTTP 客户端/服务器。
pip install aiohttp
现在添加一个名为app.py的文件,代码如下。
import asyncio menu_options = { 1: 'List Posts', 2: 'Retrieve a Post' } def print_menu(): for key in menu_options.keys(): print (key, '--', menu_options[key] ) async def main(): while(True): print_menu() option = input_number('Enter your choice: ') #Check what choice was entered and act accordingly if option == 1: print('Listing posts...') elif option == 2: print('Retrieving a post...') else: print('Invalid option. Please enter a number between 1 and 5.') def input_number(prompt): while True: try: value = int(input(prompt)) except ValueError: print('Wrong input. Please enter a number ...') continue if value上面的代码显示一个控制台菜单,要求你输入一个数字来选择一个选项。接下来,你将扩展这个项目并实现代码,使你能够列出所有的文章,并使用其文章ID检索一个特定的文章。
在代码中获取文章
为了与WordPress REST API交互,你必须创建一个新的Python文件。创建一个名为wordpress_api_helper.py的文件,内容如下。
import aiohttp import base64 import os import json from dotenv import load_dotenv load_dotenv() user=os.getenv("API_USERNAME") password=os.getenv("API_PASSWORD") async def get_all_posts(): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get("/wp-json/wp/v2/posts") as response: print("Status:", response.status) text = await response.text() wp_posts = json.loads(text) sorted_wp_posts = sorted(wp_posts, key=lambda p: p['id']) print("=====================================") for wp_post in sorted_wp_posts: print("id:", wp_post['id']) print("title:", wp_post['title']['rendered']) print("=====================================") async def get_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.get(f"/wp-json/wp/v2/posts/{id}") as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) print("=====================================") print("Post") print(" id:", wp_post['id']) print(" title:", wp_post['title']['rendered']) print(" content:", wp_post['content']['rendered']) print("=====================================")请注意上面使用的aiohttp库。现代语言提供了语法和工具,可以实现异步编程。这增加了应用程序的响应速度,因为它允许程序在进行网页请求、数据库操作和磁盘I/O等操作的同时执行任务。Python提供了asyncio作为其异步编程框架的基础,aiohttp库建立在asyncio之上,为Python中的HTTP客户端/服务器操作带来异步访问。
上面的
ClientSession
函数异步运行并返回一个session
对象,我们的程序用它来对/wp-json/wp/v2/posts
端点执行 HTTP GET 操作。检索所有文章的请求与检索特定文章的请求之间的唯一区别是,最后一个请求在URL路由中传递了一个post id
参数:/wp-json/wp/v2/posts/{id}
.现在,打开app.py文件,添加
import
语句。from wordpress_api_helper import get_all_posts, get_post
接下来,修改
main
函数以调用get_all_posts
和get_post
函数。if option == 1: print('Listing posts...') await get_all_posts() elif option == 2: print('Retrieving a post...') id = input_number('Enter the post id: ') await get_post(id)然后运行该应用程序。
python app.py然后你会看到应用程序菜单。
Python应用程序菜单
显示文章列表和单个用户选择的文章的Python应用程序
用代码创建文章
要在Python中创建一个WordPress文章,首先要打开wordpress_api_helper.py文件并添加
create_post
函数。async def create_post(title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')这段代码在
session
对象中调用post
函数,在REST API端点的URL旁边传递auth
参数。auth
对象现在包含WordPress用户和你用Application Passwords创建的密码。现在,打开 app.py 文件,添加代码来导入create_post
和菜单。from wordpress_api_helper import get_all_posts, get_post, create_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post' }然后添加第三个菜单选项。
elif option == 3: print('Creating a post...') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await create_post(title, f"{content}")然后,运行应用程序并尝试选项3,传递一个标题和内容,在WordPress中创建一个新的文章。
Python应用程序显示新创建的WordPress文章
再次选择选项1将返回新添加文章的ID和标题。
Python应用程序返回新文章的标题和ID
你也可以打开你的WordPress网站来查看新的文章。
新WordPress文章的浏览器图像
更新代码中的文章
打开wordpress_api_helper.py文件,添加
update_post
函数。async def update_post(id, title, content): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.post( f"/wp-json/wp/v2/posts/{id}?content={content}&title={title}&status=publish" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'New post created with id: {post_id}')然后打开app.py文件,添加代码,导入
update_post
和菜单。from wordpress_api_helper import get_all_posts, get_post, create_post, update_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post' }然后,添加第四个菜单选项。
elif option == 4: print('Updating a post...') id = input_number('Enter the post id: ') title = input_text('Enter the post title: ') content = input_text('Enter the post content: ') await update_post(id, title, f"{content}")然后运行应用程序并尝试选项4,传递一个文章的ID、标题和内容,以更新一个现有的文章。
Python应用程序显示更新后的菜单
选择选项2并传递更新的文章ID将返回新添加的文章的详细信息。
Python应用程序显示更新的文章
删除代码中的文章
你可以把文章的ID传递给REST API来删除一个文章。
打开wordpress_api_helper.py文件,添加
delete_post
函数。async def delete_post(id): async with aiohttp.ClientSession(os.getenv("WEBSITE_URL")) as session: async with session.delete( f"/wp-json/wp/v2/posts/{id}" , auth=aiohttp.BasicAuth(user, password)) as response: print("Status:", response.status) text = await response.text() wp_post = json.loads(text) post_id = wp_post['id'] print(f'Post with id {post_id} deleted successfully.')现在打开app.py文件,添加代码,导入
delete_post
和菜单。from wordpress_api_helper import get_all_posts, get_post, create_post, update_post, delete_post menu_options = { 1: 'List Posts', 2: 'Retrieve a Post', 3: 'Create a Post', 4: 'Update a Post', 5: 'Delete a Post', }然后,添加第五个菜单选项。
elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)现在运行应用程序并尝试选项5,通过一个id来删除WordPress中的现有文章。
Python应用程序显示删除了选定的文章
注意:如果你运行列表文章选项,被删除的文章可能还会出现。
Python应用程序显示原始文章列表
要确认你已经删除了文章,请等待几秒钟,然后再试一下 “列出文章”选项。就这样了!
小结
由于WordPress的REST API和Python的HTTP客户端库,Python应用程序和WordPress可以组队并相互交谈。REST API的好处是,它允许你从Python应用程序中远程操作WordPress,其中Python的强大语言能够按照你所需要的结构和频率自动创建内容。
DevKinsta使创建和开发一个本地WordPress网站变得快速而简单。它为开发WordPress主题和插件提供了一个本地环境,并通过其基于Docker的独立安装模式提供了一个简化的部署模型。
你在Python和WordPress方面有什么工作经验?
当准备好扩展这些经验时,你可以阅读《WordPress REST API基础知识完全指南》来探索其他的可能性。