Tutorials
TutorialsÜbersetzungen im Batch mit WP-CLI ausführen

Ü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:

  1. Ein Hauptskript, das die Logik zur Verarbeitung in Batches enthält (ändert sich nie)
  2. 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:

VariableBeschreibung
userWordPress-Benutzername zur Ausführung des Befehls (meistens admin)
subcommandWP-CLI-Unterbefehl gatotranslate zur Ausführung (post, media, term oder menu)
batch_sizeAnzahl der Elemente, die in jedem Batch übersetzt werden sollen (Standard ist 1)
itemsArray 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.sh

Das 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.

Ausführen des Skripts 'gatotranslate.sh'
Ausführen des Skripts 'gatotranslate.sh'

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.

Log-Benachrichtigungen nach Schweregrad aktiviert
Log-Benachrichtigungen nach Schweregrad aktiviert

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

Ausführen des Skripts 'gatotranslate.sh' mit dem Parameter '--fail-if-log-notifications'
Ausführen des Skripts 'gatotranslate.sh' mit dem Parameter '--fail-if-log-notifications'

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 2

Erweitert: 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: " " )
  }
}
Erstellen der Query 'Retrieve item IDs'
Erstellen der Query 'Retrieve item IDs'

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:

Ausführen der Query 'Retrieve item IDs'
Ausführen der Query 'Retrieve item IDs'

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.