WordPress is in de loop der jaren het meest gebruikte content management systeem (CMS) geworden, niet in de laatste plaats dankzij zijn application programming interface (API). Met de WordPress REST API kan WordPress “praten” met andere applicaties die in verschillende talen zijn geschreven – waaronder Python.

Python is een uitbreidbare programmeertaal met diverse applicaties en een menselijk leesbare syntaxis, waardoor het een krachtige tool is voor het op afstand beheren van WordPress content.

Hier zijn enkele WordPress REST API use cases voor je apps en hoe je Python kunt gebruiken om ze te ondersteunen:

  • Gebruik voorgedefinieerde templates om je app in staat te stellen ruwe gegevens snel om te zetten in opgemaakte berichten met uitleg.
  • Bouw een back-office applicatie op Django en Python die gelimiteerde aanbiedingen aan je klanten toont telkens als er een object-specifieke korting of uitverkoopevent plaatsvindt.
  • Python scripts integreren om in je WordPress site te draaien.

Deze tutorial helpt je om een eenvoudige Python console-applicatie te maken die communiceert met en bewerkingen uitvoert op de WordPress REST API. De volledige projectcode is ook beschikbaar.

WordPress installeren en configureren

Laten we eerst een WordPress website lokaal installeren en draaien op je ontwikkelmachine. Dit is een uitstekende manier om met WordPress te beginnen, omdat je geen account hoeft aan te maken of een domeinnaam hoeft te kopen voor webhosting.

Voordat je WordPress lokaal installeert, moeten er enkele componenten op je computer draaien, waaronder de Apache webserver, een lokale database en de PHP taal waarin WordPress is geschreven.

Gelukkig kunnen we DevKinsta gebruiken, een gratis lokaal WordPress ontwikkelingspakket dat beschikbaar is voor alle grote OS’en (je hoeft geen klant van Kinsta te zijn om het te gebruiken).

DevKinsta is beschikbaar voor Windows, Mac en Linux, en installeert WordPress plus al zijn dependencies op je lokale machine.

Voordat je DevKinsta installeert, moet je Docker lokaal hebben draaien, dus download en installeer de Docker Engine als je dat nog niet hebt gedaan.

Na de installatie van Docker Desktop kun je automatisch het pakket downloaden dat bij jouw OS past.

Screenshot van de downloadpagina van DevKinsta.
DevKinsta installatiepagina.

Als je het DevKinsta installatieprogramma uitvoert, begint Docker onmiddellijk te initialiseren:

Het scherm dat DevKinsta Docker start.
DevKinsta start Docker lokaal.

Kies vervolgens New WordPress site in het menu Create new Site:

DevKinsta's Create New WordPress Site scherm.
DevKinsta’s Create New Site menu.

Nu vraagt het DevKinsta installatieprogramma je om de gegevens voor het WordPress adminaccount aan te maken:

Het scherm voor het maken van nieuwe WordPress site van DevKinsta.
DevKinsta toont het formulier Nieuwe WordPress site.

Eenmaal geïnstalleerd is DevKinsta een zelfstandige applicatie. Nu heb je toegang tot zowel de WordPress site (via de Open Site knop) als het WordPress admin dashboard (WP Admin knop).

DevKinsta's WordPress site infoscherm.
Het Site info paneel van DevKinsta.

Vervolgens moet je SSL en HTTPS inschakelen voor je website. Dit verbetert de veiligheid van je website door middel van een SSL certificaat.

DevKinsta's SSL en HTTPS optie inschakelen.
DevKinsta’s “SSL en HTTPS” optie.

Ga nu naar de DevKinsta app en klik op de knop Open site. Een nieuw browsertabblad toont de startpagina van je WordPress site:

De startpagina van je lokale WordPress site.
WordPress startpagina.

Dit is je WordPress blog, waar je kunt beginnen met schrijven. Maar om Python in staat te stellen de WordPress REST API te benaderen en te gebruiken, moeten we eerst de WordPress Admin configureren.

Klik nu op de knop WP Admin op de DevKinsta app en geef vervolgens je gebruiker en wachtwoord op om toegang te krijgen tot het WordPress Dashboard:

WordPress admindashboard inlogscherm.
WordPress inlogformulier.

Zodra je bent ingelogd, zie je WordPress Dashboard:

Welkom bij het WordPress adminscherm.
WordPress Dashboard pagina.

WordPress gebruikt cookie-authenticatie als standaardmethode. Maar als je het via de REST API wilt bedienen, moet je je authenticeren met een techniek die toegang verleent tot de WordPress REST API.

Hiervoor gebruik je Application Passwords. Dit zijn 24-karakter lange strings die WordPress genereert en associeert met een gebruikersprofiel dat toestemming heeft om je website te beheren.

Om Application Passwords te gebruiken, klik je op het Plugin menu op het Dashboard en zoek je vervolgens naar de plugin met dezelfde naam. Installeer en activeer dan de Application Passwords Plugin:

Wordpress Application Passwords plugin installeren en activeren.
Application Passwords plugin voor WordPress.

