Lucida le tue costolette Python collegando la tua app con WordPress

Pubblicato: 2022-10-18

WordPress è diventato il sistema di gestione dei contenuti (CMS) più utilizzato grazie in gran parte alla sua interfaccia di programmazione dell'applicazione (API). L'API REST di WordPress consente a WordPress di "parlare" con altre applicazioni scritte in vari linguaggi, incluso Python.

Python è un linguaggio di programmazione estensibile con usi diversi e una sintassi leggibile dall'uomo, che lo rende un potente strumento per la gestione remota dei contenuti di WordPress.

Ecco alcuni casi d'uso dell'API REST di WordPress per le tue app e come puoi utilizzare Python per supportarle:

  • Utilizza modelli predefiniti per consentire alla tua app di trasformare rapidamente i dati grezzi in post formattati con spiegazioni.
  • Crea un'applicazione di back-office su Django e Python che mostri offerte a tempo limitato ai tuoi clienti ogni volta che si verifica uno sconto specifico per oggetto o un evento di vendita.
  • Integra gli script Python da eseguire all'interno del tuo sito WordPress

Questo tutorial ti aiuterà a creare una semplice applicazione console Python che comunica ed esegue operazioni sull'API REST di WordPress. È inoltre disponibile il codice completo del progetto.


Installazione e configurazione di WordPress

Innanzitutto, installiamo ed eseguiamo un sito Web WordPress in locale sulla tua macchina di sviluppo. Questo è un ottimo modo per iniziare con WordPress poiché 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 vengano eseguiti sul tuo computer, incluso il server Web Apache, un database locale e il linguaggio PHP in cui è scritto WordPress.

Fortunatamente, possiamo utilizzare DevKinsta, una suite di sviluppo WordPress locale gratuita disponibile per tutti i principali sistemi operativi (non è necessario essere un cliente Kinsta per utilizzarla).

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

Prima di installare DevKinsta, devi avere Docker in esecuzione localmente, quindi scarica e installa Docker Engine se non l'hai ancora fatto.

Dopo aver installato Docker Desktop, puoi scaricare automaticamente il pacchetto adatto al tuo sistema operativo.

Schermata della pagina di download di DevKinsta.
Pagina di installazione di DevKinsta.

Quando esegui il programma di installazione di DevKinsta, Docker inizia immediatamente l'inizializzazione:

Schermata Docker iniziale di DevKinsta.
DevKinsta avvia Docker in locale.

Quindi, scegli Nuovo sito WordPress dal menu Crea nuovo sito :

DevKinsta crea una nuova schermata del sito WordPress.
Menu Crea nuovo sito di DevKinsta.

Ora il programma di installazione di DevKinsta richiede di creare le credenziali per l'account amministratore di WordPress:

La nuova schermata di creazione del sito WordPress di DevKinsta.
DevKinsta mostra il modulo del nuovo sito WordPress.

Una volta installato, DevKinsta è un'applicazione autonoma. Ora puoi accedere sia al sito WordPress (tramite il pulsante Apri sito ) che alla dashboard di amministrazione di WordPress (pulsante WP Admin ).

Schermata delle informazioni del sito WordPress di DevKinsta.
Pannello delle informazioni del sito di DevKinsta.

Successivamente, devi abilitare SSL e HTTPS per il tuo sito web. Ciò migliora la sicurezza del tuo sito Web attraverso un certificato SSL.

Abilitazione dell'opzione SSL e HTTPS di DevKinsta.
Opzione "SSL e HTTPS" di DevKinsta.

Ora vai all'app DevKinsta e fai clic sul pulsante Apri sito . Una nuova scheda del browser mostrerà la home page del tuo sito WordPress:

La home page del tuo sito WordPress locale.
Pagina iniziale di WordPress.

Questo è il tuo blog WordPress, dove puoi iniziare a scrivere. Ma per consentire a Python di accedere e utilizzare l'API REST di WordPress, dobbiamo prima configurare l'amministratore di WordPress.

Ora fai clic sul pulsante WP Admin sull'app DevKinsta, quindi fornisci il tuo utente e password per accedere alla dashboard di WordPress :

Schermata di accesso alla dashboard dell'amministratore di WordPress.
Modulo di accesso a WordPress.

Una volta effettuato l'accesso, vedrai la dashboard di WordPress :

Benvenuto nella schermata di amministrazione di WordPress.
Pagina dashboard di WordPress.

