WordPress hat sich zum meistgenutzten Content Management System (CMS) entwickelt, was nicht zuletzt an seiner Programmierschnittstelle (API) liegt. Die WordPress REST API ermöglicht es WordPress, mit anderen Anwendungen zu kommunizieren, die in verschiedenen Sprachen geschrieben wurden – darunter auch Python.

Python ist eine erweiterbare Programmiersprache mit vielfältigen Einsatzmöglichkeiten und einer für Menschen lesbaren Syntax, was sie zu einem leistungsstarken Werkzeug für die Fernverwaltung von WordPress-Inhalten macht.

Hier sind einige Anwendungsfälle für die WordPress REST API und wie du Python zur Unterstützung deiner Anwendungen nutzen kannst:

  • Verwende vordefinierte Vorlagen, damit deine App Rohdaten schnell in formatierte Beiträge mit Erklärungen umwandeln kann.
  • Baue eine Back-Office-Anwendung auf Basis von Django und Python, die deinen Kunden zeitlich begrenzte Angebote anzeigt, sobald ein objektspezifischer Rabatt oder ein Verkaufsereignis eintritt.
  • Integriere Python-Skripte, die innerhalb deiner WordPress-Website laufen

Dieses Tutorial hilft dir, eine einfache Python-Konsolenanwendung zu erstellen, die mit der WordPress REST API kommuniziert und Operationen ausführt. Der vollständige Projektcode ist ebenfalls verfügbar.

Installieren und Konfigurieren von WordPress

Als Erstes installieren und betreiben wir eine WordPress-Website lokal auf deinem Entwicklungsrechner. Das ist eine gute Möglichkeit, um mit WordPress anzufangen, denn du musst weder ein Konto anlegen noch einen Domainnamen für das Webhosting kaufen.

Bevor du WordPress lokal installierst, müssen einige Komponenten auf deinem Computer laufen, darunter der Apache-Webserver, eine lokale Datenbank und die Sprache PHP, in der WordPress geschrieben ist.

Zum Glück können wir DevKinsta verwenden, eine kostenlose lokale WordPress-Entwicklungssuite, die für alle gängigen Betriebssysteme verfügbar ist (du musst kein Kinsta-Kunde sein, um sie zu nutzen).

DevKinsta ist für Windows, Mac und Linux erhältlich und installiert WordPress und alle seine Abhängigkeiten auf deinem lokalen Rechner.

Bevor du DevKinsta installierst, musst du Docker lokal ausführen. Lade also Docker Engine herunter und installiere es, falls du das noch nicht getan hast.

Nach der Installation von Docker Desktop kannst du automatisch das Paket herunterladen, das für dein Betriebssystem geeignet ist.

Screenshot der DevKinsta Installationsseite
DevKinsta Installationsseite

Wenn du das DevKinsta-Installationsprogramm ausführst, beginnt Docker sofort mit der Initialisierung:

DevKinsta's Startbildschirm für Docker
DevKinsta startet Docker lokal

Als Nächstes wählst du Neue WordPress-Site aus dem Menü Neue Site erstellen:

DevKinsta's Bildschirm zum Erstellen einer neuen WordPress Seite
DevKinsta’s Menü Neue Seite erstellen

Jetzt verlangt der DevKinsta-Installer, dass du die Anmeldedaten für das WordPress-Administratorkonto erstellst:

DevKinsta's neuer Bildschirm zur Erstellung von WordPress-Seiten
DevKinsta zeigt das Formular „Neue WordPress-Seite“ an

Einmal installiert, ist DevKinsta eine eigenständige Anwendung. Jetzt kannst du sowohl auf die WordPress-Site (über die Schaltfläche Site öffnen) als auch auf das WordPress-Admin-Dashboard (Schaltfläche WP Admin) zugreifen.

DevKinsta's WordPress Website Info Bildschirm
DevKinsta’s Site Info Panel

Als nächstes musst du SSL und HTTPS für deine Website aktivieren. Das verbessert die Sicherheit deiner Website durch ein SSL-Zertifikat.

Aktivieren der SSL- und HTTPS-Option von DevKinsta
DevKinsta’s „SSL and HTTPS“ Option

Gehe nun zur DevKinsta-App und klicke auf die Schaltfläche „Website öffnen „. In einem neuen Browser-Tab wird die Startseite deiner WordPress-Seite angezeigt:

Die Startseite deiner lokalen WordPress-Website
WordPress Startseite

Dies ist dein WordPress-Blog, in dem du mit dem Schreiben beginnen kannst. Aber damit Python auf die WordPress REST API zugreifen und sie nutzen kann, müssen wir zuerst den WordPress Admin konfigurieren.

Klicke in der DevKinsta-App auf die Schaltfläche WP Admin und gib dann deinen Benutzer und dein Passwort ein, um auf das WordPress-Dashboard zuzugreifen:

Anmeldebildschirm für das WordPress Admin-Dashboard
WordPress-Anmeldeformular

Sobald du eingeloggt bist, siehst du das WordPress Dashboard:

Willkommen im WordPress-Administrationsbereich
WordPress Dashboard Seite.

WordPress verwendet die Cookie-Authentifizierung als Standardmethode. Wenn du es aber über die REST-API steuern willst, musst du dich mit einer Technik authentifizieren, die den Zugriff auf die WordPress REST-API ermöglicht.

Dafür verwendest du Anwendungskennwörter. Das sind 24 Zeichen lange Zeichenketten, die WordPress generiert und mit einem Benutzerprofil verknüpft, das die Berechtigung hat, deine Website zu verwalten.

Um Anwendungskennwörter zu verwenden, klicke im Dashboard auf das Menü Plugin und suche dann nach dem gleichnamigen Plugin. Installiere und aktiviere dann das Application Passwords Plugin:

Installiere und aktiviere das WordPress Application Passwords Plugin
Application Passwords Plugin für WordPress

Um mit der Erstellung deines Bewerbungspassworts zu beginnen, öffne zunächst das Menü Benutzer und klicke auf Alle Benutzer:

Erweitertes Benutzermenü
Erweitertes Benutzermenü

Klicke jetzt auf Bearbeiten unter deinem Admin-Benutzernamen:

Klicke auf die Schaltfläche "Bearbeiten" unter deinem WordPress-Benutzer im Menü Benutzer.
WP-Admin WordPress-Oberfläche

Scrolle auf der Seite Benutzer bearbeiten nach unten und finde den Abschnitt Anwendungspasswörter. Hier gibst du einen Namen für das Anwendungskennwort ein, mit dem du später deine Python-App-Anfragen authentifizieren und die REST-API nutzen wirst:

Anwendung Passwörter Plugin Dashboard
Seite Anwendungskennwort

Klicke auf Neues Anwendungskennwort hinzufügen, damit WordPress ein zufälliges 24-stelliges Kennwort für dich generieren kann:

Das neue, vom Application Passwords Plugin generierte Passwort
Das neue, vom Application Passwords Plugin generierte Passwort

Kopiere dieses Passwort und speichere es an einem sicheren Ort, um es später zu verwenden. Vergiss nicht, dass du dieses Passwort nicht mehr abrufen kannst, sobald du diese Seite geschlossen hast.

Schließlich musst du noch Permalinks konfigurieren. WordPress ermöglicht es dir, eine eigene URL-Struktur für deine Permalinks und Archive zu erstellen. Ändern wir sie so, dass ein WordPress-Beitrag mit dem Titel z. B. „Deine erste WordPress-Website“ über die intuitive URL https://your-website.local:port/your-first-wordpress-website/ aufgerufen werden kann. Dieser Ansatz bringt mehrere Vorteile mit sich, unter anderem eine verbesserte Benutzerfreundlichkeit und Ästhetik.

Um Permalinks zu konfigurieren, erweiterst du den Bereich Einstellungen und klickst auf das Menü Permalinks. Hier änderst du die Allgemeinen Einstellungen in Postname:

Ändern der WordPress Permalink-Einstellungen

Die Einstellung der Permalink-Struktur mit der Postname-Struktur ist auch deshalb notwendig, weil wir so später in unserem Python-Code die Beiträge im JSON-Format abrufen können. Andernfalls wird ein JSON-Dekodierungsfehler ausgelöst.

Wie man WordPress von Python aus steuert

WordPress ist in PHP geschrieben, verfügt aber über eine REST-API, die es anderen Programmiersprachen, Websites und Anwendungen ermöglicht, seine Inhalte zu nutzen. Durch die Offenlegung der WordPress-Inhalte in der REST-Architektur werden diese im JSON-Format zur Verfügung gestellt. Daher können andere Dienste mit WordPress integriert werden und CRUD-Operationen (Erstellen, Lesen, Aktualisieren und Löschen) durchführen, ohne dass eine lokale WordPress-Installation erforderlich ist.

