Si tienes un sitio web WordPress con una gran cantidad de datos, seguramente has podido comprobar que cuando corres código personalizado sobre esos datos terminas recargando tu servidor y en algunos casos puede incluso quedar el proceso incompleto.
Generalidades
En WordPress tienes dos opciones por defecto para procesar gran cantidad de datos:
- La primera es hacer uso de wp-cli, sin embargo no todos los Hosting tienen esta funcionalidad habilitada (por temas de seguridad) o no brindan acceso SSH a consola.
- La otra opción para procesar gran cantidad de datos es a través de la funcionalidad wp-cron, aunque el procesamiento dependerá del cron programado.
En este artículo veremos una forma alterna, veremos como procesar gran cantidad de datos por lotes ayudándonos del plugin Locomotive
¿Qué es Locomotive?
Locomotive es una librería de procesamiento en lotes creada como plugin que te ayuda a gestionar la complejidad de hacer cambios a grandes cantidades de datos.

Locomotive automáticamente divide una consulta, que implica la recuperación de muchos datos, en pequeñas consultas, cuando se ejecuta cada consulta nos brinda una función callback en la cual puedes agregar tu código personalizado.
La facilidad de Locomotive es que se instala como plugin y esta disponible desde la administración de WordPress, puedes registrar la cantidad de tareas que necesites y correr tu código por lotes cuando lo requieras, tal como se muestra en la siguiente imagen.

Descarga e Instalación
Puedes descargar el plugin desde el repositorio del autor en Github: Locomotive

Descargará un archivo .zip el cual puedes instalar desde WordPress en el menú: PLugins > Añadir nuevo.
Una vez el plugin esta instalado y activado, verás una nueva opción de menú como parte del menú de Herramientas

Creación de Proceso por lotes
Para configurar un proceso por lotes usaremos un Hook llamado locomotive_init, este hook hará referencia a una función en donde se usará una función de registro del proceso de batch llamada register_batch_process.
La sintaxis básica es:
function dcms_register_my_batch_processes() {
register_batch_process(
'name' => '',
'type' => '',
'args' => array(),
'callback' => ''
);
}
add_action( 'locomotive_init', 'dcms_register_my_batch_processes' );
La función register_batch_process tiene varios argumentos
- name: El nombre del proceso que aparecerá como parte del listado de procesos que puede ejecutar el plugin. Evita el uso de caracteres especiales como nombre del proceso.
- type: Hace referencia al tipo de datos que se devolverá en el callback, los posibles valores son: post, user, comment, term, site (en el caso de un multisite)
- args: Usado para pasar parámetros adicionales a la consulta que se genera en base a type, funcionará cualquier parámetro que use la clase WP_Query
- callback: Esta es la función que se ejecutará por cada registro devuelto, acepta como parámetro un objeto del type definido
Ejemplo de creación de Proceso por Lotes
En este sencillo ejemplo vamos a contar la cantidad de caracteres de cada una de las entradas, al final reportaremos el título de la entrada y la cantidad de caracteres por cada una de ellas.
// Creación del proceso por lotes
function dcms_my_batch_process() {
register_batch_process( array(
'name' => 'Cuenta caracteres entradas',
'type' => 'post',
'callback' => 'dcms_count_chars_entries',
'args' => array(
'posts_per_page' => 10,
'post_type' => 'post',
'post_status' => 'publish'
)
) );
}
add_action( 'locomotive_init', 'dcms_my_batch_process' );
// Callback por cada entrada
function dcms_count_chars_entries( $post ) {
// Lógica para contar caracteres
$content = $post->post_content;
$string = strip_tags($content);
$string = preg_replace("/\s/", "", $string);
$character_count = strlen($string);
// Imprimimos los resultados
$print = $post->post_title .' - '. $character_count;
error_log( print_r( $print , true ));
}
Luego de agregar este código verás que tendrás un nuevo proceso por lotes disponible para ejecutar.

Conclusión
Procesar por lotes una gran cantidad de datos en WordPress no tiene por que ser una tarea compleja, puedes usar Locomotive y evitar realizar la funcionalidad de proceso por lotes y sólo concentrarte en realizar tu código.