Gestionando sitio o blog con API de WordPress y Python

Introducción

WordPress tiene una API que podemos consumir para gestionar completamente un blog. Todas las peticiones se hacen a un mismo archivo PHP. Pero hoy no hablaremos de PHP, sino de Python y una librería que nos va a facilitar el trabajo.

Me gustaría recalcar que esta api sirve tanto para sitios que están en wordpress.com (por ejemplo, algo como misitio.wordpress.com) y para sitios que no están en wordpress.com pero usan wordpress, por ejemplo, este sitio que, aunque está alojado en un servidor distinto, utiliza wordpress.

Comprobación rápida

Para comprobar si nuestro sitio puede ser manejado con la api, vamos a comprobar si existe un archivo llamado xmlrpc.php.

Para ello iremos a la dirección de nuestro sitio y adjuntaremos /xmlrpc.php

En este caso probaré con un blog gratuito que he creado en wordpress.com, pero esto aplica para cualquier sitio que tenga wordpress instalado.

En mi caso, la ruta normal es parzibyte.wordpress.com pero la del archivo es parzibyte.wordpress.com/xmlrpc.php

Navegando, tenemos que encontrar algo así:

Si es que sale así, entonces podemos comenzar a trabajar. El mensaje que sale indica que sólo se aceptan peticiones POST, y en este caso estamos haciendo una de tipo GET. Muy bien, ahora podemos proseguir.

Requisitos

Los requisitos no son muchos, ni son engorrosos. Además, si antes hemos programado con Python esto será pan comido.

  • Python superior a la versión 3
  • Pip o easy install

Tip: Puedes seguir este tutorial fácil para ver cómo instalar dichos requisitos 😉

Instalando python-wordpress-xmlrpc

Una vez que ya tenemos PIP instalado, en una terminal vamos a escribir:

<span class="pre">pip</span> <span class="pre">install</span> <span class="pre">python-wordpress-xmlrpc</span>

Esperaremos a que se descargue y listo

Puedes consultar la documentación oficial si quieres ver alternativas.

Hola mundo

Es hora de crear nuestro hola mundo. Para ello, abriremos nuestro editor de código favorito, crearemos un archivo nuevo y escribiremos lo siguiente:

Guardamos, y en la terminal escribimos python nombre_del_archivo.py

Obviamente vamos a remplazar los datos que aparecen ahí por los verdaderos. Si ponemos el usuario o la contraseña equivocada, aparecerá algo así:

En cambio, si todo va bien, algo así se verá. En este caso puede que nos parezca redundante, pero no es así, ya que el nombre de usuario ha sido obtenido directamente de wordpress

Listando posts

Una vez que ya nos pudimos autenticar, es hora de trabajar como se debe. Comenzaremos leyendo los posts que tenemos en nuestro sitio. Para ello, veamos el siguiente código:

En él, simplemente obtenemos las entradas llamando al método GetPosts(). Se supone que si nos autenticamos correctamente, debe mostrar las entradas que tenemos. Por el momento sólo muestra las primeras 10 entradas y el título de ellas.

Cabe mencionar que muestra tanto las que son borradores y las que están publicadas.

Al ejecutar el script se debe ver algo así:

Y si voy al verdadero sitio, veré esto:

Por lo que se comprueba que los datos de la API son reales.

Listando más propiedades de los posts

Hasta ahora sólo mostramos el título (que es lo que se imprime por defecto al imprimir el objeto), pero ciertamente las entradas tienen otras propiedades como id, estado, contenido, etcétera. Así que ahora vamos a imprimir 10 posts (al igual que hace un momento) pero también imprimiremos las propiedades más importantes.

Como sólo tengo 1 post, sólo se imprimirá uno. Pero el punto es demostrar las propiedades

El código es el siguiente:

Lo ejecutamos y debe aparecer algo así:

En este caso es la primera entrada y la única que existe. Tiene un id, contenido, título, y estado. Por cierto, no sólo existen esas propiedades. Podemos usar todas las que se muestran en esta lista de la documentación oficial.

Creando un post

Crear o insertar una nueva entrada o post es igual de sencillo que todo lo que hemos hecho hasta ahora. Vamos a crear uno que diga Hola mundo. Por cierto, todos los posts que publiquemos desde la api serán marcados como borradores (por lo que no serán publicados) pero tenemos un pequeño truco detallado más abajo para publicarlos instantáneamente.

