Software

Modificar artículos de WordPress vía comandos MySQL

Modificar artículos de WordPress via comandos de MySQL, se me ocurrió tras buscar plugins para añadir una advertencia a los posts antiguos, ya que al ser temas de Internet, programación y sistemas, la relevancia del tiempo es muy grande. No soy amigo de los plugins pues he aprendido, que en WordPress, un plugin puede ser la antesala de muchos problemas y localizarlos y encontrarlos se traduce en muchas horas de trabajo perdido, y lo que se suponía un software para hacer fácil tu trabajo, acaba siendo un odioso monstruo devorador de tu tiempo profesional. Así que decidí, hacerlo modificar directamente la base de datos.

Modificar posts en WordPress via cron shell

Añadir texto a la tabla posts

En nuestro caso queríamos añadir un shortcode para mostrar un texto destacado en modo warning, que advirtiera de la antigüedad del artículo, y también tras deshabilitar un molesto plugin para compartir artículos (Social Plugin) que no conseguía ajustar su javascript para ser optimizado, otro shortcode interno de el tema que usamos, X Theme.

Para la fecha necesitábamos calcular la fecha, y decimos que todos los post más antiguos de dos años, llevarán esa advertencia. Además no debería repetirse el texto, ya que pasaríamos la tarea cron todas las noches (un poco antes de la media noche para no complicarnos mucho en el código)

# Fecha: Mayor de dos años
# Texto a añadir: [shortcode heading="Titulo del shortcode" type="algunvalor"]Algún texto de advertencia[/shortcode]
# Nombre de la BD: myuser_mydb
# Prefijo de las tablas de wordpress: xf

mysql -e "UPDATE myuser_mydb.xf_posts 
SET post_content = CONCAT_WS(CHAR(10 USING UTF8), post_content, '[shortcode heading=\"Titulo del shortcode\" type=\"algunvalor\"]Algún texto de advertencia[/shortcode]') 
WHERE post_status = 'publish' AND post_type = 'post' AND post_date < '$(echo `date +%Y` - 2 | bc)/$(date +%m)/$(date +%d)' 
AND post_content NOT LIKE ('%[shortcode heading=\"Titulo del shortcode\" type=\"algunvalor\"]Algún texto de advertencia[/shortcode]%')"

Añadir el texto cada post

Para ello usamos UPDATE y SET, y escapamos las comillas dobles con \"

SET post_content = CONCAT_WS(CHAR(10 USING UTF8), post_content, '[shortcode heading=\"Titulo del shortcode\" type=\"algunvalor\"]Algún texto de advertencia[/shortcode]')

Condiciones para elegir los post que modificaremos

La condición es que sea un articulo mayor de 2 años de antigüedad (publicación, no última edición). Para ello calcularemos con shell script el valor de la fecha que añadiremos a la parte de la secuencia de comando sql que hará la selección.

Deberá ser un artículo cuyo estado sea publish (publicado), del tipo post (artículo) y de fecha de publicación inferior a dos años en el momento de ejecutarse el script.

 WHERE post_status = 'publish' AND post_type = 'post' AND post_date < '$(echo `date +%Y` - 2 | bc)/$(date +%m)/$(date +%d)'

Para evitar la duplicidad del código deberemos añadir una ultima condición. El campo post_content no deberá contener el mismo código

AND post_content NOT LIKE ('%[shortcode heading=\"Titulo del shortcode\" type=\"algunvalor\"]Algún texto de advertencia[/shortcode]%')"

Ejecución en consola o en tarea cron

Podemos ejecutar el comando en consola o en tarea cron, ya sea como una única linea de comando o añadiéndolo a una bash script donde tenemos más operaciones a realizar en la misma tarea.

Permisos de ejecución de comandos mysql

Pero el comando no tiene permisos, no es el típico comando que veo en todos los post sobre comandos mysql desde el shell. Claro, tanto copiar y pegar hace una internet a veces, un poco sosa y vacía de nuevas y mejores ideas.

En mi trabajo, uso otras alternativas como  mysql_config_editor para crear el fichero .mylogin.cnf y otros casos directamente uso .my.cnf. Puedes encontrar más información sobre esto y sobre la inseguridad que es, el método propuesto por la mayoría, que consiste en añadir el usuario y la contraseña en el comando a ejecutar, en End-User Guidelines for Password Security

Ejemplo de inseguridad en la ejecución de comandos MySQL

mysql -u " -e "ALGUN CODIGO"

Otro trabajo: Eliminar algún código o modificarlo

En este caso sólo queremos eliminar un código de ciertos post de WordPress

mysql -e "UPDATE myuser_mydb.xf_posts SET post_content = REPLACE(post_content,'

Share this Post

','') WHERE post_type = 'page'" # UPDATE database.table SET field = REPLACE(field,'Texto a reemplazar','Texto de reemplazo') WHERE "algunas condiciones"
Hosting con SSH
Un hosting sin SSH es como un jardín sin flores. Señal inequívoca que tras esa ausencia, viene otras deficiencias ya sea, por la ausencia de otras facilidades, la incorporación de mecanismos orientados a capar por debajo al usuario o incluso una deficitaria formación de los encargados de sistemas de dicha empresa. Bajo la letra de sus marketing, subyace, casi siempre, el trato al cliente que les interesa, y dando largas al que no les interesa. Sin SSH estamos obligados a realizar muchas operaciones, mediante aplicaciones web de terceros, que en determinadas circunstancias, son un verdadero handicap para nuestro trabajo. Yo, no podría trabajar sin SSH, rsync, scp, o sin poder ver los logs de apache en tiempo real.

Imagen original Designed by Freepik'> by Freepik diseñada por StartLine y retocada por Abdelkarim Mateos

Comparte este artículo

Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.

Comparte este articulo en

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Ver comentarios

Entradas recientes

Youtube – Mod Security en DirectAdmin. Conocerlo y gestionarlo en el panel de control DirectAdmin.

¡Hola a todos! Vamos a sumergirnos en el fascinante mundo de Mod Security y aprender…

1 semana hace

Apertura del canal Youtube, Tecno Boomer, dedicado al mundo del hosting

Ya son muchos años en el sector, muchos años pasando por varios paneles de control,…

2 semanas hace

El Uso de la Lista UCEPROTECT en los Niveles 2 y 3: Una Falacia de Causa Cuestionable

La lista UCEPROTECT es una herramienta utilizada por muchos administradores de sistemas y proveedores de…

2 meses hace

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

9 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

1 año hace

MySQL no inicia debido a errores en la base de datos interna de MySQL

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…

1 año hace