Übersetzungen im Batch mit WP-CLI ausführen
Du kannst Übersetzungen im Batch mit WP-CLI und Bash-Skripten ausführen. Das ermöglicht es dir, die Übersetzungen im Hintergrund laufen zu lassen, während du an etwas anderem arbeitest.
Erstelle dazu zwei Bash-Skripte:
- Ein Hauptskript, das die Logik zur Verarbeitung in Batches enthält (ändert sich nie)
- Eine Konfigurationsdatei, die festlegt, welche Elemente übersetzt werden sollen (wird bei jedem Übersetzungsdurchlauf aktualisiert)
Hauptskript
Erstelle eine Datei namens gatotranslate.sh (Beispiel herunterladen), die die Logik zur Verarbeitung der Übersetzungen enthält:
Du kannst die Parameter, die an den gatotranslate-Befehl übergeben werden, anpassen (z.B.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, usw.).
#!/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 "----------------------------------------"Konfigurationsdatei
Erstelle eine Datei namens gatotranslate.config.sh (Beispiel herunterladen), die die Konfiguration für deine Batch-Übersetzung enthält:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Diese Datei muss die folgenden Variablen enthalten:
| Variable | Beschreibung |
|---|---|
user | WordPress-Benutzername zur Ausführung des Befehls (meistens admin) |
subcommand | WP-CLI-Unterbefehl gatotranslate zur Ausführung (post, media, term oder menu) |
batch_size | Anzahl der Elemente, die in jedem Batch übersetzt werden sollen (Standard ist 1) |
items | Array von IDs der zu übersetzenden Elemente (Beiträge, Tags, Kategorien, Medien, Menüs usw.) |
Skript ausführen
Führe den Befehl aus dem WordPress-Stammverzeichnis aus, wo der Befehl wp verfügbar ist.
Um die Batch-Übersetzung zu starten, führe folgenden Befehl aus:
bash +x gatotranslate.shDas Skript führt den gatotranslate-Befehl für alle Elemente in Batches der angegebenen Größe aus und zeigt dabei Fortschrittsinformationen für jeden Batch an.

Wenn das Skript erfolgreich abgeschlossen wird, gibt es einen einzelnen Piepton aus.
Ausführung bei einem Fehler stoppen
Damit das Skript automatisch anhält, wenn ein Fehler oder eine Warnung zu den Logs hinzugefügt wird, füge den Parameter --fail-if-log-notifications zum Befehl in gatotranslate.sh hinzu:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")Der Schweregrad der Log-Benachrichtigungen, die den Skriptstopp auslösen, ist der auf der Seite Settings > Plugin Configuration > Logs & Notifications konfigurierte.

Wenn das Skript aufgrund einer Log-Benachrichtigung stoppt, gibt es eine längere Pieptonfolge aus.

Nachdem du das Problem behoben hast, kannst du die Übersetzung ab dem Punkt fortsetzen, an dem sie fehlgeschlagen ist, indem du die Batch-Nummer als Argument übergibst.
So kannst du vermeiden, bereits erfolgreich übersetzte Elemente erneut zu verarbeiten, und sparst sowohl Zeit als auch API-Guthaben.
Wenn der Fehler beispielsweise bei Batch 2 aufgetreten ist, führe nach der Behebung des Problems folgenden Befehl aus:
bash +x gatotranslate.sh 2Erweitert: IDs der zu übersetzenden Elemente abrufen
Wenn du die Batch-Übersetzung konfigurierst, musst du die IDs der zu übersetzenden Elemente kennen.
Da das Plugin im Hintergrund Gato GraphQL verwendet, können wir bequem eine GraphQL-Query ausführen, um diese Informationen abzurufen.
Um GraphQL-Queries auszuführen, musst du zunächst den Advanced Mode aktivieren und auf das CPT Queries zugreifen. Siehe Hilfs-Queries erstellen für Anweisungen zur Aktivierung des Advanced Mode.
Füge einen neuen Queries-Eintrag mit dem Titel Retrieve item IDs und der folgenden GraphQL-Query hinzu:
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: " " )
}
}
Je nachdem, welche Entitäten du übersetzen möchtest, musst du die entsprechende Operation in der Query konfigurieren und ausführen.
Um beispielsweise die IDs der Beitragskategorien abzurufen, musst du die Operation RetrieveIDsForCategories ausführen und die Taxonomie category als Argument übergeben:

Aus der JSON-Antwort werden die IDs der zu übersetzenden Elemente im Eintrag data.compiledData.ids ausgegeben (im Bild hervorgehoben). Kopiere diesen String und speichere ihn im Array items der Konfigurationsdatei.