WordPress è diventato il sistema di gestione dei contenuti (CMS) più utilizzato grazie soprattutto alla sua interfaccia di programmazione delle applicazioni (API). L’API REST di WordPress permette a WordPress di “parlare” con altre applicazioni scritte in vari linguaggi, tra cui Python.

Python è un linguaggio di programmazione estensibile con diversi utilizzi e una sintassi leggibile dagli esseri umani, e questo lo rende uno strumento potente per la gestione remota dei contenuti di WordPress.

Ecco alcuni casi d’uso dell’API REST di WordPress per le vostre applicazioni e come potete usare Python per supportarle:

  • Usate modelli predefiniti per consentire alla vostra applicazione di trasformare rapidamente i dati grezzi in post formattati con spiegazioni.
  • Costruite un’applicazione di back-office su Django e Python che mostri ai vostri clienti offerte a tempo limitato ogni volta che si verifica uno sconto specifico o un evento di vendita.
  • Integrare script Python da eseguire all’interno del vostro sito WordPress.

Questo tutorial vi aiuterà a creare una semplice applicazione console in Python che comunica con l’API REST di WordPress ed esegue operazioni su di essa. È disponibile anche il codice completo del progetto.

Installazione e Configurazione di WordPress

Per prima cosa, installate ed eseguite un sito web WordPress in locale sul vostro computer di sviluppo. Questo è un modo eccellente per iniziare a usare WordPress, dato che non è necessario creare un account o acquistare un nome di dominio per l’hosting web.

Prima di installare WordPress in locale, è necessario che alcuni componenti funzionino sul vostro computer, tra cui il server web Apache, un database locale e il linguaggio PHP in cui è scritto WordPress.

Per fortuna possiamo usare DevKinsta, una suite gratuita per lo sviluppo locale di WordPress disponibile per tutti i principali sistemi operativi (non è necessario essere clienti di Kinsta per utilizzarla).

DevKinsta è disponibile per Windows, Mac e Linux e installa WordPress e tutte le sue dipendenze sul vostro computer locale.

Prima di installare DevKinsta, dovete avere Docker in esecuzione localmente, quindi scaricate e installate Docker Engine se non l’avete ancora fatto.

Dopo aver installato Docker Desktop, potrete scaricare automaticamente il pacchetto adatto al vostro sistema operativo.

Pagina di installazione da cui scaricare DevKinsta.
Pagina di installazione di DevKinsta.

Quando eseguite il programma di installazione di DevKinsta, Docker si avvia immediatamente:

Schermata della finestra di avvio di DevKinsta.
DevKinsta avvia Docker in locale.

Successivamente, scegliete Nuovo sito WordPress dal menu Crea nuovo sito:

Schermata della finestra di DevKinstada cui creare un nuovo sito WordPressn.
Il menu Crea nuovo sito in DevKinsta.

Ora il programma di installazione di DevKinsta vi chiede di creare le credenziali per l’account di amministrazione di WordPress:

Modulo di DevKinsta in cui inserire le informazioni del nuovo sito WordPress.
DevKinsta visualizza il modulo Nuovo sito WordPress.

Una volta installata, DevKinsta è un’applicazione indipendente. Ora potete accedere sia al sito WordPress (tramite il pulsante Apri sito) sia alla bacheca di amministrazione di WordPress (pulsante WP Admin).

Schermata della finestra Informazioni Sito di DevKinsta con i dettagli del sito WordPress.
Pannello Informazioni Sito di DevKinsta.

Successivamente, dovete abilitare SSL e HTTPS per il vostro sito web. Questo migliora la sicurezza del vostro sito web grazie a un certificato SSL.

Schermata di DevKinsta con le opzioni SSL e HTTPS.
L’opzione “SSL e HTTPS” di DevKinsta.

Ora andate nell’app DevKinsta e fate clic sul pulsante Apri sito. Una nuova scheda del browser mostrerà la pagina iniziale del vostro sito WordPress:

La home page del sito WordPress locale.
Homepage del sito WordPress.

Questo è il vostro blog WordPress dove potete iniziare a scrivere. Ma per consentire a Python di accedere e usare l’API REST di WordPress, dobbiamo prima configurare l’amministrazione di WordPress.

Fate clic sul pulsante WP Admin dell’applicazione DevKinsta e inserite utente e password per accedere alla bacheca di WordPress:

Schermata del modulo di accesso al pannello admin di WordPress.
Modulo di accesso a WordPress.

Una volta effettuato l’accesso, vedrete la Bacheca di WordPress:

Pagina di benvenuto nell’admin di WordPress.
Pagina della Bacheca di WordPress.

WordPress usa l’autenticazione tramite cookie come metodo standard. Ma se volete controllarlo usando l’API REST, dovete autenticarvi con una tecnica che garantisca l’accesso all’API REST di WordPress.

A tal fine, userete Application Passwords. Si tratta di stringhe di 24 caratteri che WordPress genera e associa a un profilo utente che ha il permesso di gestire il vostro sito web.

