Tutorial
TutorialEseguire traduzioni in batch con WP-CLI

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:

  1. Uno script principale che contiene la logica per elaborarli in batch (non cambia mai)
  2. 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:

VariabileDescrizione
userNome utente WordPress per eseguire il comando (di solito admin)
subcommandSottocomando WP-CLI gatotranslate da eseguire (post, media, term o menu)
batch_sizeNumero di elementi da tradurre in ogni batch (per impostazione predefinita 1)
itemsArray 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.sh

Lo script eseguirà il comando gatotranslate per tutti gli elementi, in batch della dimensione specificata, mostrando le informazioni sull'avanzamento per ogni batch.

Esecuzione dello script 'gatotranslate.sh'
Esecuzione dello script 'gatotranslate.sh'

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.

Notifiche di log attivate per severità
Notifiche di log attivate per severità

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

Esecuzione dello script 'gatotranslate.sh' con il parametro '--fail-if-log-notifications'
Esecuzione dello script 'gatotranslate.sh' con il parametro '--fail-if-log-notifications'

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 2

Avanzato: 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: " " )
  }
}
Creazione della query 'Retrieve item IDs'
Creazione della query 'Retrieve item IDs'

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:

Esecuzione della query 'Retrieve item IDs'
Esecuzione della query 'Retrieve item IDs'

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.