Polieren Sie Ihre Python Chops auf, indem Sie Ihre App mit WordPress verbinden

Veröffentlicht: 2022-10-18

WordPress ist nicht zuletzt aufgrund seiner Anwendungsprogrammierschnittstelle (API) zum am häufigsten verwendeten Content-Management-System (CMS) geworden. Die WordPress-REST-API ermöglicht es WordPress, mit anderen Anwendungen zu „sprechen“, die in verschiedenen Sprachen geschrieben sind – einschließlich Python.

Python ist eine erweiterbare Programmiersprache mit vielfältigen Verwendungsmö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 WordPress-REST-API-Anwendungsfälle für Ihre Apps und wie Sie Python verwenden können, um sie zu unterstützen:

  • Verwenden Sie vordefinierte Vorlagen, damit Ihre App Rohdaten schnell in formatierte Posts mit Erläuterungen umwandeln kann.
  • Erstellen Sie eine Backoffice-Anwendung auf Django und Python, die Ihren Kunden zeitlich begrenzte Angebote jedes Mal anzeigt, wenn ein objektspezifischer Rabatt oder ein Verkaufsereignis stattfindet.
  • Integrieren Sie Python-Skripte, um sie innerhalb Ihrer WordPress-Site auszuführen

Dieses Tutorial hilft Ihnen beim Erstellen einer einfachen Python-Konsolenanwendung, die mit der WordPress-REST-API kommuniziert und Operationen auf ihr ausführt. Der vollständige Projektcode ist ebenfalls verfügbar.


Installation und Konfiguration von WordPress

Lassen Sie uns zunächst eine WordPress-Website lokal auf Ihrem Entwicklungscomputer installieren und ausführen. Dies ist eine hervorragende Möglichkeit, mit WordPress zu beginnen, da Sie kein Konto erstellen oder einen Domainnamen für das Webhosting kaufen müssen.

Vor der lokalen Installation von WordPress müssen einige Komponenten auf Ihrem Computer ausgeführt werden, darunter der Apache-Webserver, eine lokale Datenbank und die PHP-Sprache, in der WordPress geschrieben ist.

Glücklicherweise können wir DevKinsta verwenden, eine kostenlose lokale WordPress-Entwicklungssuite, die für alle wichtigen Betriebssysteme verfügbar ist (Sie müssen kein Kinsta-Kunde sein, um sie zu verwenden).

DevKinsta ist für Windows, Mac und Linux verfügbar und installiert WordPress sowie alle seine Abhängigkeiten auf Ihrem lokalen Computer.

Vor der Installation von DevKinsta muss Docker lokal ausgeführt werden, also laden Sie die Docker Engine herunter und installieren Sie sie, falls Sie dies noch nicht getan haben.

Nach der Installation von Docker Desktop können Sie automatisch das Paket herunterladen, das zu Ihrem Betriebssystem passt.

Screenshot der Download-Seite von DevKinsta.
DevKinsta-Installationsseite.

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

Docker-Startbildschirm von DevKinsta.
DevKinsta startet Docker lokal.

Wählen Sie als Nächstes Neue WordPress-Site aus dem Menü Neue Site erstellen :

DevKinstas Bildschirm zum Erstellen einer neuen WordPress-Site.
DevKinstas Menü „Neue Website erstellen“.

Jetzt fordert Sie das DevKinsta-Installationsprogramm auf, die Anmeldeinformationen für das WordPress-Administratorkonto zu erstellen:

DevKinstas neuer WordPress-Site-Erstellungsbildschirm.
DevKinsta zeigt das neue WordPress-Site-Formular an.

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

DevKinstas WordPress-Site-Info-Bildschirm.
Website-Info-Panel von DevKinsta.

Als nächstes müssen Sie SSL und HTTPS für Ihre Website aktivieren. Dies verbessert die Sicherheit Ihrer Website durch ein SSL-Zertifikat.

Aktivierung der SSL- und HTTPS-Option von DevKinsta.
DevKinstas Option „SSL und HTTPS“.

Gehen Sie nun zur DevKinsta-App und klicken Sie auf die Schaltfläche Website öffnen . Ein neuer Browser-Tab zeigt die Startseite Ihrer WordPress-Site an:

Die Startseite Ihrer lokalen WordPress-Site.
WordPress-Startseite.

Dies ist Ihr WordPress-Blog, in dem Sie mit dem Schreiben beginnen können. Damit Python jedoch auf die WordPress-REST-API zugreifen und diese verwenden kann, müssen wir zuerst den WordPress-Admin konfigurieren.

Klicken Sie nun auf die Schaltfläche WP Admin in der DevKinsta-App und geben Sie dann Ihren Benutzernamen und Ihr Passwort ein, um auf das WordPress-Dashboard zuzugreifen:

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

Sobald Sie angemeldet sind, sehen Sie das WordPress-Dashboard :

Willkommen auf dem WordPress-Admin-Bildschirm.
WordPress-Dashboard-Seite.

WordPress verwendet die Cookie-Authentifizierung als Standardmethode. Wenn Sie es jedoch über die REST-API steuern möchten, müssen Sie sich mit einer Technik authentifizieren, die Zugriff auf die WordPress-REST-API gewährt.

Dazu verwenden Sie Anwendungspasswörter. Dies sind 24 Zeichen lange Zeichenfolgen, die WordPress generiert und einem Benutzerprofil zuordnet, das die Berechtigung zum Verwalten Ihrer Website hat.

Um Anwendungspasswörter zu verwenden, klicken Sie auf das Plug -in-Menü im Dashboard und suchen Sie dann nach dem Plug-in mit demselben Namen. Installieren und aktivieren Sie dann das Application Passwords Plugin:

Installieren und Aktivieren des WordPress Application Passwords-Plugins.
Application Passwords-Plugin für WordPress.

Um mit der Erstellung Ihres Anwendungskennworts zu beginnen, erweitern Sie zunächst das Menü Benutzer und klicken Sie auf Alle Benutzer :

Erweitertes Benutzer-WordPress-Menü.
Erweitertes Benutzermenü.

Klicken Sie nun unter Ihrem Admin-Benutzernamen auf Bearbeiten :

Klicken Sie im Benutzermenü unter Ihrem WordPress-Benutzer auf die Schaltfläche „Bearbeiten“.
WP-Admin WordPress-Oberfläche.

Scrollen Sie auf der Seite „ Benutzer bearbeiten “ nach unten und suchen Sie den Abschnitt „ Anwendungskennwörter “. Geben Sie hier einen Namen für das Anwendungspasswort ein, das Sie später verwenden, um Ihre Python-App-Anfragen zu authentifizieren und die REST-API zu nutzen:

Anwendungspasswort-Plugin-Dashboard.
Seite Anwendungskennwort.

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

Das neue Passwort, das vom Application Passwords-Plugin generiert wird.
Seite „Neues Anwendungskennwort“.

Kopieren Sie als nächstes dieses Passwort und speichern Sie es an einem sicheren Ort, um es später zu verwenden. Denken Sie daran, dass Sie dieses Passwort nicht mehr abrufen können, wenn Sie diese Seite schließen.

Schließlich müssen Sie Permalinks konfigurieren. Mit WordPress können Sie eine benutzerdefinierte URL-Struktur für Ihre Permalinks und Archive erstellen. Ändern wir es so, dass ein WordPress-Beitrag mit dem Titel „Ihre erste WordPress-Website“ über die intuitive URL https://ihre-website.local:port/ihre-erste-wordpress-website/ aufgerufen werden kann. Dieser Ansatz bringt mehrere Vorteile mit sich, einschließlich einer verbesserten Benutzerfreundlichkeit und Ästhetik.

Um Permalinks zu konfigurieren, erweitern Sie den Abschnitt Einstellungen und klicken Sie auf das Menü Permalinks . Ändern Sie hier die allgemeinen Einstellungen in Beitragsname :

Ändern der WordPress-Permalink-Einstellungen.

Das Festlegen der Permalink-Struktur mithilfe der Post-Namensstruktur ist ebenfalls erforderlich, da wir damit Posts später in unserem Python-Code mithilfe des JSON-Formats abrufen können. Andernfalls wird ein JSON-Decodierungsfehler ausgegeben.

So steuern Sie WordPress von Python aus

