Pula sus chuletas de Python conectando su aplicación con WordPress

Publicado: 2022-10-18

WordPress se ha convertido en el sistema de gestión de contenido (CMS) más utilizado debido en gran parte a su interfaz de programación de aplicaciones (API). La API REST de WordPress le permite a WordPress “hablar” con otras aplicaciones escritas en varios idiomas, incluido Python.

Python es un lenguaje de programación extensible con diversos usos y una sintaxis legible por humanos, lo que lo convierte en una herramienta poderosa para administrar contenido de WordPress de forma remota.

Estos son algunos casos de uso de la API REST de WordPress para sus aplicaciones y cómo puede usar Python para respaldarlas:

  • Use plantillas predefinidas para permitir que su aplicación convierta datos sin procesar en publicaciones formateadas con explicaciones rápidamente.
  • Cree una aplicación administrativa en Django y Python que muestre ofertas por tiempo limitado a sus clientes cada vez que ocurra un evento de ventas o un descuento específico de un objeto.
  • Integre secuencias de comandos de Python para ejecutar dentro de su sitio de WordPress

Este tutorial lo ayudará a crear una aplicación de consola Python simple que se comunica y ejecuta operaciones en la API REST de WordPress. El código completo del proyecto también está disponible.


Instalación y configuración de WordPress

Primero, instalemos y ejecutemos un sitio web de WordPress localmente en su máquina de desarrollo. Esta es una excelente manera de comenzar con WordPress, ya que no tiene que crear una cuenta ni comprar un nombre de dominio para el alojamiento web.

Antes de instalar WordPress localmente, se requieren algunos componentes para ejecutarse en su computadora, incluido el servidor web Apache, una base de datos local y el lenguaje PHP en el que está escrito WordPress.

Afortunadamente, podemos usar DevKinsta, un paquete de desarrollo de WordPress local gratuito disponible para todos los principales sistemas operativos (no es necesario ser cliente de Kinsta para usarlo).

DevKinsta está disponible para Windows, Mac y Linux, e instala WordPress y todas sus dependencias en su máquina local.

Antes de instalar DevKinsta, debe tener Docker ejecutándose localmente, así que descargue e instale Docker Engine si aún no lo ha hecho.

Después de instalar Docker Desktop, puede descargar automáticamente el paquete que se ajuste a su sistema operativo.

Captura de pantalla de la página de descarga de DevKinsta.
Página de instalación de DevKinsta.

Cuando ejecuta el instalador de DevKinsta, Docker comienza a inicializarse inmediatamente:

Pantalla Docker inicial de DevKinsta.
DevKinsta inicia Docker localmente.

A continuación, elija Nuevo sitio de WordPress en el menú Crear nuevo sitio :

Pantalla de creación de un nuevo sitio de WordPress de DevKinsta.
Menú Crear nuevo sitio de DevKinsta.

Ahora, el instalador de DevKinsta requiere que cree las credenciales para la cuenta de administrador de WordPress:

Nueva pantalla de creación de sitios de WordPress de DevKinsta.
DevKinsta mostrando el formulario Nuevo sitio de WordPress.

Una vez instalado, DevKinsta es una aplicación independiente. Ahora puede acceder tanto al sitio de WordPress (a través del botón Abrir sitio ) como al panel de administración de WordPress (botón WP Admin ).

Pantalla de información del sitio WordPress de DevKinsta.
Panel de información del sitio de DevKinsta.

A continuación, debe habilitar SSL y HTTPS para su sitio web. Esto mejora la seguridad de su sitio web a través de un certificado SSL.

Habilitación de la opción SSL y HTTPS de DevKinsta.
Opción "SSL y HTTPS" de DevKinsta.

Ahora vaya a la aplicación DevKinsta y haga clic en el botón Abrir sitio . Una nueva pestaña del navegador mostrará la página de inicio de su sitio de WordPress:

La página de inicio de su sitio local de WordPress.
Página de inicio de WordPress.

Este es tu blog de WordPress, donde puedes empezar a escribir. Pero para permitir que Python acceda y use la API REST de WordPress, primero debemos configurar el administrador de WordPress.

Ahora haga clic en el botón WP Admin en la aplicación DevKinsta, luego proporcione su usuario y contraseña para acceder al panel de WordPress :

Pantalla de inicio de sesión del panel de administración de WordPress.
Formulario de inicio de sesión de WordPress.

Una vez que haya iniciado sesión, verá el Panel de WordPress :

Bienvenido a la pantalla de administración de WordPress.
Página del panel de WordPress.

WordPress utiliza la autenticación de cookies como método estándar. Pero si desea controlarlo utilizando la API REST, debe autenticarse con una técnica que le otorgue acceso a la API REST de WordPress.

Para ello, utilizará contraseñas de aplicación. Estas son cadenas largas de 24 caracteres que WordPress genera y asocia con un perfil de usuario que tiene permiso para administrar su sitio web.

Para usar contraseñas de aplicación, haga clic en el menú Complemento en el Panel de control y luego busque el complemento con el mismo nombre. Luego instale y active el complemento de contraseñas de aplicaciones:

Instalación y activación del complemento de contraseñas de aplicaciones de WordPress.
Complemento de contraseñas de aplicaciones para WordPress.

Para comenzar a crear la contraseña de su aplicación, primero expanda el menú Usuarios y haga clic en Todos los usuarios :

Menú de WordPress de usuarios ampliado.
Menú de usuarios ampliado.

Ahora, haga clic en Editar debajo de su nombre de usuario administrador:

Haga clic en el botón "Editar" debajo de su usuario de WordPress en el menú Usuarios.
Interfaz de WordPress de administración de WP.

Desplácese hacia abajo en la página Editar usuario y busque la sección Contraseñas de la aplicación . Aquí, proporcione un nombre para la contraseña de la aplicación, que usará más adelante para autenticar sus solicitudes de aplicaciones de Python y consumir la API REST:

Tablero de complementos de contraseñas de aplicaciones.
Página de contraseña de la aplicación.

Haga clic en Agregar nueva contraseña de aplicación para que WordPress pueda generar una contraseña aleatoria de 24 caracteres para usted:

La nueva contraseña generada por el complemento Contraseñas de la aplicación.
Nueva página de contraseña de aplicación.

Luego, copie esta contraseña y guárdela en un lugar seguro para usarla más tarde. Recuerde, no podrá recuperar esta contraseña una vez que cierre esta página.

Finalmente, debes configurar los enlaces permanentes. WordPress le permite crear una estructura de URL personalizada para sus enlaces permanentes y archivos. Cambiémoslo para que se pueda acceder a una publicación de WordPress titulada, por ejemplo, "Su primer sitio web de WordPress" a través de la URL intuitiva https://your-website.local:port/your-first-wordpress-website/. Este enfoque trae varios beneficios, incluida la mejora de la usabilidad y la estética.

Para configurar los enlaces permanentes, expanda la sección Configuración y haga clic en el menú Enlaces permanentes . Aquí, cambie la Configuración común a Nombre de la publicación:

Cambiar la configuración de enlaces permanentes de WordPress.

También es necesario configurar la estructura de enlace permanente usando la estructura de nombre de la publicación porque nos permitirá recuperar las publicaciones más adelante en nuestro código de Python usando el formato JSON. De lo contrario, se generará un error de decodificación JSON.

Cómo controlar WordPress desde Python

WordPress está escrito en PHP, pero tiene una API REST que permite que otros lenguajes de programación, sitios y aplicaciones consuman su contenido. Exponer el contenido de WordPress en la arquitectura REST lo hace disponible en formato JSON. Por lo tanto, otros servicios pueden integrarse con WordPress y realizar operaciones de creación, lectura, actualización y eliminación (CRUD) sin necesidad de una instalación local de WordPress.

A continuación, creará una aplicación de Python simple para ver cómo puede usar la API REST de WordPress para crear, recuperar, actualizar y eliminar publicaciones.

Cree un nuevo directorio para su nuevo proyecto Python simple y asígnele un nombre similar a PythonWordPress :

 ../PythonWordPress

Ahora, creará un entorno virtual para su proyecto, permitiéndole mantener un conjunto independiente de paquetes de Python instalados, aislándolos de los directorios de su sistema y evitando conflictos de versiones. Cree un entorno virtual ejecutando el comando venv :

 python3 -m venv .venv

Ahora, ejecute un comando para activar el entorno virtual .venv . Este comando varía según el sistema operativo:

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

A continuación, almacene la configuración relacionada con su cuenta de WordPress. Para separar la configuración de la aplicación de su código de Python, cree un archivo .env en el directorio de su proyecto y agregue estas variables de entorno al archivo:

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

Afortunadamente, leer los datos anteriores desde una aplicación de Python es fácil. Puede instalar el paquete Python-dotenv para que su aplicación pueda leer la configuración del archivo .env :

 pip install python-dotenv

Luego, instale aiohttp , un cliente/servidor HTTP asíncrono para Python:

 pip install aiohttp

Ahora agregue un archivo llamado app.py con el siguiente código:

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

El código anterior muestra un menú de consola y le pide que ingrese un número para elegir una opción. A continuación, expandirá este proyecto e implementará el código que le permite enumerar todas las publicaciones y recuperar una publicación específica usando su ID de publicación.

Obtener publicaciones en código

Para interactuar con la API REST de WordPress, debe crear un nuevo archivo de Python. Crea un archivo llamado wordpress_api_helper.py con el siguiente contenido:

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

Observe el uso de la biblioteca aiohttp anterior. Los lenguajes modernos proporcionan sintaxis y herramientas que permiten la programación asíncrona. Esto aumenta la capacidad de respuesta de la aplicación al permitir que el programa realice tareas junto con operaciones como solicitudes web, operaciones de bases de datos y E/S de disco. Python ofrece asyncio como base para su marco de programación asíncrono, y la biblioteca aiohttp se basa en asyncio para brindar acceso asíncrono a las operaciones de cliente/servidor HTTP realizadas en Python.