Als Nächstes wirst du eine einfache Python-Anwendung erstellen, um zu sehen, wie du die WordPress REST-API nutzen kannst, um Beiträge zu erstellen, abzurufen, zu aktualisieren und zu löschen.

Erstelle ein neues Verzeichnis für dein neues, einfaches Python-Projekt und nenne es z. B. PythonWordPress:

../PythonWordPress

Jetzt erstellst du eine virtuelle Umgebung für dein Projekt, damit es einen unabhängigen Satz von installierten Python-Paketen beibehält, die von deinen Systemverzeichnissen isoliert sind und Versionskonflikte vermieden werden. Erstelle eine virtuelle Umgebung, indem du den Befehl venv ausführst:

python3 -m venv .venv

Führe nun einen Befehl aus, um die virtuelle Umgebung .venv zu aktivieren. Dieser Befehl variiert je nach Betriebssystem:

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

Als Nächstes speicherst du die Konfiguration für dein WordPress-Konto. Um die Konfiguration der App von deinem Python-Code zu trennen, erstelle eine .env-Datei in deinem Projektverzeichnis und füge diese Umgebungsvariablen zu der Datei hinzu:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Zum Glück ist es einfach, die oben genannten Daten aus einer Python-App auszulesen. Du kannst das Paket Python-dotenv installieren, damit deine Anwendung die Konfiguration aus der .env-Datei lesen kann:

pip install python-dotenv

Installiere dann aiohttp, einen asynchronen HTTP-Client/Server für Python:

pip install aiohttp

Füge nun eine Datei namens app.py mit folgendem Code hinzu:

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

Der obige Code zeigt ein Konsolenmenü an und fordert dich auf, eine Zahl einzugeben, um eine Option auszuwählen. Als Nächstes erweiterst du dieses Projekt und implementierst den Code, der es dir ermöglicht, alle Beiträge aufzulisten und einen bestimmten Beitrag anhand seiner Beitragsnummer abzurufen.

Beiträge im Code abrufen

Um mit der WordPress REST API zu interagieren, musst du eine neue Python-Datei erstellen. Erstelle eine Datei namens wordpress_api_helper.py mit folgendem Inhalt:

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

Beachte die Verwendung der aiohttp-Bibliothek oben. Moderne Sprachen bieten eine Syntax und Werkzeuge, die asynchrone Programmierung ermöglichen. Das erhöht die Reaktionsfähigkeit der Anwendung, indem das Programm Aufgaben parallel zu Operationen wie Webanfragen, Datenbankoperationen und Festplatten-E/A ausführen kann. Python bietet asyncio als Grundlage für sein asynchrones Programmierframework, und die aiohttp-Bibliothek baut auf asyncio auf, um asynchronen Zugriff auf HTTP-Client/Server-Operationen in Python zu ermöglichen.

Die obige Funktion ClientSession wird asynchron ausgeführt und gibt ein session Objekt zurück, das unser Programm verwendet, um eine HTTP-GET-Operation gegen den Endpunkt /wp-json/wp/v2/posts durchzuführen. Der einzige Unterschied zwischen einer Anfrage zum Abrufen aller Beiträge und einer Anfrage für einen bestimmten Beitrag besteht darin, dass bei letzterer Anfrage ein post id Parameter in der URL-Route übergeben wird: /wp-json/wp/v2/posts/{id}.

Öffne nun die Datei app.py und füge die Anweisung import hinzu:

from wordpress_api_helper import get_all_posts, get_post

Als nächstes änderst du die Funktion main, um die Funktionen get_all_posts und get_post aufzurufen:

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)

Starte dann die App:

python app.py

Du siehst dann das Anwendungsmenü:

Starte die Python-App, die mit WordPress verbunden ist
Python-Anwendungsmenü

Probiere nun Option 1 aus, um die Liste der Beiträge zu sehen, die deine Python-Anwendung abruft, und Option 2, um einen Beitrag auszuwählen:

Probiere Option 1 aus, um die Liste der Beiträge zu sehen, die deine Python-App abruft, und Option 2, um einen Beitrag auszuwählen
Python-App zeigt die Beitragsliste und einen einzelnen, vom Benutzer ausgewählten Beitrag