WordPress ist in PHP geschrieben, verfügt jedoch über eine REST-API, die es anderen Programmiersprachen, Websites und Apps ermöglicht, seine Inhalte zu nutzen. Die Bereitstellung des WordPress-Inhalts in der REST-Architektur macht ihn im JSON-Format verfügbar. Daher können andere Dienste in WordPress integriert werden und CRUD-Vorgänge (Create, Read, Update and Delete) ausführen, ohne dass eine lokale WordPress-Installation erforderlich ist.

Als Nächstes erstellen Sie eine einfache Python-App, um zu sehen, wie Sie mit der WordPress-REST-API Beiträge erstellen, abrufen, aktualisieren und löschen können.

Erstellen Sie ein neues Verzeichnis für Ihr neues einfaches Python-Projekt und nennen Sie es etwa PythonWordPress :

 ../PythonWordPress

Jetzt erstellen Sie eine virtuelle Umgebung für Ihr Projekt, die es ihm ermöglicht, einen unabhängigen Satz installierter Python-Pakete zu verwalten, sie von Ihren Systemverzeichnissen zu isolieren und Versionskonflikte zu vermeiden. Erstellen Sie eine virtuelle Umgebung, indem Sie den Befehl venv ausführen:

 python3 -m venv .venv

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

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

Speichern Sie als Nächstes die Konfiguration für Ihr WordPress-Konto. Um die App-Konfiguration von Ihrem Python-Code zu trennen, erstellen Sie eine .env -Datei in Ihrem Projektverzeichnis und fügen Sie diese Umgebungsvariablen zur Datei hinzu:

 WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"

Glücklicherweise ist das Lesen der obigen Daten aus einer Python-App einfach. Sie können das Python-dotenv- Paket installieren, damit Ihre Anwendung die Konfiguration aus der .env -Datei lesen kann:

 pip install python-dotenv

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

 pip install aiohttp

Fügen Sie nun eine Datei namens app.py mit dem folgenden 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 Sie auf, eine Zahl einzugeben, um eine Option auszuwählen. Als Nächstes erweitern Sie dieses Projekt und implementieren den Code, mit dem Sie alle Beiträge auflisten und einen bestimmten Beitrag anhand seiner Beitrags-ID abrufen können.

Abrufen von Beiträgen im Code

Um mit der WordPress-REST-API zu interagieren, müssen Sie eine neue Python-Datei erstellen. Erstellen Sie 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("=====================================")

Beachten Sie die obige Verwendung der aiohttp- Bibliothek. Moderne Sprachen bieten Syntax und Tools, die eine asynchrone Programmierung ermöglichen. Dies erhöht die Reaktionsfähigkeit der Anwendung, indem es dem Programm ermöglicht wird, Aufgaben neben Operationen wie Webanforderungen, Datenbankoperationen und Festplatten-E/A auszuführen. Python bietet asyncio als Grundlage für sein asynchrones Programmierframework, und die aiohttp-Bibliothek baut auf asyncio auf, um asynchronen Zugriff auf in Python durchgeführte HTTP-Client/Server-Operationen zu ermöglichen.

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

Öffnen Sie nun die Datei app.py und fügen Sie die import -Anweisung hinzu:

 from wordpress_api_helper import get_all_posts, get_post

Ändern Sie als Nächstes die main , um die Funktionen get_all_posts und 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)

Führen Sie dann die App aus:

 python app.py

Sie sehen dann das Anwendungsmenü:

Starten der mit WordPress verbundenen Python-App.
Python-Anwendungsmenü.

Versuchen Sie nun Option 1, um die Liste der Beiträge anzuzeigen, die Ihre Python-App abruft, und Option 2, um einen Beitrag auszuwählen:

Probieren Sie Option 1 aus, um die Liste der Beiträge anzuzeigen, die Ihre Python-App abruft, und Option 2, um einen Beitrag auszuwählen.
Python-App, die die Beitragsliste und einen einzelnen vom Benutzer ausgewählten Beitrag anzeigt.

Beiträge im Code erstellen

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

