WordPress har blivit det mest använda systemet för innehållshantering (CMS), vilket till stor del beror på dess gränssnitt för tillämpningsprogrammering (API). WordPress REST API gör det möjligt för WordPress att ”prata” med andra applikationer som är skrivna i olika språk – inklusive Python.

Python är ett utbyggbart programmeringsspråk med olika användningsområden och en syntax som är lättläst för människor, vilket gör det till ett kraftfullt verktyg för fjärrhantering av WordPress-innehåll.

Här är några WordPress REST API-användningsområden för dina appar och en beskrivning om hur du kan använda Python för att stödja dem:

  • Använd fördefinierade mallar så att din app snabbt kan omvandla rådata till formaterade inlägg med förklaringar.
  • Bygg en backoffice-applikation på Django och Python som visar tidsbegränsade erbjudanden till dina kunder varje gång som en objektspecifik rabatt eller försäljningshändelse inträffar.
  • Integrera Python-skript som körs inuti din WordPress-webbplats

Den här handledningen hjälper dig att skapa en enkel Python-konsolapplikation som kommunicerar med och utför operationer på WordPress REST API. Den fullständiga projektkoden finns också tillgänglig.

Installera och konfigurera WordPress

Låt oss först installera och köra en WordPress-webbplats lokalt på din utvecklingsmaskin. Detta är ett utmärkt sätt att börja med WordPress eftersom du inte behöver skapa ett konto eller köpa ett domännamn för hosting.

Innan du installerar WordPress lokalt så krävs det att vissa komponenter körs på din dator, bland annat Apache-webbservern, en lokal databas och PHP-språket som WordPress är skrivet i.

Som tur är så kan vi använda DevKinsta, ett kostnadsfritt lokalt utvecklingspaket för WordPress som finns tillgängligt för alla större operativsystem (du behöver inte vara Kinsta-kund för att använda det).

DevKinsta finns för Windows, Mac och Linux och installerar WordPress plus alla dess beroenden på din lokala maskin.

Innan du installerar DevKinsta så måste du ha Docker igång lokalt, så ladda ner och installera Docker Engine om du ännu inte har gjort detta.

När du har installerat Docker Desktop så kan du automatiskt hämta det paket som passar ditt operativsystem.

DevKinsta's installationssida.
DevKinsta’s installationssida.

När du kör DevKinsta-installationsprogrammet så börjar Docker initieras omedelbart:

DevKinsta startar Docker lokalt.
DevKinsta startar Docker lokalt.

Därefter så väljer du Ny WordPress-webbplats i menyn Skapa ny webbplats:

DevKinsta's meny Skapa ny webbplats.
DevKinsta’s meny Skapa ny webbplats.

Nu kräver DevKinsta’s installationsprogram att du skapar autentiseringsuppgifter för WordPress-administratörskontot:

DevKinsta visar formuläret för en ny WordPress-webbplats.
DevKinsta visar formuläret för en ny WordPress-webbplats.

När DevKinsta väl är installerat så är det en fristående applikation. Nu kan du få tillgång till både WordPress-webbplatsen (via knappen Öppna webbplats ) och WordPress-administratörspanelen (knappen WP Admin).

DevKinsta's webbplatsinformationspanel.
DevKinsta’s webbplatsinformationspanel.

Därefter så måste du aktivera SSL och HTTPS för din webbplats. Detta förbättrar säkerheten på din webbplats genom ett SSL-certifikat.

DevKinsta's alternativ
DevKinsta’s alternativ ”SSL och HTTPS”.

Gå nu till DevKinsta-appen och klicka på knappen Öppna webbplats. En ny webbläsarflik visar startsidan för din WordPress-webbplats:

WordPress-hemsida.
WordPress-hemsida.

Det här är din WordPress-blogg, där du kan börja skriva. Men för att Python ska kunna få tillgång till och använda WordPress REST API så måste vi först konfigurera WordPress Admin.
Klicka nu på knappen WP Admin i DevKinsta-appen och ange sedan din användare och ditt lösenord för att få tillgång till WordPress-instrumentpanelen:

WordPress-inloggningsformulär.
WordPress-inloggningsformulär.

När du är inloggad så ser du WordPress-instrumentpanelen:

Sida för WordPress-instrumentpanelen.
Sida för WordPress-instrumentpanelen.

WordPress använder cookieautentisering som standardmetod. Men om du vill styra den med hjälp av REST API så måste du autentisera dig med en teknik som ger tillgång till WordPress REST API.
För detta så använder du applikationslösenord. Dessa är 24 tecken långa strängar som WordPress genererar och associerar med en användarprofil som har behörighet att hantera din webbplats.
För att använda Applikationslösenord så klickar du på Plugin-menyn på instrumentpanelen och söker sedan efter pluginet med samma namn. Installera och aktivera sedan pluginet Application Password:

Pluginet Application Passwords för WordPress.
Pluginet Application Passwords för WordPress.