Om te beginnen met het aanmaken van je applicatiewachtwoord, begin je met het uitbreiden van het menu Users en klik je op All Users:

Uitgeklapt Users WordPress menu.
Uitgeklapt Users menu.

Klik nu op Edit onder je admin gebruikersnaam:

Klik op de knop "Edit" onder je WordPress gebruiker in het menu Users.
WP-Admin WordPress interface.

Scroll naar beneden op de pagina Edit User en vind de sectie Application Passwords. Geef hier een naam op voor het Application Password, dat je later zult gebruiken om je Python app verzoeken te authenticeren en de REST API te consumeren:

Application Passwords plugin dashboard.
Application Passwords pagina.

Klik op Add New Application Password zodat WordPress een willekeurig wachtwoord van 24 tekens voor je kan genereren:

Het nieuwe wachtwoord gegenereerd door de Application Passwords plugin.
New Application Password pagina.

Kopieer vervolgens dit wachtwoord en bewaar het op een veilige plaats om later te gebruiken. Onthoud dat je dit wachtwoord niet meer kunt opvragen zodra je deze pagina sluit.

Tot slot moet je permalinks configureren. Met WordPress kun je een aangepaste URL structuur maken voor je permalinks en archieven. Laten we het zo veranderen dat een WordPress bericht met de titel, bijvoorbeeld, “Your First WordPress Website” toegankelijk is via de intuïtieve URL https://your-website.local:port/your-first-wordpress-website/. Deze aanpak brengt verschillende voordelen met zich mee, waaronder verbeterde bruikbaarheid en esthetiek.

Om permalinks in te stellen, vouw je de sectie Settings uit en klik je op het menu Permalinks. Verander hier de Common Settings in Post name:

WordPress permalinkinstellingen wijzigen.

Het instellen van de permalink structuur met behulp van de Post name structuur is ook nodig omdat we dan later in onze Python code berichten kunnen ophalen met behulp van het JSON format. Anders wordt er een JSON decoderingsfout gegooid.

Zo bestuur je WordPress vanuit Python

WordPress is geschreven in PHP, maar het heeft een REST API waarmee andere programmeertalen, sites en apps de content ervan kunnen consumeren. Door de content van WordPress bloot te stellen in een REST architectuur is deze beschikbaar in JSON format. Daarom kunnen andere diensten integreren met WordPress en create, read, update en delete (CRUD) operaties uitvoeren zonder dat een lokale WordPress installatie nodig is.

Vervolgens bouw je een eenvoudige Python app om te zien hoe je de WordPress REST API kunt gebruiken om berichten te maken, op te halen, bij te werken en te verwijderen.

Maak een nieuwe map voor je nieuwe eenvoudige Python project en noem het iets als PythonWordPress:

../PythonWordPress

Nu ga je een virtuele omgeving maken voor je project, zodat het een onafhankelijke set geïnstalleerde Python pakketten kan onderhouden, waardoor ze worden geïsoleerd van je systeemmappen en versieconflicten worden vermeden. Creëer een virtuele omgeving door het commando venv uit te voeren:

python3 -m venv .venv

Voer nu een commando uit om de .venv virtuele omgeving te activeren. Dit commando verschilt per OS:

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

Sla vervolgens de configuratie met betrekking tot je WordPress account op. Om de appconfiguratie te scheiden van je Python code, maak je een .env bestand aan in je projectmap, en voeg je deze omgevingsvariabelen toe aan het bestand:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Gelukkig is het uitlezen van bovenstaande gegevens uit een Python app eenvoudig. Je kunt het Python-dotenv pakket installeren, zodat je applicatie de configuratie uit het .env bestand kan lezen:

pip install python-dotenv

Installeer vervolgens aiohttp, een asynchrone HTTP-client/server voor Python:

pip install aiohttp

Voeg nu een bestand toe met de naam app.py met de volgende code:

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

De bovenstaande code toont een consolemenu en vraagt je een getal in te voeren om een optie te kiezen. Vervolgens ga je dit project uitbreiden en de code implementeren waarmee je alle berichten kunt opsommen en een specifiek bericht kunt ophalen met behulp van zijn post-id.

Berichten ophalen in code

Voor interactie met WordPress REST API moet je een nieuw Python bestand maken. Maak een bestand met de naam wordpress_api_helper.py met de volgende content:

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

Let op het gebruik van de aiohttp library hierboven. Moderne talen bieden syntaxis en tools die asynchroon programmeren mogelijk maken. Dit verhoogt de responsiviteit van de applicatie door het programma taken te laten uitvoeren naast operaties zoals webverzoeken, databaseoperaties en schijf-I/O. Python biedt asyncio als basis voor zijn asynchroon programmeerframework, en de aiohttp library is gebouwd bovenop asyncio om asynchrone toegang te bieden tot HTTP Client/Server operaties die in Python worden uitgevoerd.

De bovenstaande ClientSession functie draait asynchroon en geeft een session object terug, dat ons programma gebruikt om een HTTP GET operatie uit te voeren tegen het /wp-json/wp/v2/posts eindpunt. Het enige verschil tussen een verzoek om alle berichten op te halen en een verzoek om een specifiek bericht is dat dit laatste verzoek een post id parameter doorgeeft in de URL route: /wp-json/wp/v2/posts/{id}.

