Ejecutar traducciones por lotes usando WP-CLI
Puedes ejecutar traducciones por lotes usando WP-CLI mediante scripts bash. Esto te permite ejecutar las traducciones en segundo plano mientras trabajas en otra cosa.
Para hacerlo, crea dos scripts bash:
- Un script principal que contiene la lógica para procesarlos por lotes (nunca cambia)
- Un archivo de configuración que define qué elementos traducir (a actualizar en cada ejecución de traducción)
Script principal
Crea un archivo llamado gatotranslate.sh (descargar muestra) que contenga la lógica para procesar las traducciones:
Puedes personalizar los parámetros pasados al comando gatotranslate (p. ej.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, etc.).
#!/bin/bash
# ------------------------------------------------------------------------------------------------
# Load configuration
# ------------------------------------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/gatotranslate.config.sh"
# ------------------------------------------------------------------------------------------------
# Arguments
# ------------------------------------------------------------------------------------------------
# (Optional) Provide the start batch number as an argument, default is 1
start_batch=${1:-1}
# ------------------------------------------------------------------------------------------------
# Logic
# ------------------------------------------------------------------------------------------------
batch_size=${batch_size:-1} # If not provided, default to 1
total_items=${#items[@]}
total_batches=$(((total_items + batch_size - 1) / batch_size))
start_batch_index=$(((start_batch - 1) * batch_size))
echo "----------------------------------------"
echo "Translating $subcommand items"
echo "----------------------------------------"
echo "Batch size: $batch_size"
echo "Total items: $total_items"
echo "Total batches: $total_batches"
echo "Starting from batch number: $start_batch"
echo "----------------------------------------"
for ((start=start_batch_index; start<total_items; start+=batch_size)); do
# Get the next batch of items
batch=("${items[@]:$start:$batch_size}")
echo "Processing batch #$((start/batch_size + 1))"
# Pass all items in the batch as separate arguments
cmd=$(printf 'wp gatotranslate %s "%s" --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")
echo "Command: $cmd"
eval $cmd
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo -e "\a\a\a\a\a"
exit 1
fi
done
# Finished successfully
echo -e "\a"
echo "----------------------------------------"
echo "Finished successfully 👏"
echo "----------------------------------------"Archivo de configuración
Crea un archivo llamado gatotranslate.config.sh (descargar muestra) que contenga la configuración para tu traducción por lotes:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Este archivo debe contener las siguientes variables:
| Variable | Descripción |
|---|---|
user | Nombre de usuario de WordPress para ejecutar el comando (lo más habitual es admin) |
subcommand | Subcomando WP-CLI gatotranslate a ejecutar (post, media, term o menu) |
batch_size | Número de elementos a traducir en cada lote (por defecto 1) |
items | Array de IDs de los elementos a traducir (entradas, etiquetas, categorías, media, menús, etc.) |
Ejecutar el script
Ejecuta desde el directorio raíz de WordPress, donde el comando wp está disponible.
Para ejecutar la traducción por lotes, ejecuta:
bash +x gatotranslate.shEl script ejecutará el comando gatotranslate para todos los elementos, en lotes del tamaño especificado, mostrando información de progreso para cada lote.

Cuando el script termina correctamente, emite un único pitido.
Detener la ejecución en caso de error
Para hacer que el script se detenga automáticamente cada vez que se añada un error o aviso a los logs, añade el parámetro --fail-if-log-notifications al comando en gatotranslate.sh:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")La severidad de las notificaciones de log que desencadenan la detención del script son las configuradas en la página Settings > Plugin Configuration > Logs & Notifications.

Cuando el script se detiene debido a una notificación de log, emite una secuencia extendida de pitidos.

Tras corregir el problema, puedes reanudar la traducción desde el punto en que falló pasando el número de lote como argumento.
De este modo, puedes evitar volver a procesar elementos que ya se hayan traducido correctamente, ahorrando tiempo y crédito de API.
Por ejemplo, si el fallo se produjo en el lote 2, tras corregir el problema, ejecuta:
bash +x gatotranslate.sh 2Avanzado: Obtener los IDs de los elementos a traducir
Al configurar la traducción por lotes, necesitas conocer los IDs de los elementos a traducir.
Dado que el plugin ejecuta Gato GraphQL internamente, podemos ejecutar cómodamente una consulta GraphQL para obtener esta información.
Para ejecutar consultas GraphQL, primero debes habilitar el Advanced Mode y acceder al CPT Queries. Consulta Crear consultas de ayuda para obtener instrucciones sobre cómo habilitar el Advanced Mode.
Añade una nueva entrada en Queries, con título Retrieve item IDs, y la siguiente consulta GraphQL:
query RetrieveIDsForCustomPosts {
customPosts(
filter: {
#########################################################
### Configure which CPTs to retrieve ###
customPostTypes: [ "post", "page" ],
#########################################################
polylangLanguagesBy: { predefined: DEFAULT }
},
pagination: { limit: -1 },
sort: { by: DATE, order: DESC }
) @export(as: "ids") {
id
title
customPostType
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForCategories {
categories(
#########################################################
### Configure which taxonomy to retrieve ###
taxonomy: "category",
#########################################################
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
taxonomy
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForTags {
tags(
#########################################################
### Configure which taxonomy to retrieve ###
taxonomy: "post_tag",
#########################################################
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
taxonomy
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
query RetrieveIDsForMedia {
mediaItems(
filter: { polylangLanguagesBy: { predefined: DEFAULT } },
pagination: { limit: -1 },
sort: { by: DATE, order: DESC }
) @export(as: "ids") {
id
title
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
#################################################################################################
# Watch out: This will bring all menus, not just the ones in the origin language.
# Translated menus are those with a location containing the "___" string,
# e.g.: "header___es", "footer___fr", etc.
#################################################################################################
query RetrieveIDsForMenus {
menus(
pagination: { limit: -1 },
sort: { by: NAME, order: DESC }
) @export(as: "ids") {
id
name
locations
}
compiledData: self {
ids: _arrayJoin( array: $ids, separator: " " )
}
}
En función de qué entidades quieras traducir, deberás configurar y ejecutar la operación correspondiente en la consulta.
Por ejemplo, para obtener los IDs de las categorías de entradas, deberás ejecutar la operación RetrieveIDsForCategories, pasando la taxonomía category como argumento:

A partir de la respuesta JSON, los IDs de los elementos a traducir se imprimen en la entrada data.compiledData.ids (resaltada en la imagen). Copia esa cadena y guárdala en el array items del archivo de configuración.