Polissez vos côtelettes Python en connectant votre application à WordPress
Publié: 2022-10-18WordPress est devenu le système de gestion de contenu (CMS) le plus utilisé grâce en grande partie à son interface de programmation d'application (API). L'API REST de WordPress permet à WordPress de « parler » avec d'autres applications écrites dans différents langages, y compris Python.
Python est un langage de programmation extensible avec diverses utilisations et une syntaxe lisible par l'homme, ce qui en fait un outil puissant pour gérer à distance le contenu WordPress.
Voici quelques cas d'utilisation de l'API REST WordPress pour vos applications et comment vous pouvez utiliser Python pour les prendre en charge :
- Utilisez des modèles prédéfinis pour permettre à votre application de transformer rapidement des données brutes en messages formatés avec des explications.
- Créez une application de back-office sur Django et Python qui affiche des offres à durée limitée à vos clients chaque fois qu'une remise ou un événement de vente spécifique à un objet se produit.
- Intégrez des scripts Python à exécuter dans votre site WordPress
Ce didacticiel vous aidera à créer une application console Python simple qui communique et exécute des opérations sur l'API WordPress REST. Le code complet du projet est également disponible.
Installation et configuration de WordPress
Tout d'abord, installons et exécutons un site Web WordPress localement sur votre machine de développement. C'est un excellent moyen de démarrer avec WordPress puisque vous n'avez pas besoin de créer un compte ou d'acheter un nom de domaine pour l'hébergement Web.
Avant d'installer WordPress localement, certains composants doivent s'exécuter sur votre ordinateur, notamment le serveur Web Apache, une base de données locale et le langage PHP dans lequel WordPress est écrit.
Heureusement, nous pouvons utiliser DevKinsta, une suite de développement WordPress locale gratuite disponible pour tous les principaux systèmes d'exploitation (vous n'avez pas besoin d'être un client Kinsta pour l'utiliser).
DevKinsta est disponible pour Windows, Mac et Linux, et installe WordPress ainsi que toutes ses dépendances sur votre machine locale.
Avant d'installer DevKinsta, vous devez avoir Docker en cours d'exécution localement, alors téléchargez et installez le Docker Engine si vous ne l'avez pas encore fait.
Après avoir installé Docker Desktop, vous pouvez télécharger automatiquement le package correspondant à votre système d'exploitation.
Lorsque vous exécutez le programme d'installation de DevKinsta, Docker démarre immédiatement l'initialisation :
Ensuite, choisissez Nouveau site WordPress dans le menu Créer un nouveau site :
Maintenant, le programme d'installation de DevKinsta vous demande de créer les informations d'identification pour le compte administrateur WordPress :
Une fois installé, DevKinsta est une application autonome. Vous pouvez désormais accéder à la fois au site WordPress (via le bouton Ouvrir le site ) et au tableau de bord d'administration de WordPress (bouton WP Admin ).
Ensuite, vous devez activer SSL et HTTPS pour votre site Web. Cela améliore la sécurité de votre site Web grâce à un certificat SSL.
Allez maintenant dans l'application DevKinsta et cliquez sur le bouton Ouvrir le site . Un nouvel onglet de navigateur affichera la page d'accueil de votre site WordPress :
Ceci est votre blog WordPress, où vous pouvez commencer à écrire. Mais pour permettre à Python d'accéder et d'utiliser l'API WordPress REST, nous devons d'abord configurer l'administrateur WordPress.
Cliquez maintenant sur le bouton WP Admin sur l'application DevKinsta, puis fournissez votre utilisateur et votre mot de passe pour accéder au tableau de bord WordPress :
Une fois connecté, vous verrez WordPress Dashboard :
WordPress utilise l'authentification par cookie comme méthode standard. Mais si vous souhaitez le contrôler à l'aide de l'API REST, vous devez vous authentifier avec une technique qui accorde l'accès à l'API REST de WordPress.
Pour cela, vous utiliserez les mots de passe d'application. Ce sont des chaînes longues de 24 caractères que WordPress génère et associe à un profil utilisateur autorisé à gérer votre site Web.
Pour utiliser les mots de passe d'application, cliquez sur le menu Plugin sur le tableau de bord, puis recherchez le plugin portant le même nom. Ensuite, installez et activez le plugin Application Passwords :
Pour commencer à créer votre mot de passe d'application, commencez par développer le menu Utilisateurs et cliquez sur Tous les utilisateurs :
Maintenant, cliquez sur Modifier sous votre nom d'utilisateur administrateur :
Faites défiler la page Modifier l'utilisateur et recherchez la section Mots de passe d'application . Ici, fournissez un nom pour le mot de passe d'application, que vous utiliserez plus tard pour authentifier vos requêtes d'application Python et utiliser l'API REST :
Cliquez sur Ajouter un nouveau mot de passe d'application pour que WordPress puisse générer un mot de passe aléatoire de 24 caractères pour vous :
Ensuite, copiez ce mot de passe et enregistrez-le dans un endroit sûr pour l'utiliser plus tard. N'oubliez pas que vous ne pourrez pas récupérer ce mot de passe une fois que vous aurez fermé cette page.
Enfin, vous devez configurer les permaliens. WordPress vous permet de créer une structure d'URL personnalisée pour vos permaliens et vos archives. Modifions-le pour qu'un article WordPress intitulé, par exemple, "Votre premier site Web WordPress" soit accessible via l'URL intuitive https://your-website.local:port/your-first-wordpress-website/. Cette approche apporte plusieurs avantages, notamment une convivialité et une esthétique améliorées.
Pour configurer les permaliens, développez la section Paramètres et cliquez sur le menu Permaliens . Ici, changez les paramètres communs en nom de publication :

