Uruchamianie tłumaczeń wsadowych za pomocą WP-CLI
Możesz uruchamiać tłumaczenia wsadowe za pomocą WP-CLI, używając skryptów bash. Pozwala to uruchamiać tłumaczenia w tle, podczas gdy pracujesz nad czymś innym.
Aby to zrobić, utwórz dwa skrypty bash:
- Główny skrypt zawierający logikę przetwarzania wsadowego (nigdy się nie zmienia)
- Plik konfiguracyjny definiujący, które elementy mają być tłumaczone (aktualizowany przy każdym uruchomieniu tłumaczenia)
Główny skrypt
Utwórz plik o nazwie gatotranslate.sh (pobierz przykład) zawierający logikę przetwarzania tłumaczeń:
Możesz dostosować parametry przekazywane do polecenia gatotranslate (np.: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties, itd.).
#!/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 "----------------------------------------"Plik konfiguracyjny
Utwórz plik o nazwie gatotranslate.config.sh (pobierz przykład) zawierający konfigurację dla tłumaczenia wsadowego:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Ten plik musi zawierać następujące zmienne:
| Zmienna | Opis |
|---|---|
user | Nazwa użytkownika WordPress do wykonania polecenia (zazwyczaj admin) |
subcommand | Podpolecenie WP-CLI gatotranslate do wykonania (post, media, term lub menu) |
batch_size | Liczba elementów do przetłumaczenia w każdej partii (domyślnie 1) |
items | Tablica identyfikatorów elementów do przetłumaczenia (wpisy, tagi, kategorie, media, menu itd.) |
Uruchamianie skryptu
Uruchom z katalogu głównego WordPress, gdzie dostępne jest polecenie wp.
Aby uruchomić tłumaczenie wsadowe, wykonaj:
bash +x gatotranslate.shSkrypt wykona polecenie gatotranslate dla wszystkich elementów, w partiach o określonym rozmiarze, wyświetlając informacje o postępie dla każdej partii.

Gdy skrypt zakończy działanie pomyślnie, emituje pojedynczy sygnał dźwiękowy.
Zatrzymywanie wykonania w przypadku błędu
Aby skrypt zatrzymywał się automatycznie za każdym razem, gdy do logów zostanie dodany błąd lub ostrzeżenie, dodaj parametr --fail-if-log-notifications do polecenia w gatotranslate.sh:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")Poziom ważności powiadomień logów wyzwalających zatrzymanie skryptu jest skonfigurowany na stronie Settings > Plugin Configuration > Logs & Notifications.

Gdy skrypt zatrzyma się z powodu powiadomienia logu, emituje rozszerzoną sekwencję sygnałów dźwiękowych.

Po naprawieniu problemu możesz wznowić tłumaczenie od miejsca, w którym wystąpił błąd, przekazując numer partii jako argument.
W ten sposób możesz uniknąć ponownego przetwarzania elementów, które zostały już pomyślnie przetłumaczone, oszczędzając zarówno czas, jak i kredyty API.
Na przykład, jeśli błąd wystąpił w partii 2, po naprawieniu problemu wykonaj:
bash +x gatotranslate.sh 2Zaawansowane: pobieranie identyfikatorów elementów do przetłumaczenia
Podczas konfigurowania tłumaczenia wsadowego musisz znać identyfikatory elementów do przetłumaczenia.
Ponieważ wtyczka uruchamia Gato GraphQL pod maską, możemy wygodnie wykonać query GraphQL, aby pobrać te informacje.
Aby wykonywać queries GraphQL, musisz najpierw włączyć Advanced Mode i uzyskać dostęp do CPT Queries. Zobacz Tworzenie pomocniczych queries, aby dowiedzieć się, jak włączyć Advanced Mode.
Dodaj nowy wpis w Queries, z tytułem Retrieve item IDs, i następującym 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: " " )
}
}
W zależności od tego, jakie encje chcesz przetłumaczyć, musisz skonfigurować i wykonać odpowiednią operację w query.
Na przykład, aby pobrać identyfikatory kategorii wpisów, musisz wykonać operację RetrieveIDsForCategories, przekazując taksonomię category jako argument:

Z odpowiedzi JSON identyfikatory elementów do przetłumaczenia są wyświetlane we wpisie data.compiledData.ids (zaznaczonym na obrazku). Skopiuj ten ciąg i zapisz go w tablicy items w pliku konfiguracyjnym.