Per usare Application Passwords, fate clic sul menu Plugin della Bacheca e cercate l’omonimo plugin. Quindi installate e attivate il plugin Application Passwords:

Backend dei plugin WordPress in cui è selezionato il plugin Application Passwords.
Plugin Application Passwords per WordPress.

Per iniziare a creare la password della vostra applicazione, iniziate espandendo il menu Utenti e facendo clic su Tutti gli utenti:

Menu Utenti nel backend di WordPress.
Menu Utenti espanso.

Ora fate clic su Modifica sotto il vostro nome utente con ruolo amministratore:

Una freccia viola indica il pulsante "Modifica" sotto l’utente WordPress nel menu Utenti.
Interfaccia WP-Admin WordPress.

Scorrete la pagina di modifica utente e trovate la sezione Application Passwords. Qui dovrete indicare un nome per la password dell’applicazione, che userete in seguito per autenticare le richieste dell’applicazione Python e usare l’API REST:

Bacheca di amministrazione del plugin Application Passwords.
Pagina di Application Password.

Fate clic su Add New Application Password in modo che WordPress possa generare una password casuale di 24 caratteri:

Il campo coi caratteri mascherati in cui è stata inserita la nuova password generata dal plugin Application Passwords.
Nuova pagina di Application Passwords.

Successivamente, copiate questa password e salvatela in un luogo sicuro per usarla in seguito. Ricordate che non potrete recuperare questa password una volta chiusa questa pagina.

Infine, dovete configurare i permalink. WordPress vi permette di creare una struttura URL personalizzata per i vostri permalink e archivi. Modifichiamola in modo che un post di WordPress intitolato, per esempio, “Il tuo primo sito web WordPress” sia accessibile attraverso l’intuitivo URL https://your-website.local:port/your-first-wordpress-website/. Questo approccio porta diversi vantaggi, tra cui una migliore usabilità ed estetica.

Per configurare i permalink, espandete la sezione Impostazioni e fate clic sul menu Permalink. Qui, cambiate le Impostazioni comuni in Nome articolo:

Schermata Impostazioni Permalink del backend WordPress in cui cambiare il formato dei permalink.

Impostare la struttura dei permalink usando la struttura Nome articolo è necessario anche perché ci permetterà di recuperare i post in seguito nel nostro codice Python utilizzando il formato JSON. In caso contrario, verrà lanciato un errore di decodifica JSON.

Come Controllare WordPress da Python

WordPress è scritto in PHP, ma dispone di un’API REST che consente ad altri linguaggi di programmazione, siti e applicazioni di consumare i suoi contenuti. L’esposizione dei contenuti di WordPress in architettura REST li rende disponibili in formato JSON. Pertanto, altri servizi possono integrarsi con WordPress ed eseguire operazioni di creazione, lettura, aggiornamento e cancellazione (CRUD) senza richiedere l’installazione locale di WordPress.

A seguire, realizzate una semplice applicazione Python per vedere come usare l’API REST di WordPress per creare, recuperare, aggiornare e cancellare post e articoli.

Create una nuova cartella per il vostro nuovo semplice progetto Python e dategli un nome come PythonWordPress:

../PythonWordPress

Ora create un ambiente virtuale per il vostro progetto, consentendogli di mantenere un insieme indipendente di pacchetti Python installati, isolandoli dalle directory di sistema ed evitando conflitti di versione. Create un ambiente virtuale eseguendo il comando venv:

python3 -m venv .venv

Ora eseguite un comando per attivare l’ambiente virtuale .venv. Questo comando varia a seconda del sistema operativo:

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

Successivamente, memorizzate la configurazione relativa al vostro account WordPress. Per separare la configurazione dell’applicazione dal codice Python, create un file .env nella directory del progetto e aggiungete queste variabili d’ambiente al file:

WEBSITE_URL="<>"

API_USERNAME="<>"

API_PASSWORD="<>"

Per fortuna leggere i dati di cui sopra da un’applicazione Python è facile. Potete installare il pacchetto Python-dotenv in modo che la vostra applicazione possa leggere la configurazione dal file .env:

pip install python-dotenv

Quindi installate aiohttp, un client/server HTTP asincrono per Python:

pip install aiohttp

Ora aggiungete un file chiamato app.py con il seguente codice:

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

Il codice precedente visualizza un menu della console e vi chiede di inserire un numero per scegliere un’opzione. Successivamente, espanderete questo progetto e implementerete il codice che vi permetterà di elencare tutti i post e di recuperare un post specifico utilizzando il suo id.

Recuperare i Post nel Codice

Per interagire con WordPress REST API, dovete creare un nuovo file Python. Create un file chiamato wordpress_api_helper.py con il seguente contenuto:

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

Notate l’uso della libreria aiohttp sopra. I linguaggi moderni offrono una sintassi e degli strumenti che consentono la programmazione asincrona. Questo aumenta la reattività dell’applicazione consentendo al programma di eseguire attività parallele a operazioni come richieste web, operazioni di database e I/O su disco. Python offre asyncio come base per il suo framework di programmazione asincrona e la libreria aiohttp è costruita su asyncio per offrire accesso asincrono alle operazioni HTTP Client/Server effettuate in Python.