La función ClientSession anterior se ejecuta de forma asincrónica y devuelve un objeto de session , que nuestro programa usa para realizar una operación HTTP GET contra el punto final /wp-json/wp/v2/posts . La única diferencia entre una solicitud para recuperar todas las publicaciones y una solicitud específica es que esta última solicitud pasa un parámetro de post id en la ruta URL: /wp-json/wp/v2/posts/{id} .

Ahora, abra el archivo app.py y agregue la declaración de import :

 from wordpress_api_helper import get_all_posts, get_post

A continuación, modifique la función main para llamar a las funciones get_all_posts y 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)

Luego ejecuta la aplicación:

 python app.py

A continuación, verá el menú de la aplicación:

Iniciando la aplicación Python conectada a WordPress.
Menú de la aplicación Python.

Ahora pruebe la opción 1 para ver la lista de publicaciones que recupera su aplicación de Python y la opción 2 para seleccionar una publicación:

Pruebe la opción 1 para ver la lista de publicaciones que recupera su aplicación de Python y la opción 2 para seleccionar una publicación.
Aplicación de Python que muestra la lista de publicaciones y una sola publicación seleccionada por el usuario.

Creación de publicaciones en código

Para crear una publicación de WordPress en Python, comience abriendo el archivo wordpress_api_helper.py y agregue la función create_post :

¿Luchando con el tiempo de inactividad y los problemas de WordPress? ¡Kinsta es la solución de hospedaje diseñada para ahorrarle tiempo! Echa un vistazo a nuestras características
 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}')

Este código llama a la función de post en el objeto de la session , pasando el parámetro de auth junto a la URL del punto final de la API REST. El objeto de auth ahora contiene el usuario de WordPress y la contraseña que creó usando Contraseñas de aplicación. Ahora, abra el archivo app.py y agregue el código para importar create_post y el menú:

 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' }

Luego agregue una tercera opción de menú:

 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}")

Luego, ejecuta la aplicación y prueba la opción 3, pasando un título y contenido para crear una nueva publicación en WordPress:

Crear una publicación de WordPress con Python.
Aplicación de Python que muestra una publicación de WordPress recién creada.

Elegir la opción 1 nuevamente devolverá la identificación y el título de la publicación recién agregada:

Devolviendo la identificación y el título de la publicación recién agregada.
La aplicación Python devuelve el título y la identificación de la nueva publicación.

También puede abrir su sitio web de WordPress para ver la nueva publicación:

La publicación recién creada en el navegador.
Imagen del navegador de la nueva publicación de WordPress.

Actualización de publicaciones en código

Abra el archivo wordpress_api_helper.py y agregue la función 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}')

Luego abra el archivo app.py y agregue el código para importar update_post y el menú:

 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' }

Luego, agregue una cuarta opción de menú:

 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}")

Luego ejecute la aplicación y pruebe la opción 4, pasando una identificación de publicación, título y contenido para actualizar una publicación existente.

Actualización de una publicación de WordPress.
Aplicación de Python que muestra el menú actualizado.

Elegir la opción 2 y pasar la identificación de la publicación actualizada devolverá los detalles de la publicación recién agregada:

Devolviendo los detalles de la publicación recién actualizada.
Aplicación de Python que muestra la publicación actualizada.

Eliminación de publicaciones en el código

Puede pasar la identificación de la publicación a la API REST para eliminar una publicación.

Abra el archivo wordpress_api_helper.py y agregue la función 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.')

Ahora abra el archivo app.py y agregue el código para importar delete_post y el menú:

 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', }

Luego, agrega una quinta opción de menú:

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

Ahora ejecute la aplicación y pruebe la opción 5, pasando una identificación para eliminar la publicación existente en WordPress:

Eliminar una publicación de WordPress con la aplicación Python.
Aplicación de Python que muestra la eliminación de la publicación seleccionada.

Nota: La publicación eliminada aún puede aparecer si ejecuta la opción Publicaciones de lista :

Publicaciones de listas de aplicaciones de Python.
Aplicación de Python que muestra la lista de publicaciones originales.

Para confirmar que eliminó la publicación, espere unos segundos y vuelva a probar la opción Enumerar publicaciones. ¡Y eso es!

Resumen

Gracias a la API REST de WordPress y las bibliotecas de cliente HTTP de Python, las aplicaciones de Python y WordPress pueden unirse y comunicarse entre sí. El beneficio de la API REST es que le permite operar WordPress de forma remota desde una aplicación de Python, donde el poderoso lenguaje de Python permite la creación automática de contenido que sigue la estructura y frecuencia deseadas.

DevKinsta hace que crear y desarrollar un sitio local de WordPress sea rápido y fácil. Proporciona un entorno local para desarrollar temas y complementos de WordPress y ofrece un modelo de implementación simplificado cortesía de su modelo de instalación autónomo basado en Docker.

¿Cuál es tu experiencia trabajando con Python y WordPress?

Cuando esté listo para ampliar esa experiencia, puede leer La guía completa de los conceptos básicos de la API REST de WordPress para explorar otras posibilidades.