WordPress utilizza l'autenticazione dei cookie come metodo standard. Ma se vuoi controllarlo utilizzando l'API REST, devi autenticarti con una tecnica che garantisca l'accesso all'API REST di WordPress.

Per questo, utilizzerai le password dell'applicazione. Si tratta di stringhe di 24 caratteri che WordPress genera e associa a un profilo utente che dispone dell'autorizzazione per gestire il tuo sito web.

Per utilizzare le password dell'applicazione, fai clic sul menu Plugin nella dashboard, quindi cerca il plug-in con lo stesso nome. Quindi installa e attiva il plug-in delle password dell'applicazione:

Installazione e attivazione del plug-in per le password dell'applicazione WordPress.
Plugin per le password dell'applicazione per WordPress.

Per iniziare a creare la password dell'applicazione, inizia espandendo il menu Utenti e facendo clic su Tutti gli utenti :

Menu WordPress ampliato per gli utenti.
Menu utenti ampliato.

Ora, fai clic su Modifica sotto il tuo nome utente amministratore:

Fai clic sul pulsante "Modifica" sotto il tuo utente WordPress nel menu Utenti.
WP-Admin Interfaccia WordPress.

Scorri verso il basso la pagina Modifica utente e trova la sezione Password dell'applicazione . Qui, fornisci un nome per la password dell'applicazione, che utilizzerai in seguito per autenticare le richieste dell'app Python e utilizzare l'API REST:

Pannello di controllo del plug-in Password dell'applicazione.
Pagina della password dell'applicazione.

Fai clic su Aggiungi nuova password per l'applicazione in modo che WordPress possa generare una password casuale di 24 caratteri per te:

La nuova password generata dal plug-in Application Passwords.
Nuova pagina della password dell'applicazione.

Quindi, copia questa password e salvala in un luogo sicuro per usarla in seguito. Ricorda che non sarai in grado di recuperare questa password una volta chiusa questa pagina.

Infine, devi configurare i permalink. WordPress ti consente di creare una struttura URL personalizzata per i tuoi permalink e archivi. Modifichiamolo in modo che sia possibile accedere a un post WordPress intitolato, ad esempio, "Il tuo primo sito Web WordPress" tramite l'URL intuitivo https://your-website.local:port/your-first-wordpress-website/. Questo approccio porta numerosi vantaggi, tra cui una migliore usabilità ed estetica.

Per configurare i permalink, espandi la sezione Impostazioni e fai clic sul menu Permalink . Qui, cambia le Impostazioni comuni in Nome post :

Modifica delle impostazioni del permalink di WordPress.

È inoltre necessario impostare la struttura del permalink utilizzando la struttura del nome del post perché ci consentirà di recuperare i post in un secondo momento nel nostro codice Python utilizzando il formato JSON. In caso contrario, verrà generato un errore di decodifica JSON.

Come controllare WordPress da Python

WordPress è scritto in PHP, ma ha un'API REST che consente ad altri linguaggi di programmazione, siti e app di consumarne il contenuto. L'esposizione del contenuto di WordPress nell'architettura REST lo rende disponibile in formato JSON. Pertanto, altri servizi possono integrarsi con WordPress ed eseguire operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) senza richiedere un'installazione locale di WordPress.

Successivamente, creerai una semplice app Python per vedere come puoi utilizzare l'API REST di WordPress per creare, recuperare, aggiornare ed eliminare post.

Crea una nuova directory per il tuo nuovo semplice progetto Python e chiamalo qualcosa come PythonWordPress :

 ../PythonWordPress

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

 python3 -m venv .venv

Ora, esegui un comando per attivare l'ambiente virtuale .venv . Questo comando varia in base al sistema operativo:

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

Quindi, salva la configurazione relativa al tuo account WordPress. Per separare la configurazione dell'app dal codice Python, crea un file .env nella directory del progetto e aggiungi queste variabili di ambiente al file:

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

Fortunatamente, leggere i dati sopra da un'app Python è facile. Puoi installare il pacchetto Python-dotenv in modo che la tua applicazione possa leggere la configurazione dal file .env :

 pip install python-dotenv

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

 pip install aiohttp

Ora aggiungi 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 sopra mostra un menu della console e ti chiede di inserire un numero per scegliere un'opzione. Successivamente, espanderai questo progetto e implementerai il codice che ti consente di elencare tutti i post e recuperare un post specifico utilizzando il relativo ID post.

Recupero dei messaggi nel codice

