Eseguire traduzioni in batch con WP-CLI
Puoi eseguire traduzioni in batch con WP-CLI utilizzando degli script bash. Questo ti permette di lanciare le traduzioni in background mentre lavori su qualcos'altro.
Per farlo, crea due script bash:
- Uno script principale che contiene la logica per elaborarli in batch (non cambia mai)
- Un file di configurazione che definisce gli elementi da tradurre (da aggiornare a ogni esecuzione della traduzione)
Script principale
Crea un file chiamato gatotranslate.sh (scarica l'esempio) che contiene la logica per elaborare le traduzioni:
Puoi personalizzare i parametri passati al comando gatotranslate (es.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, ecc.).
#!/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 "----------------------------------------"File di configurazione
Crea un file chiamato gatotranslate.config.sh (scarica l'esempio) che contiene la configurazione della tua traduzione in batch:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Questo file deve contenere le seguenti variabili:
| Variabile | Descrizione |
|---|---|
user | Nome utente WordPress per eseguire il comando (di solito admin) |
subcommand | Sottocomando WP-CLI gatotranslate da eseguire (post, media, term o menu) |
batch_size | Numero di elementi da tradurre in ogni batch (per impostazione predefinita 1) |
items | Array di ID degli elementi da tradurre (articoli, tag, categorie, media, menu, ecc.) |
Eseguire lo script
Esegui dalla directory radice di WordPress, dove è disponibile il comando wp.
Per lanciare la traduzione in batch, esegui:
bash +x gatotranslate.shLo script eseguirà il comando gatotranslate per tutti gli elementi, in batch della dimensione specificata, mostrando le informazioni sull'avanzamento per ogni batch.

Quando lo script termina con successo, emette un singolo segnale acustico.
Interrompere l'esecuzione in caso di errore
Per fare in modo che lo script si interrompa automaticamente ogni volta che un errore o un avviso viene aggiunto ai log, aggiungi il parametro --fail-if-log-notifications al comando in gatotranslate.sh:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")La severità delle notifiche di log che attivano l'arresto dello script è quella configurata nella pagina Settings > Plugin Configuration > Logs & Notifications.

Quando lo script si arresta a causa di una notifica di log, emette una sequenza prolungata di segnali acustici.

Dopo aver risolto il problema, puoi riprendere la traduzione dal punto in cui si è interrotta passando il numero del batch come argomento.
In questo modo puoi evitare di rielaborare elementi già tradotti con successo, risparmiando sia tempo che crediti API.
Ad esempio, se l'errore si è verificato al batch 2, dopo aver risolto il problema, esegui:
bash +x gatotranslate.sh 2Avanzato: recuperare gli ID degli elementi da tradurre
Quando configuri la traduzione in batch, devi conoscere gli ID degli elementi da tradurre.
Poiché il plugin esegue Gato GraphQL dietro le quinte, possiamo comodamente eseguire una query GraphQL per recuperare questa informazione.
Per eseguire queries GraphQL, devi prima attivare la Advanced Mode e accedere al CPT Queries. Consulta Creare queries di supporto per le istruzioni su come attivare la Advanced Mode.
Aggiungi una nuova voce Queries, con il titolo Retrieve item IDs, e la seguente query 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: " " )
}
}
A seconda delle entità che vuoi tradurre, dovrai configurare ed eseguire l'operazione corrispondente nella query.
Ad esempio, per recuperare gli ID delle categorie di articoli, dovrai eseguire l'operazione RetrieveIDsForCategories, passando la tassonomia category come argomento:

Dalla risposta JSON, gli ID degli elementi da tradurre sono stampati nella voce data.compiledData.ids (evidenziata nell'immagine). Copia quella stringa e memorizzala nell'array items del file di configurazione.