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基礎知識完全指南》來探索其他的可能性。
評論留言