Exécuter des traductions par lots avec WP-CLI
Vous pouvez exécuter des traductions par lots avec WP-CLI en utilisant des scripts bash. Cela vous permet de lancer les traductions en arrière-plan pendant que vous travaillez sur autre chose.
Pour ce faire, créez deux scripts bash :
- Un script principal qui contient la logique pour les traiter par lots (il ne change jamais)
- Un fichier de configuration qui définit les éléments à traduire (à mettre à jour à chaque exécution de traduction)
Script principal
Créez un fichier nommé gatotranslate.sh (télécharger l'exemple) qui contient la logique pour traiter les traductions :
Vous pouvez personnaliser les paramètres passés à la commande gatotranslate (ex. : --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 "----------------------------------------"Fichier de configuration
Créez un fichier nommé gatotranslate.config.sh (télécharger l'exemple) qui contient la configuration de votre traduction par lots :
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Ce fichier doit contenir les variables suivantes :
| Variable | Description |
|---|---|
user | Nom d'utilisateur WordPress pour exécuter la commande (généralement admin) |
subcommand | Sous-commande WP-CLI gatotranslate à exécuter (post, media, term ou menu) |
batch_size | Nombre d'éléments à traduire dans chaque lot (par défaut 1) |
items | Tableau d'IDs des éléments à traduire (articles, étiquettes, catégories, médias, menus, etc.) |
Exécuter le script
Exécutez depuis le répertoire racine de WordPress, où la commande wp est disponible.
Pour lancer la traduction par lots, exécutez :
bash +x gatotranslate.shLe script exécutera la commande gatotranslate pour tous les éléments, par lots de la taille spécifiée, en affichant les informations de progression pour chaque lot.

Lorsque le script se termine avec succès, il émet un seul bip sonore.
Arrêter l'exécution en cas d'erreur
Pour que le script s'arrête automatiquement chaque fois qu'une erreur ou un avertissement est ajouté aux logs, ajoutez le paramètre --fail-if-log-notifications à la commande dans gatotranslate.sh :
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")La sévérité des notifications de log qui déclenchent l'arrêt du script est celle configurée dans la page Settings > Plugin Configuration > Logs & Notifications.

Lorsque le script s'arrête en raison d'une notification de log, il émet une séquence de bips prolongée.

Après avoir corrigé le problème, vous pouvez reprendre la traduction à partir du point où elle a échoué en passant le numéro de lot comme argument.
De cette façon, vous pouvez éviter de retraiter des éléments déjà traduits avec succès, en économisant à la fois du temps et des crédits d'API.
Par exemple, si l'échec s'est produit au lot 2, après avoir corrigé le problème, exécutez :
bash +x gatotranslate.sh 2Avancé : Récupérer les IDs des éléments à traduire
Lors de la configuration de la traduction par lots, vous devez connaître les IDs des éléments à traduire.
Puisque le plugin exécute Gato GraphQL en coulisses, nous pouvons exécuter commodément une requête GraphQL pour récupérer cette information.
Pour exécuter des queries GraphQL, vous devez d'abord activer le Advanced Mode et accéder au CPT Queries. Consultez Créer des queries d'assistance pour les instructions sur la façon d'activer le Advanced Mode.
Ajoutez une nouvelle entrée Queries, avec le titre Retrieve item IDs, et la requête GraphQL suivante :
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: " " )
}
}
Selon les entités que vous souhaitez traduire, vous devrez configurer et exécuter l'opération correspondante dans la query.
Par exemple, pour récupérer les IDs des catégories d'articles, vous devrez exécuter l'opération RetrieveIDsForCategories, en passant la taxonomie category comme argument :

À partir de la réponse JSON, les IDs des éléments à traduire sont imprimés dans l'entrée data.compiledData.ids (mise en évidence dans l'image). Copiez cette chaîne et stockez-la dans le tableau items du fichier de configuration.