La funzione ClientSession qui sopra viene eseguita in modo asincrono e restituisce un oggetto session, che il nostro programma usa per eseguire un’operazione HTTP GET contro l’endpoint /wp-json/wp/v2/posts. L’unica differenza tra una richiesta per recuperare tutti i post e una richiesta per uno specifico post è che quest’ultima richiesta passa un parametro post id nel percorso URL: /wp-json/wp/v2/posts/{id}.

Ora sprite il file app.py e aggiungete la dichiarazione import:

from wordpress_api_helper import get_all_posts, get_post

Quindi, modificate la funzione main per chiamare le funzioni get_all_posts e 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)

Quindi eseguite l’applicazione:

python app.py

Vedrete il menu dell’applicazione:

Avvio dell'applicazione Python collegata a WordPress.
Menu dell’applicazione Python.

Ora provate l’opzione 1 per visualizzare l’elenco dei post recuperati dalla vostra applicazione Python e l’opzione 2 per selezionare un post:

Provate l'opzione 1 per visualizzare l'elenco dei post recuperati dall'applicazione Python e l'opzione 2 per selezionare un post.
L’applicazione Python mostra l’elenco dei post e un singolo post selezionato dall’utente.

Creare Post in Codice

Per creare un post di WordPress in Python, iniziate aprendo il file wordpress_api_helper.py e aggiungete la funzione 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}')

Questo codice richiama la funzione post nell’oggetto session, passando il parametro auth accanto all’URL dell’endpoint dell’API REST. L’oggetto auth contiene ora l’utente WordPress e la password che avete creato con Application Passwords. Ora, aprite il file app.py e aggiungete il codice per importare create_post e il 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'

}

Poi aggiungi una terza opzione di 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}")

Quindi, avviate l’applicazione e provate l’opzione 3, passando un titolo e un contenuto per creare un nuovo post in WordPress:

Creare un post di WordPress con Python.
L’applicazione Python visualizza il post WordPress appena creato.

Scegliendo di nuovo l’opzione 1, otterrete l’id e il titolo del post appena aggiunto:

Restituzione dell'id e del titolo del post appena aggiunto.
L’applicazione Python restituisce il titolo e l’id del nuovo post.

Potete anche aprire il vostro sito web WordPress per visualizzare il nuovo post:

Il post appena creato nel browser.
Immagine del browser del nuovo post di WordPress.

Aggiornare i Post nel Codice

Aprite il file wordpress_api_helper.py e aggiungietela funzione 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}')

Poi aprite il file app.py e aggiungete il codice per importare update_post e il 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'

}

Quindi aggiungete una quarta opzione di 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}")

Eseguite l’applicazione e provate l’opzione 4, passando l’id di un post, il titolo e il contenuto per aggiornare un post esistente.

Aggiornamento di un post di WordPress.
Python mostra il menu aggiornato.

Scegliendo l’opzione 2 e passando l’id del post aggiornato, otterrete i dettagli del nuovo post aggiunto:

Restituzione dei dettagli del post appena aggiornato.
L’applicazione Python mostra il post aggiornato.

Eliminare i Post nel Codice

Potete passare l’id del post all’API REST per eliminare un post.

Aprite il file wordpress_api_helper.py e aggiungete la funzione 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.')

Ora aprite il file app.py e aggiungete il codice per importare delete_post e il 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',

}

Quindi aggiungete una quinta opzione di menu:

elif option == 5:

print('Deleting a post...')

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

await delete_post(id)

Ora eseguite l’applicazione e provate l’opzione 5, passando un id per eliminare il post esistente in WordPress:

Eliminare un post di WordPress con l'applicazione Python.
L’applicazione Python mostra la cancellazione del post selezionato.

Nota: il post cancellato potrebbe ancora apparire se eseguite l’opzione List Posts:

App Python che elenca i post.
L’applicazione Python mostra l’elenco dei post originali.

Per confermare l’eliminazione del post, attendete qualche secondo e riprovate l’opzione List Posts. Ed ecco fatto!

Riepilogo

Grazie all’API REST di WordPress e alle librerie client HTTP di Python, le applicazioni Python e WordPress possono collaborare e dialogare. Il vantaggio dell’API REST è che vi permette di usare WordPress in remoto da un’applicazione Python, dove il potente linguaggio di Python consente la creazione automatica di contenuti che seguono la struttura e la frequenza desiderate.

DevKinsta rende facile e veloce la creazione e lo sviluppo di un sito WordPress locale. Fornisce un ambiente locale per lo sviluppo di temi e plugin WordPress e offre un modello di distribuzione semplificato grazie al suo modello di installazione autonomo basato su Docker.

Qual è la vostra esperienza di lavoro con Python e WordPress?

Se volete approfondire questa esperienza, potete leggere la Guida completa alle API REST di WordPress per esplorare altre possibilità.

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.