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网络服务器、本地数据库和编写WordPress的PHP语言。
在Windows上安装WordPress
本节涉及WordPress在Windows操作系统上的安装。下面的步骤演示了如何使用XAMPP在Windows 10上设置和配置一个虚拟主机。
Step 1: 下载XAMPP和WordPress
在下载WordPress之前,重要的是要建立它运行的适当环境。在Windows上,这是通过安装XAMPP或WAMP来完成的,以建立一个服务器-数据库堆栈(业界最喜欢的是Apache作为网络服务器,MySQL作为数据库)。
在本指南中,我将使用XAMPP,可从Apache网站下载。
你会看到各种适用于不同PHP版本的选项。我选择了在最新的PHP版本中效果最好的选项。
一旦下载完成,运行它将XAMPP安装在你的本地系统上。安装后,启动控制面板,查看并设置Apache和MySQL的状态。
启动这两个服务对于在本地安装WordPress是必要的。
Step2: 在本地安装和设置WordPress
设置好网络服务器和数据库后,从官方网站下载WordPress。
将压缩文件移到XAMPP目录下的/htdocs文件夹。解压缩文件并导航到项目目录。
重要提示:确保XAMPP控制面板中的Apache和MySQL服务已经启动并运行。
接下来,访问phpMyAdmin门户,创建你的新WordPress网站的数据库。你很可能在以下网址找到该门户(取决于你的端口配置)。
http://localhost:80/phpmyadmin/
一旦数据库被创建,通过访问以下网址启动WordPress安装设置。
http://localhost:80/newwpsite/wp-admin/setup-config.php
选择所需的语言并点击 “Continue”。
在下一个屏幕上,按照步骤在wp-config.php文件中添加数据库凭证。
Open wp-config.php file within your favorite code editor and define database credentials as follow:
在你喜欢的代码编辑器中打开wp-config.php文件,并按以下方式定义数据库凭证:
// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( 'DB_NAME', 'newwpsite' ); /** MySQL database username */ define( 'DB_USER', 'root' ); /** MySQL database password */ define( 'DB_PASSWORD', '' );
保存文件并回到WordPress安装向导。
输入数据库名称、用户名和密码。你也可以定义你自己的表前缀,但现在,我保持默认值。完成后,点击’Submit’。
下一个屏幕将确认数据库配置成功 点击’Run the installation’,开始WordPress的安装过程。
在下一个屏幕中,提供有关你的网站的信息,并设置用户名和密码以访问WordPress仪表板。
一旦完成,点击 “Install WordPress”按钮。这将显示成功信息和启动非常著名的WordPress仪表板登录页面的按钮。
这就是你需要做的所有事情,在你的Windows机器上本地安装WordPress。
在Mac上安装WordPress
如果你是一个Mac用户,你也可以在你的Mac上本地使用WordPress。就像Windows一样,你将需要设置一个栈来在本地运行WordPress。虽然步骤有些不同,但在Mac上本地使用WordPress的总体过程仍然是一样的。
Step1: 下载MAMP
第一步,下载MAMP,它为WordPress的安装设置了一个网络服务器和数据库。
去MAMP官网下载macOS安装包。
一旦下载完成,通过运行安装向导开始安装MAMPP。你可能会被要求同时安装专业版。这不是一个强制性的要求,你可以通过点击灰色文件夹从免费版本开始。
一旦安装完成,前往MAMP控制器并启动服务器。
一旦服务器启动并运行,点击打开WebStart页面来启动phpMyAdmin。
Step2: 为Mac本地安装WordPress
Mac用户可以从官方网站下载WordPress安装包。
在下载了WordPress for Mac之后,解压下载的文件,并将文件夹放在MAMP文档根目录内。你可以把这个文件夹重命名为WordPress网站的名称。
现在,通过MAMP控制面板使用phpMyAdmin创建数据库。幸运的是,phpMyAdmin的工作原理和在Windows中一样。添加数据库的名称,然后到wp-config.php文件中添加数据库证书。
现在,通过访问链接运行WordPress安装向导,http://localhost/newwpsite
其余的步骤与在Windows上本地安装WordPress时相同。
这是你的WordPress博客,你可以在这里开始写作。但是为了使Python能够访问和使用WordPress REST API,我们必须首先配置WordPress 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 < 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库。现代语言提供了语法和工具,可以实现异步编程。这增加了应用程序的响应速度,因为它允许程序在进行网页请求、数据库操作和磁盘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基础知识完全指南》来探索其他的可能性。
评论留言