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.
Contenidos
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,'','') WHERE post_type = 'page'" # UPDATE database.table SET field = REPLACE(field,'Texto a reemplazar','Texto de reemplazo') WHERE "algunas condiciones"Share this Post
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
Comments 1
Pingback: Mysql comandos shell: Ejecutar comandos en el cliente mysql - Tamainut