WordPress est devenu le système de gestion de contenu (Content Manager System ou CMS) le plus utilisé, en grande partie grâce à son interface de programmation d’applications (Application Programming Interface ou API). L’API REST de WordPress permet à WordPress de « parler » avec d’autres applications écrites dans divers langages – y compris Python.

Python est un langage de programmation extensible aux usages variés et à la syntaxe lisible par l’homme, ce qui en fait un outil puissant pour gérer à distance le contenu de WordPress.

Voici quelques cas d’utilisation de l’API REST de WordPress pour vos applications et comment vous pouvez utiliser Python pour les prendre en charge :

  • Utiliser des modèles prédéfinis pour permettre à votre application de transformer rapidement des données brutes en articles formatés accompagnés d’explications.
  • Construire 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égrer des scripts Python à exécuter à l’intérieur de votre site WordPress

Ce tutoriel vous aidera à créer une application console Python simple qui communique avec l’API REST de WordPress et exécute des opérations sur celle-ci. Le code complet du projet est également disponible.

Installation et configuration de WordPress

Tout d’abord, installons et exécutons un site web WordPress en local sur votre machine de développement. C’est une excellente façon de commencer avec WordPress puisque vous n’avez pas besoin de créer un compte ou d’acheter un nom de domaine pour l’hébergement.

Avant d’installer WordPress localement, certains composants doivent fonctionner 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 gratuite de développement local de WordPress disponible pour tous les principaux systèmes d’exploitation (vous n’avez pas besoin d’être client de Kinsta pour l’utiliser).

DevKinsta est disponible pour Windows, Mac et Linux, et installe WordPress et toutes ses dépendances sur votre machine locale.

Avant d’installer DevKinsta, vous devez avoir Docker en cours d’exécution localement, donc téléchargez et installez le moteur Docker si vous ne l’avez pas encore fait.

Après avoir installé Docker Desktop, vous pouvez télécharger automatiquement le paquet qui correspond à votre système d’exploitation.

Page d'installation de DevKinsta.
Page d’installation de DevKinsta.

Lorsque vous exécutez le programme d’installation de DevKinsta, Docker commence immédiatement à s’initialiser :

DevKinsta démarre Docker localement.
DevKinsta démarre Docker localement.

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

Le menu Créer un nouveau site de DevKinsta.
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 d’administration de WordPress :

DevKinsta affichant le formulaire de Nouveau site WordPress.
DevKinsta affichant le formulaire de Nouveau site WordPress.

Une fois installé, DevKinsta est une application autonome. Vous pouvez maintenant 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).

Le panneau d'information du site de DevKinsta.
Le panneau d’information 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.

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 du navigateur affichera la page d’accueil de votre site WordPress :

Page d'accueil de WordPress.
Page d’accueil de WordPress.

Ceci est votre blog WordPress, où vous pouvez commencer à écrire. Mais pour permettre à Python d’accéder et d’utiliser l’API REST de WordPress, nous devons d’abord configurer l’administration de WordPress.

Cliquez maintenant sur le bouton WP Admin de l’application DevKinsta, puis fournissez votre identifiant et votre mot de passe pour accéder au tableau de bord de WordPress :

Formulaire de connexion de WordPress.
Formulaire de connexion de WordPress.

Une fois que vous êtes connecté, vous verrez le tableau de bord de WordPress :

Page du tableau de bord de WordPress.
Page du tableau de bord de WordPress.

WordPress utilise l’authentification par cookie comme méthode standard. Mais si vous voulez le contrôler à l’aide de l’API REST, vous devez vous authentifier avec une technique qui donne accès à l’API REST de WordPress.

Pour cela, vous utiliserez des mots de passe d’application. Il s’agit de chaînes de 24 caractères que WordPress génère et associe à un profil d’utilisateur qui a la permission de gérer votre site web.

Pour utiliser Application Passwords, cliquez sur le menu Extensions dans le tableau de bord, puis recherchez l’extension du même nom. Ensuite, installez et activez l’extension Application Passwords :

Extension Application Passwords pour WordPress.
Extension Application Passwords pour WordPress.

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

Menu Comptes étendu.
Menu Comptes étendu.

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

Interface WordPress WP-Admin.
Interface WordPress WP-Admin.

Faites défiler la page Modifier le compte et trouvez la section Mots de passe de l’application. Ici, fournissez un nom pour le mot de passe d’application, que vous utiliserez plus tard pour authentifier les requêtes de votre application Python et consommer l’API REST :

Page Application Password.
Page Application Password.

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 :

Page Nouveau mot de passe d'application.
Page Nouveau 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 URL personnalisée pour vos permaliens et vos archives. Modifions-la pour qu’un article de WordPress intitulé, par exemple, « Votre premier site web WordPress » soit accessible par l’URL intuitive https://your-website.local:port/votre-premier-site-web-wordpress/. Cette approche présente plusieurs avantages, notamment une amélioration de la convivialité et de l’esthétique.