För att börja med skapandet av ditt applikationslösenord så expanderar du menyn Användare och klickar på Alla användare:

Utökad meny för användare.
Utökad meny för användare.

Klicka nu på Redigera under ditt administratörsanvändarnamn:

WP-Admin WordPress-gränssnitt.
WP-Admin WordPress-gränssnitt.

Scrolla ner på sidan Redigera användare och hitta avsnittet Applikationslösenord. Här anger du ett namn för applikationslösenordet, som du senare kommer att använda för att autentisera dina Python-appförfrågningar och använda REST API:

Sidan för Application Password.
Sidan för Application Password.

Klicka på Lägg till nytt applikationslösenord så att WordPress kan generera ett slumpmässigt lösenord med 24 tecken åt dig:

Sidan för nytt applikationslösenord.
Sidan för nytt applikationslösenord.

Därefter så kopierar du lösenordet och sparar det på en säker plats för att kunna använda det senare. Kom ihåg att du inte kommer att kunna hämta lösenordet när du stänger den här sidan.

Slutligen så måste du konfigurera permalänkar. WordPress låter dig skapa en anpassad webbadress-struktur för dina permalänkar och arkiv. Låt oss ändra på den så att ett WordPress-inlägg med titeln ”Din första WordPress-webbplats” kan nås via den intuitiva webbadressen https://your-website.local:port/your-first-wordpress-website/. Det här tillvägagångssättet erbjuder flera fördelar, bland annat en förbättrad användbarhet och estetik.

För att konfigurera permalänkar så expanderar du avsnittet Inställningar och klickar på menyn Permalänkar. Här ändrar du Gemensamma inställningar till Inläggsnamn:

Ändra inställningar för WordPress permalänkar.
Ändra inställningar för WordPress permalänkar.

Det är även nödvändigt att ställa in permalänkstrukturen med hjälp av Inläggsnamn-strukturen eftersom det gör det möjligt för oss att hämta inlägg senare i vår Python-kod med hjälp av JSON-formatet. Annars så kommer det att uppstå ett JSON-avkodningsfel.

Hur man styr WordPress från Python

WordPress är skrivet i PHP, men har ett REST API som gör det möjligt för andra programmeringsspråk, webbplatser och appar att konsumera dess innehåll. Exponering av WordPress-innehållet i REST-arkitektur gör det tillgängligt i JSON-format. Tack vare detta så kan andra tjänster integreras med WordPress och utföra CRUD-operationer (skapa, läsa, uppdatera och radera) utan att kräva en lokal WordPress-installation.
Därefter ska du bygga en enkel Python-app för att se hur du kan använda WordPress REST API för att skapa, hämta, uppdatera och radera inlägg.
Skapa en ny katalog för ditt nya enkla Pythonprojekt och namnge det något i stil med PythonWordPress:

../PythonWordPress

Nu ska du skapa en virtuell miljö för ditt projekt, så att det kan upprätthålla en oberoende uppsättning av installerade Python-paket, isolera dem från dina systemkataloger och undvika versionskonflikter. Skapa en virtuell miljö genom att utföra kommandot venv:

python3 -m venv .venv

Kör nu ett kommando för att aktivera den virtuella miljön .venv. Detta kommando varierar beroende på operativsystem:

  • Windows .venvScriptsactivate
  • Mac/Linux .venv/bin/activate

Därefter så lagrar du konfigurationen för ditt WordPress-konto. För att separera appkonfigurationen från din Pythonkod så skapar du en .env-fil i din projektkatalog och lägger till dessa miljövariabler i filen:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Det är lyckligtvis enkelt att läsa ovanstående data från en Python-app. Du kan installera paketet Python-dotenv så att din applikation kan läsa konfigurationen från .env-filen:

pip install python-dotenv

Installera sedan aiohttp, en asynkron HTTP-klient/server för Python:

pip install aiohttp

Lägg nu till en fil som heter app.py med följande kod:

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 ovan visar en konsolmeny och ber dig att ange ett nummer för att välja ett alternativ. Därefter så utökar du det här projektet och implementerar koden som gör att du kan lista alla inlägg och hämta ett specifikt inlägg med hjälp av dess inläggs-ID.

Hämta inlägg i kod

För att interagera med WordPress REST API så måste du skapa en ny Python-fil. Skapa en fil som heter wordpress_api_helper.py med följande innehåll:

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("=====================================")

Lägg märke till användningen av aiohttp-biblioteket ovan. Moderna språk tillhandahåller syntax och verktyg som möjliggör asynkron programmering. Detta ökar applikationens reaktionsförmåga genom att applikationen kan utföra uppgifter vid sidan av operationer som exempelvis webbförfrågningar, databasoperationer och disk I/O. Python erbjuder asyncio som en grund för sitt ramverk för asynkron programmering, och biblioteket aiohttp byggs ovanpå asyncio för att ge asynkron åtkomst till HTTP-klient/server-operationer som utförs i Python.

