Tiempo de lectura aprox: 2 minutos, 14 segundos
Mantenimiento repetitivo.
En ocasiones veo…. Aparte del «gracejo», en ocasiones hay que realizar tareas de mantenimiento, como apuntaba en ¿Necesita mantenimiento el WordPress? y, hay algunas tareas más delicadas que requieren un mayor conocimiento.
El mantenimiento repetitivo
Se trata de tareas esporádicas pero que al ser repetitivas estaría bien poder automatizar.
Un ejemplo de esas tareas, sería la «optimización de la base de datos». Es una tarea que debe hacerse pero cuya frecuencia dependerá de muchos factores como la intensidad del uso, el tipo de motor SQL, la capacidad del servidor, y muchos más.
Claro que existen plugin que pueden hacer esa tarea por nosotros, pero para quién quiera aprender, contaré cómo se puede realizar.
La verdad es que el ejemplo de optimización de la base de datos, quizá no sea el mejor, ya que no se puede establecer a priori cuando será necesario realizar esta tarea, pero vamos allá.
WordPress cuenta con una función llamada cron, que programa las funciones para que se ejecuten a intervalos específicos (diario, semanal, etc.); esto lo vamos a aprovechar para que realice la labor de ejecutar la limpieza.
Como hemos dicho en ¿functions.php o plugin?, podemos insertar estas funciones en cualquiera de ellos; yo recomiendo hacerlo en un plugin.
Empezamos definiendo la tarea que queremos realizar, la función que realizará la optimización y luego, haremos la función que hace uso del cron para programar la periodicidad.
La tarea de optimización
Si fuéramos a realizar esta acción manualmente, deberíamos acceder al administrador SQL de nuestra elección (phpmyadmin, Webmin, SSMS …) introducir nuestras credenciales y, seleccionar la base de datos.
Como estamos dentro de WordPress, la base de datos y las tablas están dentro del propio entorno, así que lo único que necesitamos es que la función sepa dónde debe realizar el trabajo.
Para eso, usamos una variable global que WordPress pone a nuestra disposición, se trata de WPDB. En realidad, interactuaremos con la clase $wpdb.
La clase $wpdb tiene varios métodos que podemos ver en el manual (Class Reference/wpdb) pero en esta ocasión sólo nos interesa uno: get_results, que con los parámetros «SHOW TABLES» y «ARRAY_A» nos devolverá una matriz asociativa de todos los nombres de tabla en la base de datos.
Con el arreglo obtenido, realizamos un bucle foreach recorriendo los valores y realizando la acción de «OPTIMIZE TABLE» en cada uno.
Así, la función que necesitamos será:
//Optimize Database function optimize_database(){ global $wpdb; $all_tables = $wpdb->get_results('SHOW TABLES',ARRAY_A); foreach ($all_tables as $tables){ $table = array_values($tables); $wpdb->query("OPTIMIZE TABLE ".$table[0]); } }
Hasta aquí todo bien, tenemos ya la función que realizará un recorrido por todas las tablas contenidas en la base de datos e intentará optimizarlas.
Pero esta función no será ejecutada nuca, no tenemos nada que la llame. Es aquí donde necesitamos del cron. Haremos pues, una función que incorpore en las tareas programadas, una «nueva entrada en la agenda».
La función que nos permite crear una nueva tarea en la agenda es: wp_schedule_event() y haciendo uso de ella, escribimos la función:
function simple_optimization_cron_on(){ wp_schedule_event(time(), 'daily', 'optimize_database'); }
Con esta sencilla función, hemos programado una nueva tarea de ejecución diaria («’daily’») que llama a nuestra función de limpieza, «optimize_database()».
Pero cuidado, esto es inestable, si solo hacemos la inclusión de la tarea, puede llegar a multiplicarse hasta no hacer otra cosa.
Para solucionar este problema, WordPress nos ofrece un conjunto de ganchos específicos, que resuelven este problema.
Se trata de las funciones register_activation_hook y register_deactivation_hook. Estas funciones se invocan cuando un complemento esta activado y desactivado. Nos permitirán hacer que nuestra función sólo se invoque una vez.
Para eliminar la función de la agenda, usaremos:
function simple_optimization_cron_off(){ wp_clear_scheduled_hook('optimize_database'); } register_activation_hook(__FILE__,'simple_optimization_cron_on'); register_deactivation_hook(__FILE__,'simple_optimization_cron_off');
En el próximo artículo, usaremos este ejemplo para explicar cómo crear un plugin.
¡Gracias por leernos!
¡Tus comentarios y preguntas nos ayudan a mejorar, por favor comenta!