La définition de la structure du permalien à l'aide de la structure du nom de la publication est également nécessaire car elle nous permettra de récupérer les publications ultérieurement dans notre code Python en utilisant le format JSON. Sinon, une erreur de décodage JSON sera générée.
Comment contrôler WordPress à partir de Python
WordPress est écrit en PHP, mais il possède une API REST qui permet à d'autres langages de programmation, sites et applications de consommer son contenu. L'exposition du contenu WordPress dans l'architecture REST le rend disponible au format JSON. Par conséquent, d'autres services peuvent s'intégrer à WordPress et effectuer des opérations de création, lecture, mise à jour et suppression (CRUD) sans nécessiter une installation WordPress locale.
Ensuite, vous allez créer une application Python simple pour voir comment vous pouvez utiliser l'API REST de WordPress pour créer, récupérer, mettre à jour et supprimer des publications.
Créez un nouveau répertoire pour votre nouveau projet Python simple et nommez-le quelque chose comme PythonWordPress
:
../PythonWordPress
Maintenant, vous allez créer un environnement virtuel pour votre projet, lui permettant de maintenir un ensemble indépendant de packages Python installés, en les isolant de vos répertoires système et en évitant les conflits de versions. Créez un environnement virtuel en exécutant la commande venv
:
python3 -m venv .venv
Maintenant, exécutez une commande pour activer l'environnement virtuel .venv . Cette commande varie selon le système d'exploitation :
- Windows :
.venvScriptsactivate
- Mac/Linux :
.venv/bin/activate
Ensuite, stockez la configuration liée à votre compte WordPress. Pour séparer la configuration de l'application de votre code Python, créez un fichier .env dans le répertoire de votre projet et ajoutez ces variables d'environnement au fichier :
WEBSITE_URL="<>" API_USERNAME="<>" API_PASSWORD="<>"
Heureusement, la lecture des données ci-dessus à partir d'une application Python est facile. Vous pouvez installer le package Python-dotenv pour que votre application puisse lire la configuration à partir du fichier .env :
pip install python-dotenv
Ensuite, installez aiohttp , un client/serveur HTTP asynchrone pour Python :
pip install aiohttp
Ajoutez maintenant un fichier nommé app.py avec le code suivant :

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())
Le code ci-dessus affiche un menu de console et vous demande d'entrer un nombre pour choisir une option. Ensuite, vous allez développer ce projet et implémenter le code qui vous permet de répertorier toutes les publications et de récupérer une publication spécifique à l'aide de son identifiant de publication.
Récupération des publications dans le code
Pour interagir avec l'API REST de WordPress, vous devez créer un nouveau fichier Python. Créez un fichier nommé wordpress_api_helper.py avec le contenu suivant :
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("=====================================")
Remarquez l'utilisation de la bibliothèque aiohttp ci-dessus. Les langages modernes fournissent une syntaxe et des outils qui permettent la programmation asynchrone. Cela augmente la réactivité de l'application en permettant au programme d'effectuer des tâches parallèlement à des opérations telles que les requêtes Web, les opérations de base de données et les E/S de disque. Python propose asyncio comme base de son cadre de programmation asynchrone, et la bibliothèque aiohttp est construite sur asyncio pour apporter un accès asynchrone aux opérations client/serveur HTTP réalisées en Python.
La fonction ClientSession
ci-dessus s'exécute de manière asynchrone et renvoie un objet de session
, que notre programme utilise pour effectuer une opération HTTP GET sur le point de terminaison /wp-json/wp/v2/posts
. La seule différence entre une requête pour récupérer tous les messages et une requête pour un message spécifique est que cette dernière requête passe un paramètre post id
dans la route URL : /wp-json/wp/v2/posts/{id}
.
Maintenant, ouvrez le fichier app.py et ajoutez l'instruction import
:
from wordpress_api_helper import get_all_posts, get_post
Ensuite, modifiez la fonction main
pour appeler les fonctions get_all_posts
et 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)
Exécutez ensuite l'application :
python app.py
Vous verrez alors le menu de l'application :
Essayez maintenant l'option 1 pour afficher la liste des publications que votre application Python récupère, et l'option 2 pour sélectionner une publication :
Créer des messages dans le code
Pour créer un article WordPress en Python, commencez par ouvrir le fichier wordpress_api_helper.py et ajoutez la fonction 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}')
Ce code appelle la fonction post
dans l'objet de session
, en transmettant le paramètre auth
à côté de l'URL du point de terminaison de l'API REST. L'objet auth
contient maintenant l'utilisateur WordPress et le mot de passe que vous avez créé à l'aide des mots de passe d'application. Maintenant, ouvrez le fichier app.py et ajoutez le code pour importer create_post
et le menu :
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' }
Ajoutez ensuite une troisième option de menu :
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}")
Ensuite, lancez l'application et essayez l'option 3, en passant un titre et un contenu pour créer un nouveau post dans WordPress :
Choisir à nouveau l'option 1 renverra l'identifiant et le titre du message nouvellement ajouté :
Vous pouvez également ouvrir votre site Web WordPress pour afficher le nouveau message :
Mise à jour des messages dans le code
Ouvrez le fichier wordpress_api_helper.py et ajoutez la fonction 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}')
Ouvrez ensuite le fichier app.py et ajoutez le code pour importer update_post
et le menu :
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' }
Ensuite, ajoutez une quatrième option de menu :
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}")
Exécutez ensuite l'application et essayez l'option 4, en transmettant un identifiant de publication, un titre et un contenu pour mettre à jour une publication existante.
Choisir l'option 2 et transmettre l'identifiant de publication mis à jour renverra les détails de la publication nouvellement ajoutée :
Suppression de publications dans le code
Vous pouvez transmettre l'identifiant de publication à l'API REST pour supprimer une publication.
Ouvrez le fichier wordpress_api_helper.py et ajoutez la fonction 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.')
Ouvrez maintenant le fichier app.py et ajoutez le code pour importer delete_post
et le menu :
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', }
Ensuite, ajoutez une cinquième option de menu :
elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)
Exécutez maintenant l'application et essayez l'option 5, en transmettant un identifiant pour supprimer la publication existante dans WordPress :
Remarque : La publication supprimée peut toujours apparaître si vous exécutez l'option Liste des publications :
Pour confirmer que vous avez supprimé le message, attendez quelques secondes et essayez à nouveau l'option Lister les messages . Et c'est tout!
Sommaire
Grâce à l'API REST de WordPress et aux bibliothèques clientes HTTP de Python, les applications Python et WordPress peuvent s'associer et se parler. L'avantage de l'API REST est qu'elle vous permet d'utiliser WordPress à distance à partir d'une application Python, où le langage puissant de Python permet la création automatisée de contenu qui suit la structure et la fréquence souhaitées.
DevKinsta rend la création et le développement d'un site WordPress local rapide et facile. Il fournit un environnement local pour développer des thèmes et des plugins WordPress et offre un modèle de déploiement simplifié grâce à son modèle d'installation autonome basé sur Docker.
Quelle est votre expérience de travail avec Python et WordPress ?
Lorsque vous êtes prêt à développer cette expérience, vous pouvez lire Le guide complet des bases de l'API REST WordPress pour explorer d'autres possibilités.