Учебники
УчебникиЗапуск пакетного перевода с помощью WP-CLI

Запуск пакетного перевода с помощью WP-CLI

Вы можете запускать переводы пакетами с помощью WP-CLI, используя bash-скрипты. Это позволяет выполнять переводы в фоновом режиме, пока вы занимаетесь чем-то другим.

Для этого создайте два bash-скрипта:

  1. Основной скрипт, содержащий логику пакетной обработки (он никогда не изменяется)
  2. Файл конфигурации, определяющий, какие элементы переводить (обновляется при каждом запуске перевода)

Основной скрипт

Создайте файл с именем 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 для всех элементов пакетами заданного размера, отображая информацию о ходе выполнения для каждого пакета.

Выполнение скрипта 'gatotranslate.sh'
Выполнение скрипта 'gatotranslate.sh'

Когда скрипт завершается успешно, он издаёт один звуковой сигнал.

Остановка выполнения при возникновении ошибки

Чтобы скрипт автоматически останавливался при каждом появлении ошибки или предупреждения в журналах, добавьте параметр --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.

Уведомления журнала, включённые по уровню серьёзности
Уведомления журнала, включённые по уровню серьёзности

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

Выполнение скрипта 'gatotranslate.sh' с параметром '--fail-if-log-notifications'
Выполнение скрипта 'gatotranslate.sh' с параметром '--fail-if-log-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: " " )
  }
}
Создание запроса 'Retrieve item IDs'
Создание запроса 'Retrieve item IDs'

В зависимости от того, какие сущности вы хотите перевести, вам нужно настроить и выполнить соответствующую операцию в запросе.

Например, чтобы получить идентификаторы категорий записей, необходимо выполнить операцию RetrieveIDsForCategories, передав таксономию category в качестве аргумента:

Выполнение запроса 'Retrieve item IDs'
Выполнение запроса 'Retrieve item IDs'

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