Per interagire con l'API REST di WordPress, devi creare un nuovo file Python. Crea 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("=====================================")

Notare l'uso della libreria aiohttp sopra. I linguaggi moderni forniscono sintassi e strumenti che consentono la programmazione asincrona. Ciò aumenta la reattività dell'applicazione consentendo al programma di eseguire attività insieme a operazioni come richieste Web, operazioni di database e I/O del disco. Python offre asyncio come base per il suo framework di programmazione asincrono e la libreria aiohttp è costruita su asyncio per portare l'accesso asincrono alle operazioni client/server HTTP realizzate in Python.

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

Ora apri il file app.py e aggiungi la dichiarazione di import :

 from wordpress_api_helper import get_all_posts, get_post

Quindi, modifica 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 esegui l'app:

 python app.py

Vedrai quindi il menu dell'applicazione:

Avvio dell'app Python connessa a WordPress.
Menu dell'applicazione Python.

Ora prova l'opzione 1 per visualizzare l'elenco dei post recuperati dalla tua app Python e l'opzione 2 per selezionare un post:

Prova l'opzione 1 per visualizzare l'elenco dei post recuperati dalla tua app Python e l'opzione 2 per selezionare un post.
App Python che mostra l'elenco dei post e un singolo post selezionato dall'utente.

Creazione di post nel codice

Per creare un post WordPress in Python, inizia aprendo il file wordpress_api_helper.py e aggiungi la funzione create_post :

Lottando con tempi di inattività e problemi con WordPress? Kinsta è la soluzione di hosting progettata per farti risparmiare tempo! Scopri le nostre caratteristiche
 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 chiama la funzione post nell'oggetto session , passando il parametro auth accanto all'URL dell'endpoint dell'API REST. L'oggetto auth ora contiene l'utente WordPress e la password che hai creato utilizzando le password dell'applicazione. Ora apri il file app.py e aggiungi 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' }

Quindi 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, esegui l'app e prova l'opzione 3, passando un titolo e un contenuto per creare un nuovo post in WordPress:

Creazione di un post WordPress con Python.
App Python che mostra il post WordPress appena creato.

Scegliendo nuovamente l'opzione 1 verranno restituiti l'ID e il titolo del post appena aggiunto:

Restituendo l'id e il titolo del post appena aggiunto.
App Python che restituisce il titolo e l'ID del nuovo post.

Puoi anche aprire il tuo sito Web WordPress per visualizzare il nuovo post:

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

Aggiornamento dei post nel codice

Apri il file wordpress_api_helper.py e aggiungi la 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}')

Quindi apri il file app.py e aggiungi 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, aggiungi 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}")

Quindi esegui l'app e prova l'opzione 4, passando un ID post, un titolo e un contenuto per aggiornare un post esistente.

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

Scegliendo l'opzione 2 e passando l'ID post aggiornato verranno restituiti i dettagli del post appena aggiunto:

Restituendo i dettagli del post appena aggiornato.
App Python che mostra il post aggiornato.

Eliminazione di messaggi nel codice

Puoi passare l'ID del post all'API REST per eliminare un post.

Apri il file wordpress_api_helper.py e aggiungi 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 apri il file app.py e aggiungi 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, aggiungi una quinta opzione di menu:

 elif option == 5: print('Deleting a post...') id = input_number('Enter the post id: ') await delete_post(id)

Ora esegui l'app e prova l'opzione 5, passando un ID per eliminare il post esistente in WordPress:

Eliminazione di un post WordPress con l'app Python.
App Python che mostra l'eliminazione del post selezionato.

Nota: il post eliminato potrebbe ancora essere visualizzato se esegui l'opzione Elenca post :

Messaggi di elenco di app Python.
App Python che mostra l'elenco dei post originali.

Per confermare di aver eliminato il post, attendi qualche secondo e prova di nuovo l'opzione Elenca post . E questo è tutto!

Riepilogo

Grazie all'API REST di WordPress e alle librerie client HTTP di Python, le app Python e WordPress possono collaborare e dialogare tra loro. Il vantaggio dell'API REST è che ti consente di utilizzare WordPress in remoto da un'app Python, dove il potente linguaggio di Python consente la creazione automatizzata di contenuti che segue la struttura e la frequenza desiderate.

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

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

Quando sei pronto per espandere quell'esperienza, puoi leggere La guida completa alle basi dell'API REST di WordPress per esplorare altre possibilità.