通过将您的应用程序与 WordPress 连接来打磨您的 Python Chops

已发表: 2022-10-18

WordPress 已成为最常用的内容管理系统 (CMS),这在很大程度上归功于其应用程序编程接口 (API)。 WordPress REST API 使 WordPress 能够与使用各种语言(包括 Python)编写的其他应用程序“对话”。

Python 是一种可扩展的编程语言,具有多种用途和人类可读的语法,使其成为远程管理 WordPress 内容的强大工具。

以下是您的应用程序的一些 WordPress REST API 用例以及如何使用 Python 来支持它们:

  • 使用预定义的模板使您的应用能够快速将原始数据转换为带说明的格式化帖子。
  • 在 Django 和 Python 上构建一个后台应用程序,每次发生特定对象的折扣或销售事件时,它都会向您的客户显示限时优惠。
  • 集成 Python 脚本以在您的 WordPress 网站中运行

本教程将帮助您创建一个简单的 Python 控制台应用程序,该应用程序与 WordPress REST API 通信并在其上执行操作。 完整的项目代码也可用。


安装和配置 WordPress

首先,让我们在您的开发机器上本地安装和运行一个 WordPress 网站。 这是开始使用 WordPress 的绝佳方式,因为您不必为虚拟主机创建帐户或购买域名。

在本地安装 WordPress 之前,需要在您的计算机上运行一些组件,包括 Apache Web 服务器、本地数据库和编写 WordPress 的 PHP 语言。

幸运的是,我们可以使用 DevKinsta,这是一个免费的本地 WordPress 开发套件,适用于所有主要操作系统(您不必成为 Kinsta 客户也可以使用它)。

DevKinsta 可用于 Windows、Mac 和 Linux,并在您的本地计算机上安装 WordPress 及其所有依赖项。

在安装 DevKinsta 之前,您必须在本地运行 Docker,因此如果您还没有安装 Docker 引擎,请下载并安装。

安装 Docker Desktop 后,您可以自动下载适合您操作系统的软件包。

DevKinsta 的下载页面截图。
DevKinsta 安装页面。

当您运行 DevKinsta 安装程序时,Docker 立即开始初始化:

DevKinsta 的启动 Docker 屏幕。
DevKinsta 在本地启动 Docker。

接下来,从创建新站点菜单中选择新建 WordPress 站点

DevKinsta 创建新的 WordPress 站点屏幕。
DevKinsta 的创建新站点菜单。

现在 DevKinsta 安装程序要求您为 WordPress 管理员帐户创建凭据:

DevKinsta 的新 WordPress 站点创建屏幕。
DevKinsta 显示新的 WordPress 站点表单。

安装后,DevKinsta 是一个独立的应用程序。 现在您可以访问 WordPress 站点(通过Open Site按钮)和 WordPress 管理仪表板( WP Admin按钮)。

DevKinsta 的 WordPress 站点信息屏幕。
DevKinsta 的站点信息面板。

接下来,您需要为您的网站启用 SSL 和 HTTPS。 这通过 SSL 证书提高了您网站的安全性。

启用 DevKinsta 的 SSL 和 HTTPS 选项。
DevKinsta 的“SSL 和 HTTPS”选项。

现在转到 DevKinsta 应用程序并单击打开站点按钮。 一个新的浏览器选项卡将显示您的 WordPress 网站的主页:

您本地 WordPress 网站的主页。
WordPress主页。

这是您的 WordPress 博客,您可以从这里开始写作。 但是要让 Python 能够访问和使用 WordPress REST API,我们必须首先配置 WordPress Admin。

现在单击 DevKinsta 应用程序上的WP Admin按钮,然后提供您的用户和密码以访问WordPress 仪表板

WordPress 管理仪表板登录屏幕。
WordPress 登录表单。

登录后,您将看到WordPress 仪表板

欢迎来到 WordPress 管理屏幕。
WordPress仪表板页面。

WordPress 使用 cookie 身份验证作为其标准方法。 但是,如果您想使用 REST API 来控制它,则必须使用一种授予对 WordPress REST API 访问权限的技术进行身份验证。

为此,您将使用应用程序密码。 这些是 WordPress 生成并与有权管理您的网站的用户配置文件相关联的 24 个字符长的字符串。

要使用应用程序密码,请单击仪表板上的插件菜单,然后搜索具有相同名称的插件。 然后安装并激活应用程序密码插件:

安装和激活 WordPress 应用程序密码插件。
WordPress 的应用程序密码插件。

要开始创建您的应用程序密码,首先展开用户菜单并单击所有用户

扩展的用户 WordPress 菜单。
扩展的用户菜单。

现在,单击管理员用户名下方的编辑

单击“用户”菜单下 WordPress 用户下方的“编辑”按钮。
WP-Admin WordPress 界面。

向下滚动编辑用户页面并找到应用程序密码部分。 在这里,为应用程序密码提供一个名称,稍后您将使用它来验证您的 Python 应用程序请求并使用 REST API:

应用程序密码插件仪表板。
应用程序密码页面。

单击添加新应用程序密码,以便 WordPress 为您生成一个随机的 24 个字符的密码:

应用程序密码插件生成的新密码。
新的应用程序密码页面。

接下来,复制此密码并将其保存在安全位置以供日后使用。 请记住,关闭此页面后,您将无法找回此密码。

最后,您必须配置永久链接。 WordPress 允许您为永久链接和档案创建自定义 URL 结构。 让我们对其进行更改,以便可以通过直观的 URL https://your-website.local:port/your-first-wordpress-website/ 访问标题为“您的第一个 WordPress 网站”的 WordPress 帖子。 这种方法带来了几个好处,包括改进的可用性和美观性。

要配置永久链接,请展开“设置”部分并单击“永久链接”菜单。 在这里,将Common Settings更改为Post name

更改 WordPress 永久链接设置。

使用帖子名称结构设置永久链接结构也是必要的,因为它允许我们稍后在 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 < 0: print("Sorry, your response must not be negative.") else: break return value def input_text(prompt): while True: text = input(prompt) if len(text) == 0: print("Text is required.") continue else: break return text if __name__=='__main__': asyncio.run(main())

上面的代码显示了一个控制台菜单,并要求您输入一个数字来选择一个选项。 接下来,您将扩展此项目并实现代码,使您能够列出所有帖子并使用帖子 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库的使用。 现代语言提供了支持异步编程的语法和工具。 这通过允许程序在执行 Web 请求、数据库操作和磁盘 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_postsget_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

然后您将看到应用程序菜单:

启动连接到 WordPress 的 Python 应用程序。
Python 应用程序菜单。

现在尝试选项 1 来查看您的 Python 应用程序检索到的帖子列表,并尝试选项 2 来选择帖子:

尝试选项 1 来查看您的 Python 应用程序检索到的帖子列表,并尝试选项 2 来选择帖子。
显示帖子列表和单个用户选择的帖子的 Python 应用程序。

在代码中创建帖子

要在 Python 中创建 WordPress 帖子,首先打开wordpress_api_helper.py文件并添加create_post函数:

因停机时间和 WordPress 问题而苦苦挣扎? Kinsta 是旨在节省您时间的托管解决方案! 查看我们的功能
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 用户和您使用应用程序密码创建的密码。 现在,打开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 帖子。
显示新创建的 WordPress 帖子的 Python 应用程序。

再次选择选项 1 将返回新添加帖子的 id 和标题:

返回新添加帖子的 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、标题和内容以更新现有帖子。

更新 WordPress 帖子。
显示更新菜单的 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 应用程序删除 WordPress 帖子。
显示删除所选帖子的 Python 应用程序。

注意:如果您运行“列出帖子”选项,删除的帖子可能仍会出现:

Python 应用程序列表帖子。
显示原始帖子列表的 Python 应用程序。

要确认您已删除帖子,请等待几秒钟,然后再次尝试列出帖子选项。 就是这样!

概括

多亏了 WordPress REST API 和 Python 的 HTTP 客户端库,Python 应用程序和 WordPress 可以组队并相互交谈。 REST API 的好处是它允许您从 Python 应用程序远程操作 WordPress,其中 Python 强大的语言支持按照您想要的结构和频率自动创建内容。

DevKinsta 使创建和开发本地 WordPress 站点变得快速而简单。 它为开发 WordPress 主题和插件提供了一个本地环境,并通过其基于 Docker 的自包含安装模型提供了一个简化的部署模型。

您使用 Python 和 WordPress 有什么经验?

当准备好扩展该体验时,您可以阅读 WordPress REST API 基础完整指南以探索其他可能性。