Posts im Code erstellen

Um einen WordPress-Beitrag in Python zu erstellen, öffnest du zunächst die Datei wordpress_api_helper.py und fügst die Funktion create_post hinzu:

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

Dieser Code ruft die Funktion post im Objekt session auf und übergibt den Parameter auth neben der URL des REST-API-Endpunkts. Das auth Objekt enthält nun den WordPress-Benutzer und das Passwort, das du mit Application Passwords erstellt hast. Öffne nun die Datei app.py und füge Code hinzu, um create_post und das Menü zu importieren:

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'

}

Füge dann eine dritte Menüoption hinzu:

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

Starte die App und probiere Option 3 aus, indem du einen Titel und einen Inhalt angibst, um einen neuen Beitrag in WordPress zu erstellen:

Einen WordPress-Beitrag mit Python erstellen.
Python-App zeigt neu erstellten WordPress-Beitrag an

Wählst du wieder Option 1, erhältst du die ID und den Titel des neu erstellten Beitrags:

Python-App gibt den Titel und die ID des neuen Beitrags zurück
Python-App gibt den Titel und die ID des neuen Beitrags zurück

Du kannst auch deine WordPress-Website öffnen, um den neuen Beitrag zu sehen:

Der neu erstellte Beitrag im Browser
Der neu erstellte Beitrag im Browser

Posts im Code aktualisieren

Öffne die Datei wordpress_api_helper.py und füge die Funktion update_post hinzu:

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

Öffne dann die Datei app.py und füge Code hinzu, um update_post und das Menü zu importieren:

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'

}

Füge dann eine vierte Menüoption hinzu:

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

Starte dann die App und probiere Option 4 aus, indem du eine Beitrags-ID, einen Titel und einen Inhalt angibst, um einen bestehenden Beitrag zu aktualisieren.

Einen WordPress-Beitrag aktualisieren
Python-App zeigt das aktualisierte Menü

Wenn du Option 2 wählst und die aktualisierte Beitrags-ID übergibst, erhältst du die Details des neu hinzugefügten Beitrags:

Rücksendung der Details des neu aktualisierten Beitrags
Python-App zeigt den aktualisierten Beitrag an

Löschen von Beiträgen im Code

Um einen Beitrag zu löschen, kannst du die Beitrags-ID an die REST-API übergeben.

Öffne die Datei wordpress_api_helper.py und füge die Funktion delete_post hinzu:

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

Öffne nun die Datei app.py und füge Code hinzu, um delete_post und das Menü zu importieren:

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

}

Füge dann eine fünfte Menüoption hinzu:

elif option == 5:

print('Deleting a post...')

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

await delete_post(id)

Starte nun die App und probiere Option 5 aus, indem du eine ID angibst, um den bestehenden Beitrag in WordPress zu löschen:

Löschen eines WordPress-Posts mit der Python-App
Python-App zeigt die Löschung des ausgewählten Beitrags an

Hinweis: Der gelöschte Beitrag kann immer noch angezeigt werden, wenn du die Option Beiträge auflisten ausführst:

Python-App listet Beiträge auf
Python-App zeigt die ursprüngliche Beitragsliste

Um zu bestätigen, dass du den Beitrag gelöscht hast, warte ein paar Sekunden und versuche die Option Beiträge auflisten erneut. Und das war’s!

Zusammenfassung

Dank der WordPress REST API und den HTTP-Client-Bibliotheken von Python können Python-Anwendungen und WordPress miteinander kommunizieren. Der Vorteil der REST-API ist, dass du WordPress von einer Python-App aus bedienen kannst. Die mächtige Sprache Python ermöglicht die automatische Erstellung von Inhalten, die deiner gewünschten Struktur und Häufigkeit folgen.

DevKinsta macht die Erstellung und Entwicklung einer lokalen WordPress-Website schnell und einfach. DevKinsta bietet eine lokale Umgebung für die Entwicklung von WordPress-Themes und -Plugins und ein vereinfachtes Bereitstellungsmodell dank des Docker-basierten, in sich geschlossenen Installationsmodells.

Welche Erfahrungen hast du bei der Arbeit mit Python und WordPress gemacht?

Wenn du diese Erfahrungen erweitern möchtest, kannst du The Complete Guide to WordPress REST API Basics lesen, um weitere Möglichkeiten zu erkunden.

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.