Polissez vos côtelettes Python en connectant votre application à WordPress

Publié: 2022-10-18

WordPress 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.

Capture d'écran de la page de téléchargement de DevKinsta.
Page d'installation de DevKinsta.

Lorsque vous exécutez le programme d'installation de DevKinsta, Docker démarre immédiatement l'initialisation :

L'écran Docker de démarrage de DevKinsta.
DevKinsta démarre Docker localement.

Ensuite, choisissez Nouveau site WordPress dans le menu Créer un nouveau site :

DevKinsta crée un nouvel écran de site WordPress.
Le menu Créer un nouveau site de DevKinsta.

Maintenant, le programme d'installation de DevKinsta vous demande de créer les informations d'identification pour le compte administrateur WordPress :

Le nouvel écran de création de site WordPress de DevKinsta.
DevKinsta affichant le formulaire Nouveau site 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 ).

Écran d'informations sur le site WordPress de DevKinsta.
Le panneau d'informations du site de DevKinsta.

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.

Activation de l'option SSL et HTTPS de DevKinsta.
L'option "SSL et HTTPS" de DevKinsta.

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 :

La page d'accueil de votre site WordPress local.
Page d'accueil 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 :

Écran de connexion au tableau de bord de l'administrateur WordPress.
Formulaire de connexion WordPress.

Une fois connecté, vous verrez WordPress Dashboard :

Bienvenue sur l'écran d'administration de WordPress.
Page de tableau de bord WordPress.

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 :

Installation et activation du plugin WordPress Application Passwords.
Plugin de mots de passe d'application pour WordPress.

Pour commencer à créer votre mot de passe d'application, commencez par développer le menu Utilisateurs et cliquez sur Tous les utilisateurs :

Menu WordPress Utilisateurs étendu.
Menu Utilisateurs développé.

Maintenant, cliquez sur Modifier sous votre nom d'utilisateur administrateur :

Cliquez sur le bouton "Modifier" sous votre utilisateur WordPress dans le menu Utilisateurs.
Interface WordPress WP-Admin.

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 :

Tableau de bord du plugin Application Passwords.
Page Mot de passe de l'application.

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 :

Le nouveau mot de passe généré par le plugin Application Passwords.
Nouvelle page de mot de passe d'application.

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 :

Modification des paramètres de permaliens WordPress.

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 :

Démarrage de l'application Python connectée à WordPress.
Menu des applications Python.

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 :

Essayez 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.
Application Python affichant la liste des publications et une seule publication sélectionnée par l'utilisateur.

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 :

Aux prises avec des temps d'arrêt et des problèmes WordPress ? Kinsta est la solution d'hébergement conçue pour vous faire gagner du temps ! Découvrez nos fonctionnalités
 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 :

Création d'un article WordPress avec Python.
Application Python affichant la publication WordPress nouvellement créée.

Choisir à nouveau l'option 1 renverra l'identifiant et le titre du message nouvellement ajouté :

Renvoie l'identifiant et le titre du message nouvellement ajouté.
Application Python renvoyant le titre et l'identifiant du nouveau message.

Vous pouvez également ouvrir votre site Web WordPress pour afficher le nouveau message :

La publication nouvellement créée dans le navigateur.
Image du navigateur du nouveau post WordPress.

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.

Mise à jour d'un article WordPress.
Application Python affichant le menu mis à jour.

Choisir l'option 2 et transmettre l'identifiant de publication mis à jour renverra les détails de la publication nouvellement ajoutée :

Renvoyer les détails du message nouvellement mis à jour.
Application Python affichant la publication mise à jour.

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 :

Suppression d'un article WordPress avec l'application Python.
Application Python montrant la suppression du message sélectionné.

Remarque : La publication supprimée peut toujours apparaître si vous exécutez l'option Liste des publications :

Application Python répertoriant les publications.
Application Python affichant la liste des publications d'origine.

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.