WordPress er blevet det mest anvendte Content Management System (CMS), hvilket ikke mindst skyldes dets API (Application Programming Interface). WordPress REST API gør det muligt for WordPress at “tale” med andre programmer skrevet i forskellige sprog — herunder Python.
Python er et udvideligt programmeringssprog med forskellige anvendelsesmuligheder og en menneskeligt læsbar syntaks, hvilket gør det til et effektivt værktøj til fjernstyring af WordPress-indhold.
Her er nogle WordPress REST API-brugstilfælde for dine apps, og hvordan du kan bruge Python til at understøtte dem:
- Brug foruddefinerede skabeloner, så din app hurtigt kan omdanne rå data til formaterede indlæg med forklaringer.
- Byg en backoffice-applikation på Django og Python, der viser tidsbegrænsede tilbud til dine kunder, hver gang der opstår en objektspecifik rabat eller salgsbegivenhed.
- Integrer Python-scripts til at køre inde på dit WordPress-websted
Denne vejledning hjælper dig med at oprette et simpelt Python-konsolprogram, der kommunikerer med og udfører operationer på WordPress REST API. Den komplette projektkode er også tilgængelig.
Installation og konfiguration af WordPress
Lad os først installere og køre et WordPress-websted lokalt på din udviklingsmaskine. Dette er en fremragende måde at starte med WordPress på, da du ikke behøver at oprette en konto eller købe et domænenavn til webhosting.
Før du installerer WordPress lokalt, skal nogle komponenter køre på din computer, herunder Apache-webserveren, en lokal database og PHP-sproget, som WordPress er skrevet i.
Heldigvis kan vi bruge DevKinsta, en gratis lokal WordPress-udviklingspakke, der er tilgængelig for alle større operativsystemer (du behøver ikke at være Kinsta-kunde for at bruge den).
DevKinsta er tilgængelig til Windows, Mac og Linux og installerer WordPress plus alle dets afhængigheder på din lokale maskine.
Før du installerer DevKinsta, skal du have Docker kørende lokalt, så download og installer Docker Engine, hvis du ikke har gjort det endnu.
Når du har installeret Docker Desktop, kan du automatisk hente den pakke, der passer til dit styresystem.
Når du kører DevKinsta-installationsprogrammet, begynder Docker at initialisere med det samme:
Vælg derefter Nyt WordPress-websted i menuen Opret nyt websted:
Nu kræver DevKinsta-installationsprogrammet, at du opretter legitimationsoplysningerne til WordPress-administratorkontoen:
Når DevKinsta er installeret, er det et selvstændigt program. Nu kan du få adgang til både WordPress-webstedet (via knappen Åbn websted) og WordPress-administrationspanelet (knappen WP Admin).
Dernæst skal du aktivere SSL og HTTPS for dit websted. Dette forbedrer sikkerheden på dit websted gennem et SSL-certifikat.
Gå nu til DevKinsta-appen, og klik på knappen Åbn websted. En ny browserfane vil vise forsiden af dit WordPress-websted:
Dette er din WordPress-blog, hvor du kan begynde at skrive. Men for at gøre det muligt for Python at få adgang til og bruge WordPress REST API’et, skal vi først konfigurere WordPress Admin.
Klik nu på knappen WP Admin på DevKinsta-appen, og angiv derefter din bruger og password for at få adgang til WordPress Dashboardet:
Når du er logget ind, vil du se WordPress Dashboard:
WordPress bruger cookie-godkendelse som standardmetode. Men hvis du vil styre det ved hjælp af REST API’et, skal du autentificere dig med en teknik, der giver adgang til WordPress REST API’et.
Til dette skal du bruge Application Passwords. Disse er 24 tegn lange strenge, som WordPress genererer og knytter til en brugerprofil, der har tilladelse til at administrere dit websted.
Hvis du vil bruge Application Passwords, skal du klikke på Plugin-menuen på Dashboardet og derefter søge efter plugin’et med samme navn. Installer og aktivér derefter Plugin til programpasswords:
For at begynde at oprette din applikationspassword skal du starte med at udvide menuen Brugere og klikke på Alle brugere:
Klik nu på Rediger under dit admin-brugernavn:
Rul ned på siden Rediger bruger og find afsnittet Applikationspasswords. Her skal du angive et navn til Application Password, som du senere skal bruge til at autentificere dine Python-app-forespørgsler og forbruge REST API’et:
Klik på Tilføj ny programpassword, så WordPress kan generere en tilfældig password på 24 tegn til dig:
Derefter skal du kopiere denne adgangskode og gemme den et sikkert sted til senere brug. Husk, at du ikke vil kunne hente denne adgangskode, når du lukker denne side.
Til sidst skal du konfigurere permalinks. WordPress giver dig mulighed for at oprette en brugerdefineret URL-struktur for dine permalinks og arkiver. Lad os ændre det, så et WordPress-indlæg med titlen f.eks. “Dit første WordPress-websted” kan tilgås via den intuitive URL https://your-website.local:port/your-first-wordpress-website/. Denne fremgangsmåde giver flere fordele, herunder forbedret brugervenlighed og æstetik.
For at konfigurere permalinks skal du udvide afsnittet Indstillinger og klikke på menuen Permalinks. Her skal du ændre Fælles indstillinger til Indlægsnavn:
Det er også nødvendigt at indstille permalink-strukturen ved hjælp af Post name-strukturen, fordi det vil gøre det muligt for os at hente indlæg senere i vores Python-kode ved hjælp af JSON-formatet. Ellers vil der blive kastet en JSON-afkodningsfejl.
Sådan styrer du WordPress fra Python
WordPress er skrevet i PHP, men det har et REST API, der gør det muligt for andre programmeringssprog, websteder og apps at forbruge dets indhold. Eksponering af WordPress-indholdet i REST-arkitekturen gør det tilgængeligt i JSON-format. Derfor kan andre tjenester integrere med WordPress og udføre CRUD-operationer (create, read, update og delete) uden at kræve en lokal WordPress-installation.
Herefter skal du bygge en simpel Python-app for at se, hvordan du kan bruge WordPress REST API til at oprette, hente, opdatere og slette indlæg.
Opret en ny mappe til dit nye enkle Python-projekt, og navngiv det noget i retning af PythonWordPress
:
../PythonWordPress
Nu opretter du et virtuelt miljø for dit projekt, så det kan vedligeholde et uafhængigt sæt installerede Python-pakker, isolere dem fra dine systemmapper og undgå versionskonflikter. Opret et virtuelt miljø ved at udføre kommandoen venv
:
python3 -m venv .venv
Nu skal du køre en kommando for at aktivere det virtuelle .venv-miljø. Denne kommando varierer fra OS til OS:
- Windows
.venvScriptsactivate
- Mac/Linux
.venv/bin/activate
Derefter skal du gemme konfigurationen relateret til din WordPress-konto. For at adskille app-konfigurationen fra din Python-kode skal du oprette en .env-fil i din projektmappe og tilføje disse miljøvariabler til filen:
WEBSITE_URL="<>"
API_USERNAME="<>"
API_PASSWORD="<>"
Heldigvis er det nemt at læse ovenstående data fra en Python-app. Du kan installere pakken Python-dotenv, så din applikation kan læse konfigurationen fra .env-filen:
pip install python-dotenv
Derefter skal du installere aiohttp, en asynkron HTTP-klient/server til Python:
pip install aiohttp
Tilføj nu en fil med navnet app.py med følgende kode:
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())
Koden ovenfor viser en konsolmenu og beder dig om at indtaste et tal for at vælge en mulighed. Dernæst udvider du dette projekt og implementerer den kode, der gør det muligt at få vist alle indlæg og hente et bestemt indlæg ved hjælp af dets indlægs-id.
Hentning af indlæg i kode
For at interagere med WordPress REST API skal du oprette en ny Python-fil. Opret en fil med navnet wordpress_api_helper.py med følgende indhold:
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("=====================================")
Bemærk brugen af aiohttp-biblioteket ovenfor. Moderne sprog tilbyder syntaks og værktøjer, der muliggør asynkron programmering. Dette øger applikationens reaktionsevne ved at give programmet mulighed for at udføre opgaver sideløbende med operationer som webanmodninger, databaseoperationer og disk I/O. Python tilbyder asyncio som grundlag for sin asynkrone programmeringsramme, og aiohttp-biblioteket er bygget oven på asyncio for at give asynkron adgang til HTTP-klient/server-operationer udført i Python.
Funktionen ClientSession
ovenfor kører asynkront og returnerer et session
-objekt, som vores program bruger til at udføre en HTTP GET-operation mod /wp-json/wp/v2/posts
-slutpunktet. Den eneste forskel mellem en anmodning om at hente alle indlæg og en anmodning om et bestemt indlæg er, at denne sidste anmodning videregiver en post id
-parameter i URL-ruten: /wp-json/wp/v2/posts/{id}
.
Åbn nu filen app.py, og tilføj import
-anvisningen:
from wordpress_api_helper import get_all_posts, get_post
Ændr derefter funktionen main
til at kalde funktionerne get_all_posts
og 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)
Kør derefter programmet:
python app.py
Du får derefter vist programmenuen:
Prøv nu mulighed 1 for at få vist listen over indlæg, som din Python-app henter, og mulighed 2 for at vælge et indlæg:
Oprettelse af indlæg i kode
For at oprette et WordPress-indlæg i Python skal du begynde med at åbne filen wordpress_api_helper.py og tilføje funktionen 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}')
Denne kode kalder post
-funktionen i session
-objektet og sender auth
-parameteren ud over REST API-endpoint-URL’en. auth
-objektet indeholder nu WordPress-brugeren og det password, du oprettede ved hjælp af Application Passwords. Åbn nu filen app.py, og tilføj kode til at importere create_post
og menuen:
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'
}
Tilføj derefter en tredje menupunkt:
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}")
Derefter skal du køre appen og prøve mulighed 3, hvor du indsender en titel og et indhold for at oprette et nyt indlæg i WordPress:
Hvis du vælger mulighed 1 igen, returneres id og titlen på det nyligt tilføjede indlæg:
Du kan også åbne dit WordPress-websted for at se det nye indlæg:
Opdatering af indlæg i kode
Åbn filen wordpress_api_helper.py og tilføj funktionen 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}')
Åbn derefter filen app.py og tilføj kode til at importere update_post
og menuen:
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'
}
Tilføj derefter et fjerde menupunkt:
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}")
Kør derefter appen, og prøv mulighed 4, hvor du overfører et indlægs-id, en titel og et indhold for at opdatere et eksisterende indlæg.
Hvis du vælger mulighed 2 og overfører det opdaterede indlægs-id, får du detaljerne om det nyligt tilføjede indlæg tilbage:
Sletning af indlæg i kode
Du kan sende post id til REST API’et for at slette et indlæg.
Åbn filen wordpress_api_helper.py og tilføj funktionen 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.')
Åbn nu filen app.py, og tilføj kode til at importere delete_post
og menuen:
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',
}
Tilføj derefter et femte menupunkt:
elif option == 5:
print('Deleting a post...')
id = input_number('Enter the post id: ')
await delete_post(id)
Nu kører du appen og prøver valgmulighed 5, hvor du indsender et id for at slette det eksisterende indlæg i WordPress:
Bemærk: Det slettede indlæg kan stadig vises, hvis du kører indstillingen List Posts:
For at bekræfte, at du har slettet indlægget, skal du vente et par sekunder og prøve indstillingen List Posts igen. Og det var det!
Opsummering
Takket være WordPress REST API og Pythons HTTP-klientbiblioteker kan Python-apps og WordPress gå sammen og tale med hinanden. Fordelen ved REST API’et er, at det giver dig mulighed for at betjene WordPress eksternt fra en Python-app, hvor Pythons kraftfulde sprog muliggør automatiseret indholdsoprettelse, der følger din ønskede struktur og frekvens.
DevKinsta gør det hurtigt og nemt at oprette og udvikle et lokalt WordPress-websted. Det giver et lokalt miljø til udvikling af WordPress-temaer og plugins og tilbyder en forenklet implementeringsmodel takket være den Docker-baserede, selvstændige installationsmodel.
Hvad er din erfaring med at arbejde med Python og WordPress?
Når du er klar til at udvide denne erfaring, kan du læse The Complete Guide to WordPress REST API Basics for at udforske andre muligheder.
Skriv et svar