Tutoriales
TutorialesEjecutar traducciones por lotes usando WP-CLI

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:

  1. Un script principal que contiene la lógica para procesarlos por lotes (nunca cambia)
  2. 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:

VariableDescripción
userNombre de usuario de WordPress para ejecutar el comando (lo más habitual es admin)
subcommandSubcomando WP-CLI gatotranslate a ejecutar (post, media, term o menu)
batch_sizeNúmero de elementos a traducir en cada lote (por defecto 1)
itemsArray 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.sh

El script ejecutará el comando gatotranslate para todos los elementos, en lotes del tamaño especificado, mostrando información de progreso para cada lote.

Ejecutando el script 'gatotranslate.sh'
Ejecutando el script 'gatotranslate.sh'

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.

Notificaciones de log habilitadas por severidad
Notificaciones de log habilitadas por severidad

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

Ejecutando el script 'gatotranslate.sh' con el parámetro '--fail-if-log-notifications'
Ejecutando el script 'gatotranslate.sh' con el parámetro '--fail-if-log-notifications'

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 2

Avanzado: 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: " " )
  }
}
Creando la consulta 'Retrieve item IDs'
Creando la consulta 'Retrieve item IDs'

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:

Ejecutando la consulta 'Retrieve item IDs'
Ejecutando la consulta 'Retrieve item IDs'

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.