EN RU

Multilingual Engine для WordPress — профессиональное руководство

Лёгкий, но производительный мультиязычный фреймворк для WordPress 6.8+, использующий префиксы URL (/en/, /de/…) и не требующий сторонних модулей.

Оглавление

1. Обзор

Multilingual Engine (далее — ME) — минималистичный плагин для организации многоязычного контента. Он добавляет к ссылкам языковой префикс, ускоряет выборку записей с помощью таксономии ml_language, генерирует черновики переводов, предоставляет REST‑метаданные для работы внешних сервисов и автоматически вставляет метатеги hreflang для поисковых систем.

См. также раздел SEO‑интеграция, где описан вывод hreflang. Для терминологии обращайтесь к глоссарию.

2. Системные требования

КомпонентМинимумРекомендовано
WordPress6.8Актуальная LTS
PHP8.38.3.x
Веб‑серверApache/Nginx
(mod_rewrite)
Текущий stable
База данныхMySQL 5.7 / MariaDB 10.3Новые версии InnoDB

ME рассчитан на одиночную установку WordPress, не поддерживает Multisite[1].

3. Быстрый старт

  1. Загрузите папку multilingual-engine в /wp-content/plugins/.
  2. Активируйте плагин в Плагины → Установленные.
  3. Перейдите в Настройки → Общие и настройте:
    • Доступные языки — напр. en,de,fr
    • Язык по умолчанию — en
  4. Откройте главную страницу: ME перенаправит на /en/ (либо на другой код языка).
  5. Добавьте шорткод  или виджет, чтобы пользователи могли менять язык.

4. Установка

4.1 Структура каталогов

wp-content/
└── plugins/
    └── multilingual-engine/
        ├── multilingual-engine.php
        └── languages/          # .mo/.po для локализации самого плагина

4.2 Что происходит при активации

  • Создаётся непубличная таксономия ml_language.
  • Регистрируются метаполя _ml_group_id и _ml_language (доступны в REST).
  • Добавляются опции со значениями по умолчанию (см. раздел 5).

Плагин не изменяет схему БД.

5. Панель настроек

Все параметры расположены в Настройки → Общие (внизу страницы).

ПолеНазначениеВалидацияПримечание
Доступные языкиСписок ISO‑639‑1 через запятуюtrim, lowercase, uniqueМин. одно значение.
Язык по умолчаниюФолбэк при ошибке автоопределениядолжен быть в спискеОпределяет язык бэкенда.
Создавать черновикиАвтогенерация пустых переводовbool0 — нет, 1 — да.

6. Механизм определения языка

ME выбирает язык в порядке приоритетов:

ПриоритетИсточникУсловиеПример
1Префикс URLПуть начинается с кода/de/about/
2Кука ml_langВыбрана ранее пользователемml_lang=fr
3Заголовок Accept‑LanguageПервичный тег входит в списокru-RU,ru;q=0.9
4Язык по умолчанию en

Результат сохраняется в куку на 1 год (только если язык не передан в URL) и используется на всех последующих страницах.

7. Схема URL и маршрутизация

  • Все фронтовые запросы должны содержать префикс языка. Иначе ME выдаёт 302 и дописывает префикс.
  • Панель администратора и AJAX‑запросы не затрагиваются.
  • Постоянные ссылки переводов отличаются только первым сегментом URL.

См. §12, чтобы включить трассировку редиректов.

8. Создание и управление контентом

8.1 Оригинальная запись

  1. При публикации задаётся таксономия ml_language = текущий язык.
  2. Генерируется _ml_group_id.
  3. Черновики других языков создаются, если включена опция.

8.2 Редактирование переводов

В списке записей рядом с каждой статьёй отображаются ссылки Edit {CODE}. Они открывают перевод в соответствующем языке.

8.3 Создание черновика вручную

Выключите автогенерацию, затем:

  1. Создайте новый пост.
  2. В мета‑полях установите:
    • _ml_language — целевой код;
    • _ml_group_id — значение оригинала.