Kämpfen Sie mit Ausfallzeiten und WordPress-Problemen? Kinsta ist die Hosting-Lösung, die entwickelt wurde, um dir Zeit zu sparen! Schauen Sie sich unsere Funktionen an
 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 post -Funktion im session auf und übergibt den auth -Parameter neben der REST-API-Endpunkt-URL. Das auth Objekt enthält nun den WordPress-Benutzer und das Passwort, das Sie mit Application Passwords erstellt haben. Öffnen Sie nun die Datei app.py und fügen Sie 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ügen Sie 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}")

Führen Sie dann die App aus und versuchen Sie Option 3, indem Sie einen Titel und Inhalt übergeben, um einen neuen Beitrag in WordPress zu erstellen:

Erstellen eines WordPress-Beitrags mit Python.
Python-App zeigt neu erstellten WordPress-Beitrag an.

Wenn Sie Option 1 erneut wählen, werden die ID und der Titel des neu hinzugefügten Beitrags zurückgegeben:

Zurückgeben der ID und des Titels des neu hinzugefügten Beitrags.
Python-App, die den Titel und die ID des neuen Beitrags zurückgibt.

Sie können auch Ihre WordPress-Website öffnen, um den neuen Beitrag anzuzeigen:

Der neu erstellte Beitrag im Browser.
Browser-Bild des neuen WordPress-Beitrags.

Aktualisieren von Beiträgen im Code

Öffnen Sie die Datei wordpress_api_helper.py und fügen Sie 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}')

Öffnen Sie dann die Datei app.py und fügen Sie 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ügen Sie 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}")

Führen Sie dann die App aus und probieren Sie Option 4 aus, indem Sie eine Beitrags-ID, einen Titel und einen Inhalt übergeben, um einen vorhandenen Beitrag zu aktualisieren.

Aktualisieren eines WordPress-Beitrags.
Python-App mit dem aktualisierten Menü.

Wenn Sie Option 2 wählen und die aktualisierte Beitrags-ID übergeben, werden die Details des neu hinzugefügten Beitrags zurückgegeben:

Zurückgeben der Details des neu aktualisierten Beitrags.
Python-App, die den aktualisierten Beitrag anzeigt.

Beiträge im Code löschen

Sie können die Beitrags-ID an die REST-API übergeben, um einen Beitrag zu löschen.

Öffnen Sie die Datei wordpress_api_helper.py und fügen Sie 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.')

Öffnen Sie nun die Datei app.py und fügen Sie 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ügen Sie 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)

Führen Sie nun die App aus und versuchen Sie Option 5, indem Sie eine ID übergeben, um den vorhandenen Beitrag in WordPress zu löschen:

Löschen eines WordPress-Beitrags mit der Python-App.
Python-App, die das Löschen des ausgewählten Beitrags anzeigt.

Hinweis: Der gelöschte Beitrag wird möglicherweise weiterhin angezeigt, wenn Sie die Option „ Beiträge auflisten“ ausführen:

Python-App-Auflistungsbeiträge.
Python-App mit ursprünglicher Beitragsliste.

Um zu bestätigen, dass Sie den Beitrag gelöscht haben, warten Sie einige Sekunden und versuchen Sie es erneut mit der Option „ Beiträge auflisten“. Und das ist es!

Zusammenfassung

Dank der WordPress-REST-API und der HTTP-Client-Bibliotheken von Python können Python-Apps und WordPress zusammenarbeiten und miteinander kommunizieren. Der Vorteil der REST-API besteht darin, dass Sie WordPress von einer Python-App aus fernbedienen können, wobei die leistungsstarke Sprache von Python eine automatisierte Inhaltserstellung ermöglicht, die Ihrer gewünschten Struktur und Häufigkeit folgt.

DevKinsta macht das Erstellen und Entwickeln einer lokalen WordPress-Seite schnell und einfach. Es bietet eine lokale Umgebung für die Entwicklung von WordPress-Designs und -Plug-ins und bietet dank seines Docker-basierten, eigenständigen Installationsmodells ein vereinfachtes Bereitstellungsmodell.

Welche Erfahrungen haben Sie mit Python und WordPress gemacht?

Wenn Sie bereit sind, diese Erfahrung zu erweitern, können Sie The Complete Guide to WordPress REST API Basics lesen, um andere Möglichkeiten zu erkunden.