Open nu het app.py bestand en voeg het import statement toe:

from wordpress_api_helper import get_all_posts, get_post

Wijzig vervolgens de functie main om de functies get_all_posts en get_post aan te roepen:

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)

Voer dan de app uit:

python app.py

Je ziet dan het applicatiemenu:

De Python app starten die is verbonden met WordPress.
Python applicatiemenu.

Probeer nu optie 1 om de lijst met berichten te bekijken die je Python app ophaalt, en optie 2 om een bericht te selecteren:

Probeer optie 1 om de lijst met berichten te bekijken die je Python app ophaalt, en optie 2 om een bericht te selecteren.
Python app die de berichtenlijst toont en een enkele door de gebruiker geselecteerde bericht.

Berichten aanmaken in code

Om een WordPress bericht in Python aan te maken, begin je met het openen van het wordpress_api_helper.py bestand en voeg je de create_post functie toe:

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

Deze code roept de post functie aan in het session object en geeft de auth parameter door naast de REST API endpoint URL. Het auth object bevat nu de WordPress gebruiker en het wachtwoord dat je hebt gemaakt met Application Passwords. Open nu het bestand app.py en voeg code toe om create_post en het menu te importeren:

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'

}

Voeg dan een derde menu optie toe:

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

Voer dan de app uit en probeer optie 3, het doorgeven van een titel en content om een nieuw bericht in WordPress te maken:

Een WordPress bericht maken met Python.
Python app die nieuw gemaakte WordPress bericht weergeeft.

Door opnieuw optie 1 te kiezen krijg je het id en de titel van het nieuw toegevoegde bericht terug:

De id en de titel van het nieuw toegevoegde bericht retourneren.
Python app die de titel en het id van het nieuwe bericht retourneert.

Je kunt ook je WordPress website openen om het nieuwe bericht te bekijken:

Het nieuw gemaakte bericht in de browser.
Browserafbeelding van het nieuwe WordPress bericht.

Berichten bijwerken in code

Open het bestand wordpress_api_helper.py en voeg de functie update_post toe:

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

Open dan het app.py bestand en voeg code toe om update_post en het menu te importeren:

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'

}

Voeg dan een vierde menu-optie toe:

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

Voer dan de app uit en probeer optie 4, waarbij je een post id, titel en content doorgeeft om een bestaand bericht bij te werken.

Een WordPress bericht bijwerken.
Python app die het bijgewerkte menu toont.

Door optie 2 te kiezen en het bijgewerkte post-id door te geven, krijg je de details van het nieuw toegevoegde bericht:

De details van het onlangs bijgewerkte bericht retourneren.
Python app die het bijgewerkte bericht toont.

Berichten verwijderen in code

Je kunt de bericht-id doorgeven aan de REST API om een bericht te verwijderen.

Open het bestand wordpress_api_helper.py en voeg de functie delete_post toe:

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.')

Open nu het app.py bestand en voeg code toe om delete_post en het menu te importeren:

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

}

Voeg dan een vijfde menu-optie toe:

elif option == 5:

print('Deleting a post...')

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

await delete_post(id)

Voer nu de app uit en probeer optie 5, waarbij je een id doorgeeft om het bestaande bericht in WordPress te verwijderen:

Een WordPress bericht verwijderen met de Python app.
Python app die het verwijderen van het geselecteerde bericht laat zien.

Opmerking: Het verwijderde bericht kan nog steeds verschijnen als je de optie List Posts uitvoert:

Python app die berichten toont.
Python app die oorspronkelijke berichtenlijst toont.

Om te bevestigen dat je het bericht hebt verwijderd, wacht je een paar seconden en probeer je de optie List Posts opnieuw. En dat is het!

Samenvatting

Dankzij de WordPress REST API en de HTTP client libraries van Python kunnen Python apps en WordPress samenwerken en met elkaar praten. Het voordeel van de REST API is dat je WordPress op afstand kunt bedienen vanuit een Python app, waarbij de krachtige taal van Python het mogelijk maakt om geautomatiseerd content te maken die de door jou gewenste structuur en frequentie volgt.

DevKinsta maakt het maken en ontwikkelen van een lokale WordPress site snel en eenvoudig. Het biedt een lokale omgeving voor het ontwikkelen van WordPress thema’s en plugins en biedt een vereenvoudigd deploymentmodel met dank aan zijn op Docker gebaseerde, op zichzelf staande installatiemodel.

Wat is jouw ervaring met het werken met Python en WordPress?

Als je klaar bent om die ervaring uit te breiden, kun je The Complete Guide to WordPress REST API Basics lezen om andere mogelijkheden te verkennen.

Salman Ravoof

Salman Ravoof is een autodidactische webdeveloper, schrijver, creator en een groot bewonderaar van Free and Open Source Software (FOSS). Naast techniek is hij enthousiast over wetenschap, filosofie, fotografie, kunst, katten en eten. Lees meer over hem op zijn website en kom in contact met Salman op X.