Эти же поля можно передать через REST API (см. §9).

9. REST API и внешние рабочие процессы

9.1 Метаполя в REST

  • _ml_language — код языка (строка).
  • _ml_group_id — идентификатор группы.

Пример запроса POST:

{
  "title"  : "Hallo Welt!",
  "content": "<p>…deutsche Version…</p>",
  "status" : "publish",
  "meta"   : {
    "_ml_language": "de",
    "_ml_group_id": "mlg_64b034b4b7e44.18830524"
  }
}

10. Виджеты, шорткоды и шаблоны

  • Шорткод:  — выпадающий список языков.
  • Виджет: «Language Switcher» в Внешний вид → Виджеты.
  • PHP‑хелпер: Plugin::translateUrl( $url, 'fr', $plugin->langs ).

11. SEO‑интеграция (hreflang)

Для каждой опубликованной статьи ME выводит в <head> ссылки hreflang на доступные переводы. Никаких настроек не требуется.

12. Отладка и журналирование

  • В wp-config.php добавьте
    define('MULTILINGUALENGINE_DEBUG', true);
  • Логи пишутся в wp-content/debug.log (требуется WP_DEBUG_LOG).
  • Фиксируются: источник определения языка, редиректы, создание черновиков, ошибки REST.

13. Обслуживание

13.1 Изменение списка языков

Отредактируйте поле Доступные языки и сохраните. Новые коды создадутся при первом использовании.

13.2 Генерация черновиков для нового языка

  1. Включите «Создавать черновики».
  2. Выделите все записи, выберите массовое действие «Изменить → Обновить».
  3. Отключите опцию при желании.

13.3 Очистка пустых черновиков

Используйте WP‑CLI:

wp post list --post_status=draft --meta_key=_ml_group_id --format=ids |
xargs -n1 -I{} wp post delete {} --force

14. Деактивация и удаление

  • Деактивация — URL с префиксами станут 404; настройте редиректы заранее.
  • Удаление — удаляются только файлы плагина; данные остаются[2].

Чтобы полностью очистить БД, вручную удалите опции и метаполя (см. §13).

15. Устранение неполадок

СимптомПричинаРешение
Циклический 302Кука с неподдерживаемым кодомОчистить куки или исправить список языков
Дублирование черновиковСтарая версия плагина (<1.01)Обновить, удалить лишние черновики
Перевод скрытНе задано _ml_languagePATCH через REST или отредактировать запись

16. Приложение A — CLI, хуки и фильтры

16.1 CLI‑пример: поиск неполных переводов

wp eval '
$pl = MultilingualEngine\Plugin::instance();
foreach (get_posts([
  "meta_key" => "_ml_group_id",
  "posts_per_page" => -1,
  "fields" => "ids"
]) as $id) {
  $g = get_post_meta($id, "_ml_group_id", true);
  $langs = wp_get_post_terms($id, "ml_language", ["fields" => "slugs"]);
  if (count($langs) < count($pl->langs)) {
    echo "$id $g missing\n";
  }
}'

16.2 Основные хуки/фильтры

  • pre_get_posts — фильтрация записей по языку.
  • save_post — присвоение языка и группы, создание черновиков.
  • ml_translatable_post_types — фильтр списка CPT, обрабатываемых ME.
  • Шорткод и виджет Language Switcher.

Глоссарий

Префикс URL
Двухсимвольный код языка в начале пути (например, /en/).
Группа переводов (_ml_group_id)
Общее поле для всех версий одной статьи.
Таксономия ml_language
Служебный тег WP, ускоряющий выборку записей конкретного языка.

Сноски

[1] Поддержка Multisite требует иного подхода (отдельные сайты под языки). Для этого существует Polylang Pro или WPML.

[2] Политика WordPress: удаление данных при удалении плагина оставляется на усмотрение администратора; во избежание потери контента ME не чистит БД автоматически.

Добавить комментарий

Разработка и продвижение сайтов webseed.ru
Прокрутить вверх