Muy bien, para insertar podemos usar lo siguiente:

Y al ejecutarlo, vemos esto:

Si vamos al sitio de wordpress, vemos lo siguiente:

Maravilloso, tiene el título que nosotros pusimos en el script. Y si la abrimos para ver detalles, podemos ver en la url que el id efectivamente es el 17. Y que sí podemos incluir contenido HTML:

La única desventaja es que fue publicada como borrador. Ahora veremos cómo convertir instantáneamente ese borrador en una entrada pública.

Cambiar estado de borrador a entrada publicada

Como dijimos, cuando publicamos con la api, la entrada se queda como borrador. Pues bien, como nos devuelve el id de la entrada podemos obtenerla para editarla, cambiar su estado y guardar cambios. Así:

La entrada fue publicada correctamente:

Incluso se puede visitar aquí

Etiquetas y categorías

Al publicar un post también podemos agregar categorías y etiquetas. Simplemente establecemos la propiedad “term_names” de la nueva entrada. Para las etiquetas usamos post_tag y para las categorías category. Cada clave necesita un arreglo.

El código queda así:

Voy a ejecutar el script:

Podemos ver la entrada aquí, y si observamos bien, veremos que tomó las etiquetas y categorías que le pusimos:

Así es como podemos seguir jugando con toda la api.

Eliminando entrada

Para terminar este CRUD, falta mostrar cómo eliminar. Para ello necesitamos el id. En este caso eliminaré la entrada que dice “Primera entrada del blog”. Listaré todos los posts y veré cuál id tiene:

Es el id 4, con ello puedo llamar a DeletePost y pasarle ese id como argumento. Como medida de seguridad, haré que el sistema pregunte si realmente quiero realizar esa acción y que muestre los detalles del post a eliminar usando el método GetPost.

Así que el código queda así:

Al correrlo y confirmar sale esto:

Si visito la página, veré que el post se ha movido a la papelera. No sé si exista un método para eliminarlo permanentemente, pero con moverlo a la papelera basta. Ya que luego podemos vaciarla en una sola operación.

Script interactivo

Me tomé el tiempo de crear un script interactivo que junta todos estos métodos y permite editar, eliminar, insertar y listar lo básico.

Si no queremos ingresar nuestros datos cada que corramos el script, podemos remplazar los campos que dicen “usuario por defecto” y los otros dos (los de contraseña y sitio).

Si estamos en un sistema  que no es Windows, ponemos el comando que usamos para limpiar la pantalla en lugar de “cls”.

Y bien, aquí el código:

Algunas capturas:

Conclusión

Con este script de python podemos llevar a cabo cualquier operación que podemos hacer a mano. Si buscamos la manera, podremos optimizar esto y hacer que nos ahorre tiempo en nuestra vida cotidiana. Por ejemplo, podemos establecer estilos predeterminados con html, publicarlas de una base de datos, etcétera.

Se puede hacer todo lo que sea imaginable.

 

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

5 comentarios en “Gestionando sitio o blog con API de WordPress y Python”

  1. Tengo una duda: Y si quiero mostrar solo las entradas con una categoría?

    Tengo: entradas = cliente.call(posts.GetPosts(
    {‘number’: noticias_mostradas, ‘offset’: 0, ‘post_status’: ‘publish’, ‘category’: ‘categoria uno’}))

    Pero no me las filtra por categoría.

    ¿como se puede hacer?
    No veo como hacerlo.

    Muchas gracias,

  2. Hola buenas, este artículo es oro puro para lo que quiero hacer.

    De momento he hecho un script para web scrapping.

    Mi duda es, como puedo hacer para que ese scrypt actualice una entrada periodicamente cada vez que se ejecute el script?? (es para scrapping de ofertas de empleo, 1 actualizacion cada hora)

    Solo tengo esa duda como lo hago para editar las entradas.

    Y ya que pregunto, me gustaría que se añadiese un bloque de html personalizado para poder hacer una caja de empleo.

    me queda claro que wordpress dispone de consola con python instalable y que podria correr los scripts desde ahí.

    Gracias

Dejar un comentario