Funktionen ClientSession ovan körs asynkront och returnerar ett session -objekt, som vår applikation använder för att utföra en HTTP GET-operation mot /wp-json/wp/v2/posts -slutpunkten. Den enda skillnaden mellan en begäran om att hämta alla inlägg och en begäran om ett specifikt inlägg är att det sistnämnda begärandet skickar en post id -parameter i webbadress-sökvägen: /wp-json/wp/v2/posts/{id}.
Öppna nu filen app.py och lägg till import -angivelsen:

from wordpress_api_helper import get_all_posts, get_post

Ändra sedan funktionen main så att den anropar funktionerna get_all_posts och 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 sedan applikationen:

python app.py

Du kommer att se applikationsmenyn:

Python's applikationsmeny.
Python’s applikationsmeny.

Prova nu alternativ 1 för att visa listan över inlägg som din Python-app hämtar och alternativ 2 för att välja ett inlägg:

Python-appen visar listan med inlägg och ett enskilt inlägg som användaren har valt.
Python-appen visar listan med inlägg och ett enskilt inlägg som användaren har valt.

 

Skapa inlägg i kod

För att skapa ett WordPress-inlägg i Python så börjar du med att öppna filen wordpress_api_helper.py och lägga till 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}')

Den här koden anropar funktionen post i objektet session och skickar parametern auth bredvid webbadressen för REST API-slutpunkten. Objektet auth inkluderar nu WordPress-användaren och lösenordet som du skapade med hjälp av Application Passwords. Öppna nu filen app.py och lägg till kod för att importera create_post och menyn:

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'

}

Lägg sedan till ett tredje menyalternativ:

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}")

Kör sedan appen och prova alternativ 3, genom att skicka en titel och ett innehåll för att skapa ett nytt inlägg i WordPress:

Python-appen visar ett nyskapat inlägg i WordPress.
Python-appen visar ett nyskapat inlägg i WordPress.

Om du väljer alternativ 1 igen så returneras id och titeln för det nytillkomna inlägget:

Python-appen returnerar det nya inläggets titel och id.
Python-appen returnerar det nya inläggets titel och id.

Du kan även öppna din WordPress-webbplats för att se det nya inlägget:

Webbläsarbild av det nya WordPress-inlägget.
Webbläsarbild av det nya WordPress-inlägget.

Uppdatering av inlägg i kod

Öppna filen wordpress_api_helper.py och lägg till 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}')

Öppna sedan filen app.py och lägg till kod för att importera update_post och menyn:

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'

}

Lägg sedan till ett fjärde menyalternativ:

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 sedan appen och prova alternativ 4, genom att skicka ett inläggs-ID, en titel och ett innehåll för att uppdatera ett befintligt inlägg.

Python-appen visar den uppdaterade menyn.
Python-appen visar den uppdaterade menyn.

Om du väljer alternativ 2 och lämnar över uppdaterat post-ID så kommer du att få information om det nytillkomna inlägget:

Python-appen visar det uppdaterade inlägget.
Python-appen visar det uppdaterade inlägget.

 

Radera inlägg i kod

Du kan skicka Post ID till REST API för att ta bort ett inlägg.
Öppna filen wordpress_api_helper.py och lägg till 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.')

Öppna nu filen app.py och lägg till kod för att importera delete_post och menyn:

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',

}

Lägg sedan till ett femte menyalternativ:

elif option == 5:

print('Deleting a post...')

id = input_number('Enter the post id: ')

await delete_post(id)

Nu kör du appen och provar alternativ 5, där du anger ett ID för att ta bort det befintliga inlägget i WordPress:

Python-appen som visar radering av det valda inlägget.
Python-appen som visar radering av det valda inlägget.

Obs: Det borttagna inlägget kan fortfarande visas om du kör alternativet List Posts:

Python-appen visar den ursprungliga listan över inlägg.
Python-appen visar den ursprungliga listan över inlägg.

För att bekräfta att du har raderat inlägget så väntar du några sekunder och provar alternativet List Posts igen. Sen är du klar!

Sammanfattning

Tack vare WordPress REST API och Pythons HTTP-klientbibliotek så kan Python-appar och WordPress samarbeta och prata med varandra. Fördelen med REST API:et är att du kan styra WordPress på distans från en Python-app. Pythons kraftfulla språk möjliggör ett automatiserat innehållsskapande som följer din önskade struktur och frekvens.

DevKinsta gör det snabbt och enkelt att skapa och utveckla en lokal WordPress-webbplats. Den tillhandahåller en lokal miljö för utveckling av WordPress-teman och -plugins och erbjuder en förenklad distribueringsmodell tack vare sin Docker-baserade, fristående installationsmodell.

Vad har du för erfarenhet av att arbeta med Python och WordPress?

När du är redo att utöka den erfarenheten så kan du läsa Den kompletta guiden till grunderna i WordPress REST API  för att utforska andra möjligheter.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.