Запуск пакетного перевода с помощью WP-CLI
Вы можете запускать переводы пакетами с помощью WP-CLI, используя bash-скрипты. Это позволяет выполнять переводы в фоновом режиме, пока вы занимаетесь чем-то другим.
Для этого создайте два bash-скрипта:
- Основной скрипт, содержащий логику пакетной обработки (он никогда не изменяется)
- Файл конфигурации, определяющий, какие элементы переводить (обновляется при каждом запуске перевода)
Основной скрипт
Создайте файл с именем gatotranslate.sh (скачать образец), содержащий логику обработки переводов:
Вы можете настраивать параметры, передаваемые команде gatotranslate (например: --status-to-update=draft, --status-when-translated=same-as-origin, --parts=properties и т. д.).
#!/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 "----------------------------------------"Файл конфигурации
Создайте файл с именем gatotranslate.config.sh (скачать образец), содержащий конфигурацию для вашего пакетного перевода:
user="admin"
subcommand="post"
batch_size=1
items=(
4118
4117
4116
3739
)Этот файл должен содержать следующие переменные:
| Переменная | Описание |
|---|---|
user | Имя пользователя WordPress для выполнения команды (как правило, admin) |
subcommand | Подкоманда WP-CLI gatotranslate для выполнения (post, media, term или menu) |
batch_size | Количество элементов для перевода в каждом пакете (по умолчанию 1) |
items | Массив идентификаторов элементов для перевода (записи, теги, категории, медиафайлы, меню и т. д.) |
Выполнение скрипта
Выполняйте из корневого каталога WordPress, где доступна команда wp.
Чтобы запустить пакетный перевод, выполните:
bash +x gatotranslate.shСкрипт выполнит команду gatotranslate для всех элементов пакетами заданного размера, отображая информацию о ходе выполнения для каждого пакета.

Когда скрипт завершается успешно, он издаёт один звуковой сигнал.
Остановка выполнения при возникновении ошибки
Чтобы скрипт автоматически останавливался при каждом появлении ошибки или предупреждения в журналах, добавьте параметр --fail-if-log-notifications к команде в gatotranslate.sh:
cmd=$(printf 'wp gatotranslate %s "%s" --fail-if-log-notifications --status-to-update=any --user=%s' "$subcommand" "${batch[*]}" "$user")Серьёзность уведомлений журнала, при которой срабатывает остановка скрипта, определяется настройками на странице Settings > Plugin Configuration > Logs & Notifications.

Когда скрипт останавливается из-за уведомления журнала, он издаёт расширенную последовательность звуковых сигналов.

После устранения проблемы вы можете возобновить перевод с того места, где он прервался, передав номер пакета в качестве аргумента.
Таким образом, вы избегаете повторной обработки уже успешно переведённых элементов, экономя как время, так и кредиты API.
Например, если сбой произошёл на пакете 2, после устранения проблемы выполните:
bash +x gatotranslate.sh 2Дополнительно: получение идентификаторов элементов для перевода
При настройке пакетного перевода необходимо знать идентификаторы элементов, которые нужно перевести.
Поскольку плагин использует Gato GraphQL под капотом, мы можем удобно выполнить GraphQL-запрос для получения этой информации.
Чтобы выполнять GraphQL-запросы, необходимо сначала включить Advanced Mode и перейти к CPT Queries. См. раздел Создание вспомогательных запросов для получения инструкций по включению Advanced Mode.
Добавьте новую запись в Queries с заголовком Retrieve item IDs и следующим 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: " " )
}
}
В зависимости от того, какие сущности вы хотите перевести, вам нужно настроить и выполнить соответствующую операцию в запросе.
Например, чтобы получить идентификаторы категорий записей, необходимо выполнить операцию RetrieveIDsForCategories, передав таксономию category в качестве аргумента:

В ответе JSON идентификаторы элементов для перевода выводятся в записи data.compiledData.ids (выделено на изображении). Скопируйте эту строку и сохраните её в массиве items файла конфигурации.