Pour configurer les permaliens, développez la section Réglages et cliquez sur le menu Permaliens . Ici, changez les Réglages les plus courants en Titre de la publication :

Changing WordPress permalink settings.

La configuration de la structure des permaliens à l’aide de la structure Titre de la publication est également nécessaire car elle nous permettra de récupérer les articles plus tard 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 depuis 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 de 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 (Create Read Update Delete ou CRUD) sans avoir besoin d’une installation locale de WordPress.

Ensuite, vous construirez 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 articles.

Créez un nouveau répertoire pour votre nouveau projet Python simple et nommez-le comme PythonWordPress :

../PythonWordPress

Maintenant, vous allez créer un environnement virtuel pour votre projet, lui permettant de maintenir un ensemble indépendant de paquets Python installés, les isolant de vos répertoires système et évitant les conflits de version. Créez un environnement virtuel en exécutant la commande venv :

python3 -m venv .venv

Exécutez maintenant 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, il est facile de lire les données ci-dessus à partir d’une application Python. Vous pouvez installer le paquetage Python-dotenv afin que votre application puisse lire la configuration 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 de saisir un nombre pour choisir une option. Ensuite, vous allez développer ce projet et implémenter le code qui vous permet de lister tous les articles et de récupérer un article spécifique en utilisant son identifiant.

Récupération des articles 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 comme les requêtes web, les opérations de base de données et les E/S de disque. Python offre asyncio comme base pour son cadre de programmation asynchrone, et la bibliothèque aiohttp est construite au-dessus d’ asyncio pour apporter un accès asynchrone aux opérations client/serveur HTTP effectuées en Python.

La fonction ClientSession ci-dessus s’exécute de manière asynchrone et renvoie un objet session, que notre programme utilise pour effectuer une opération HTTP GET contre le point de terminaison /wp-json/wp/v2/posts. La seule différence entre une requête pour récupérer tous les articles et une requête pour un article 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)

Puis exécutez l’application :

python app.py

Vous verrez alors le menu de l’application :

Menu de l'application Python.
Menu de l’application Python.

Essayez maintenant l’option 1 pour afficher la liste des articles que votre application Python récupère, et l’option 2 pour sélectionner un article :

Application Python montrant la liste des articles et un seul article sélectionné par l'utilisateur.
Application Python montrant la liste des articles et un seul article sélectionné par l’utilisateur.

Création d’articles avec du 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 session, en passant 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 de Application Passwords. Maintenant, ouvrez le fichier app.py et ajoutez du 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'

}

Puis ajoutez 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, exécutez l’application et essayez l’option 3, en passant un titre et un contenu pour créer un nouvel article dans WordPress :

Python affichant un article WordPress nouvellement créé.
Python affichant un article WordPress nouvellement créé.

En choisissant à nouveau l’option 1, vous obtiendrez l’identifiant et le titre de l’article nouvellement ajouté :

Python retournant le titre et l'id du nouvel article.
Python retournant le titre et l’id du nouvel article.

Vous pouvez également ouvrir votre site web WordPress pour afficher le nouvel article :

Image du navigateur du nouvel article WordPress.
Image du navigateur du nouvel article WordPress.

Mise à jour des articles avec du 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}")

Ensuite, exécutez l’application et essayez l’option 4, en passant un id d’article, un titre et un contenu pour mettre à jour un article existant.

Application Python montrant le menu mis à jour.
Application Python montrant le menu mis à jour.

En choisissant l’option 2 et en passant l’id de l’article mis à jour, vous obtiendrez les détails de l’article nouvellement ajouté :

Application Python montrant l'article mis à jour.
Application Python montrant l’article mis à jour.

Suppression d’articles avec du code

Vous pouvez passer l’identifiant de l’article à l’API REST pour supprimer un article.

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 passant un id pour supprimer l’article existant dans WordPress :

Application Python montrant la suppression de l'article sélectionné.
Application Python montrant la suppression de l’article sélectionné.

Remarque : l’article supprimé peut encore apparaître si vous exécutez l’option List Posts :

Application Python montrant la liste des articles d'origine.
Application Python montrant la liste des articles d’origine.

Pour confirmer que vous avez bien supprimé l’article, attendez quelques secondes et réessayez l’option List Posts. Et voilà, c’est fait !

Résumé

Grâce à l’API REST de WordPress et aux bibliothèques client HTTP de Python, les applications Python et WordPress peuvent faire équipe et se parler. L’avantage de l’API REST est qu’elle vous permet de faire fonctionner 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 le développement de thèmes et d’extensions 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 serez prêt à approfondir cette expérience, vous pourrez lire Le guide complet des bases de l’API REST WordPress pour explorer d’autres possibilités.

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.