通過將您的應用程序與 WordPress 連接來打磨您的 Python Chops
已發表: 2022-10-18WordPress 已成為最常用的內容管理系統 (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 安裝程序時,Docker 立即開始初始化:
接下來,從創建新站點菜單中選擇新建 WordPress 站點:
現在 DevKinsta 安裝程序要求您為 WordPress 管理員帳戶創建憑據:
安裝後,DevKinsta 是一個獨立的應用程序。 現在您可以訪問 WordPress 站點(通過Open Site按鈕)和 WordPress 管理儀表板( WP Admin按鈕)。
接下來,您需要為您的網站啟用 SSL 和 HTTPS。 這通過 SSL 證書提高了您網站的安全性。
現在轉到 DevKinsta 應用程序並單擊打開站點按鈕。 一個新的瀏覽器選項卡將顯示您的 WordPress 網站的主頁:
這是您的 WordPress 博客,您可以從這裡開始寫作。 但是要讓 Python 能夠訪問和使用 WordPress REST API,我們必須首先配置 WordPress Admin。
現在單擊 DevKinsta 應用程序上的WP Admin按鈕,然後提供您的用戶和密碼以訪問WordPress 儀表板:
登錄後,您將看到WordPress 儀表板:
WordPress 使用 cookie 身份驗證作為其標準方法。 但是,如果您想使用 REST API 來控制它,則必須使用一種授予對 WordPress REST API 訪問權限的技術進行身份驗證。
為此,您將使用應用程序密碼。 這些是 WordPress 生成並與有權管理您的網站的用戶配置文件相關聯的 24 個字符長的字符串。
要使用應用程序密碼,請單擊儀表板上的插件菜單,然後搜索具有相同名稱的插件。 然後安裝並激活應用程序密碼插件:
要開始創建您的應用程序密碼,首先展開用戶菜單並單擊所有用戶:
現在,單擊管理員用戶名下方的編輯:
向下滾動編輯用戶頁面並找到應用程序密碼部分。 在這裡,為應用程序密碼提供一個名稱,稍後您將使用它來驗證您的 Python 應用程序請求並使用 REST API:
單擊添加新應用程序密碼,以便 WordPress 為您生成一個隨機的 24 個字符的密碼:
接下來,複製此密碼並將其保存在安全位置以供日後使用。 請記住,關閉此頁面後,您將無法找回此密碼。
最後,您必須配置永久鏈接。 WordPress 允許您為永久鏈接和檔案創建自定義 URL 結構。 讓我們對其進行更改,以便可以通過直觀的 URL https://your-website.local:port/your-first-wordpress-website/ 訪問標題為“您的第一個 WordPress 網站”的 WordPress 帖子。 這種方法帶來了幾個好處,包括改進的可用性和美觀性。
要配置永久鏈接,請展開“設置”部分並單擊“永久鏈接”菜單。 在這裡,將Common Settings更改為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庫的使用。 現代語言提供了支持異步編程的語法和工具。 這通過允許程序在執行 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_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
然後您將看到應用程序菜單:
現在嘗試選項 1 來查看您的 Python 應用程序檢索到的帖子列表,並嘗試選項 2 來選擇帖子:
在代碼中創建帖子
要在 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 用戶和您使用應用程序密碼創建的密碼。 現在,打開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 中創建新帖子:
再次選擇選項 1 將返回新添加帖子的 id 和標題:
您還可以打開您的 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、標題和內容以更新現有帖子。
選擇選項 2 並傳遞更新的帖子 ID 將返回新添加的帖子的詳細信息:
刪除代碼中的帖子
您可以將帖子 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 中的現有帖子:
注意:如果您運行“列出帖子”選項,刪除的帖子可能仍會出現:
要確認您已刪除帖子,請等待幾秒鐘,然後再次嘗試列出帖子選項。 就是這樣!
概括
多虧了 WordPress REST API 和 Python 的 HTTP 客戶端庫,Python 應用程序和 WordPress 可以組隊並相互交談。 REST API 的好處是它允許您從 Python 應用程序遠程操作 WordPress,其中 Python 強大的語言支持按照您想要的結構和頻率自動創建內容。
DevKinsta 使創建和開發本地 WordPress 站點變得快速而簡單。 它為開發 WordPress 主題和插件提供了一個本地環境,並通過其基於 Docker 的自包含安裝模型提供了一個簡化的部署模型。
您使用 Python 和 WordPress 有什麼經驗?
當準備好擴展該體驗時,您可以閱讀 WordPress REST API 基礎完整指南以探索其他可能性。