Перейти к содержимому

Миграция wp2turbo

Статус: ЧАСТИЧНО ВЫПОЛНЕНА (пакеты), PHP-namespace ОТЛОЖЕН.
Актуальный канон пакетов (2026-07):

  • Ядро Turbo — onepix/wp2lms/src/Modules/Turbo/ (бывш. пакет wp2lms-turbo-core удалён из этого monorepo)
  • wp2lms-turbo-blocks — блоки (CSS: pulse → skin)
  • wp2lms-turbo-pulse-theme / wp2lms-turbo-mos-theme — бренды
    См. обзор Turbo.
    Rename namespace (WP2LMS\Turbo → WP2Turbo\) по-прежнему не начинать без отдельного решения.

Черновик ниже — исторический план дальнейшего схлопывания wp2lms-* → wp2turbo на уровне Composer/namespace.

Бренд в UI («WP2LMS Turbo», метка палитры «WP2LMS») не меняем — это маркетинговое имя, не техпрефикс.

Уже на wp2turbo (не трогать): namespace блоков wp2turbo/*, block context wp2turbo/*, CSS addon-блоков wp2turbo-*, CSS-переменные --wp2turbo-*, hook wp2turbo/add-lucide-library.


Слой Канон Пример
UI / бренд WP2LMS Plugin Name, Settings title
Plugin slug / text domain wp2turbo, wp2turbo-pulse папка, i18n
PHP constants WP2TURBO_* WP2TURBO_VERSION
PHP namespace WP2Turbo\ WP2Turbo\Plugin
Composer / npm wp2turbo/* wp2turbo/core, @wp2turbo/blocks-shared
Hooks / filters wp2turbo/... wp2turbo/init
Options / meta wp2turbo_* wp2turbo_settings
REST wp2turbo/v1 /wp-json/wp2turbo/v1/static/{id}
Script / style handles wp2turbo-* wp2turbo-blocks-shared
window globals wp2turbo* wp2turboBlocks
Body / page classes wp2turbo-* wp2turbo-static
Gutenberg categories wp2turbo-* wp2turbo, wp2turbo-basic
Публичный CSS / Twig wp2turbo-* wp2turbo-card, wp2turbo-paragraph
Gutenberg blocks wp2turbo/* уже так

Правило форматирования:

  • kebab: wp2turbo-... (slug, handle, CSS, REST namespace)
  • snake: wp2turbo_... (option, meta, PHP function)
  • slash: wp2turbo/... (hooks, block names, WP filter ids)
  • Pascal: WP2Turbo\... (PHP namespace)

Риск Значение
L Low — только код/доки, нет persisted data
M Medium — editor/assets, нужен rebuild
H High — БД, REST, hooks, контент страниц
C Critical — plugin folder / activation / деплой

Alias: нужно ли держать старое имя 1–2 релиза (или forever для persisted keys).


Идентификатор Почему
UI: WP2LMS Turbo, Author WP2LMS бренд
Palette label WP2LMS бренд
Block names wp2turbo/card, wp2turbo/tabs, … уже канон
Context wp2turbo/activeTab, wp2turbo/iconSize, … уже канон
CSS addon wp2turbo-card, --wp2turbo-icon-size уже канон
Core WP: core/*, category design внешние

Старое Новое Риск Alias
Папка wp2lms-turbo wp2turbo C symlink / dual-path в build да
Папка wp2lms-turbo-pulse wp2turbo-pulse C да
wp2lms-turbo.php wp2turbo.php C да (bootstrap stub)
wp2lms-turbo-pulse.php wp2turbo-pulse.php C да
Text Domain wp2lms-turbo wp2turbo M dual load_textdomain да
Text Domain wp2lms-turbo-pulse wp2turbo-pulse M да
Admin menu slug wp2lms-turbo wp2turbo M redirect settings URL желательно

Рекомендация: папки переименовывать последней фазой (или не переименовывать вовсе, если деплой завязан на slug). API внутри можно мигрировать при сохранении slug.


Старое Новое Риск Alias
WP2LMS_TURBO_VERSION WP2TURBO_VERSION L define alias да
WP2LMS_TURBO_FILE WP2TURBO_FILE L да
WP2LMS_TURBO_PATH WP2TURBO_PATH L да
WP2LMS_TURBO_URL WP2TURBO_URL L да
WP2LMS_TURBO_PULSE_VERSION WP2TURBO_PULSE_VERSION L да
WP2LMS_TURBO_PULSE_FILE WP2TURBO_PULSE_FILE L да
WP2LMS_TURBO_PULSE_PATH WP2TURBO_PULSE_PATH L да
Placeholder %%WP2LMS_TURBO_HTML_*%% %%WP2TURBO_HTML_*%% L не нужен (runtime-only)

Старое Новое Риск Alias
WP2LMS\Turbo\ WP2Turbo\ M class_alias да
WP2LMS\Turbo\Components\ WP2Turbo\Components\ M да
WP2LMS\TurboPulse\ WP2Turbo\Pulse\ M да
Composer wp2lms/turbo wp2turbo/core M dual package name нет (один релиз)
Wp2TurboCardTransformer CardTransformer (в WP2Turbo\Pulse\Mapping) L class_alias да
Wp2TurboTabsTransformer TabsTransformer L да
Wp2TurboHeroTransformer HeroTransformer L да
Wp2TurboIconListTransformer IconListTransformer L да
Wp2TurboCardHeaderTransformer CardHeaderTransformer L да
Wp2TurboCardMediaTransformer CardMediaTransformer L да
Wp2TurboCardButtonTransformer CardButtonTransformer L да

Префикс Wp2 в имени класса избыточен при namespace WP2Turbo\Pulse.


Старое Новое Риск Alias
wp2lms_turbo() wp2turbo() M function stub да
turbo_component() wp2turbo_component() M да
Twig turbo_classes() wp2turbo_classes() M Twig alias да

Старое Новое Риск Alias
wp2lms_turbo/init wp2turbo/init H dual do_action да
wp2lms_turbo/blocks/register wp2turbo/blocks/register H да
wp2lms_turbo/before_render_blocks wp2turbo/before_render_blocks H да
wp2lms_turbo/frontend/output wp2turbo/frontend/output H да
Старое Новое Риск Alias
wp2lms_turbo/static/body_class wp2turbo/static/body_class H dual apply_filters да
wp2lms_turbo/static/inline_styles wp2turbo/static/inline_styles H да
wp2lms_turbo/static/extra_scripts wp2turbo/static/extra_scripts H да
wp2lms_turbo/static/show_title wp2turbo/static/show_title H да
wp2lms_turbo/static/asset_url wp2turbo/static/asset_url H да
wp2lms_turbo/skin/active wp2turbo/skin/active H да
wp2lms_turbo/editor/scripts_config wp2turbo/editor/scripts_config H да
wp2lms_turbo/editor/block_registry wp2turbo/editor/block_registry H да
wp2lms_turbo/editor/turbo_child_blocks wp2turbo/editor/child_blocks H да (+ убрать лишнее turbo в имени)
wp2lms_turbo/editor/disable_unsupported_blocks wp2turbo/editor/disable_unsupported_blocks H да
wp2lms_turbo/editor/reorder_block_categories wp2turbo/editor/reorder_block_categories H да
wp2lms_turbo/alpine/enabled wp2turbo/alpine/enabled H да
wp2lms_turbo/frontend/takeover wp2turbo/frontend/takeover H да
wp2lms_turbo/blocks/use_turbo_render wp2turbo/blocks/use_render H да
wp2lms_turbo/props/validated wp2turbo/props/validated H да
wp2lms_turbo/greenlight/scripts / wp2turbo/greenlight/scripts — — удалено (интеграция Greenlight снята)

Паттерн dual-fire (обязательный):

do_action('wp2turbo/init', $this);
do_action('wp2lms_turbo/init', $this); // deprecated

Для filters — сначала новый ключ, затем прогон через старый (или наоборот, зафиксировать один порядок в коде).


Старое Новое Риск Alias
Option wp2lms_turbo_settings wp2turbo_settings H read old → write new да
Option wp2lms_turbo_twig_cache_signature wp2turbo_twig_cache_signature M да (или просто сбросить кэш)
Setting group wp2lms_turbo wp2turbo M нет
Section wp2lms_turbo_main wp2turbo_main L нет
Post meta wp2lms_turbo_hide_title wp2turbo_hide_title H read both; one-time migrate да
Metabox id wp2lms_turbo_page_settings wp2turbo_page_settings L нет
Nonce wp2lms_turbo_page_settings wp2turbo_page_settings L нет

Миграция meta: скрипт WP_CLI / admin one-shot: UPDATE postmeta SET meta_key = 'wp2turbo_hide_title' WHERE meta_key = 'wp2lms_turbo_hide_title'.


Старое Новое Риск Alias
REST wp2lms-turbo/v1 wp2turbo/v1 H register оба namespace да
Cache dir wp-content/cache/wp2lms-turbo/twig wp-content/cache/wp2turbo/twig M удалить старый кэш да (не читать оба)

Старое Новое Риск Alias
wp2lms-turbo-blocks-shared wp2turbo-blocks-shared M register оба handle → один src да
wp2lms-turbo-icon-picker wp2turbo-icon-picker M да
wp2lms-turbo-editor-blocks wp2turbo-editor-blocks M да
wp2lms-turbo-page-settings wp2turbo-page-settings L да
wp2lms-turbo-pulse-palette-label wp2turbo-pulse-palette-label L да
window.wp2lmsTurboBlocks window.wp2turboBlocks M window.wp2lmsTurboBlocks = window.wp2turboBlocks да
window.wp2lmsTurboIconPicker window.wp2turboIconPicker M да
window.__wp2turboLucideIconsRegistered без изменений — —

Webpack library: wp2lmsTurboBlocks → wp2turboBlocks.
Externals в Pulse: '@wp2lms/turbo-blocks-shared': 'wp2turboBlocks'.


Старое Новое Риск Alias
@wp2lms/turbo-blocks-shared @wp2turbo/blocks-shared M нет (один rebuild)
@wp2lms/turbo-icon-picker @wp2turbo/icon-picker M нет
wp2lms-turbo-monorepo (stub/file:.. removed) — L убран у MOS и Pulse

Старое Новое Риск Alias
wp2lms-turbo (CATEGORY_TURBO) wp2turbo M register оба slug да (1 релиз)
wp2lms-basic wp2turbo-basic M да
wp2lms-interactive wp2turbo-interactive M да
wp2lms-inserts wp2turbo-inserts M да
wp2lms-misc wp2turbo-misc M да
wp2lms-greenlight / wp2turbo-greenlight — — удалено (интеграция Greenlight снята)
design без изменений — —
JS filter wp2lms/turbo-block-category wp2turbo/block-category L dual addFilter да
wp2lms-turbo/greenlight-* editor filters — — удалено
wp2lms-turbo-pulse/palette-label wp2turbo-pulse/palette-label L да

В block.json Pulse: "category": "wp2lms-turbo" → "category": "wp2turbo".


Старое Новое Риск Alias
wp2lms-turbo-active wp2turbo-active M CSS dual-selector да
wp2lms-turbo-static wp2turbo-static M да
wp2lms-turbo-skin-pulse wp2turbo-skin-pulse M да
wp2lms-turbo-page-settings (editor UI class) wp2turbo-page-settings L нет

Pulse skin.css: body.wp2lms-turbo-static → body.wp2turbo-static (+ старый селектор на переход).


12. Skin CSS / Twig: turbo-* → wp2turbo-* (самый объёмный кусок)

Заголовок раздела «12. Skin CSS / Twig: turbo-* → wp2turbo-* (самый объёмный кусок)»

Сейчас два слоя рядом: wp2turbo-card-media + turbo-card__media. Цель — один публичный префикс.

Старое (публичный CSS) Новое Риск Alias
turbo-card, turbo-card__* wp2turbo-card, wp2turbo-card__* M CSS .turbo-card, .wp2turbo-card да
turbo-list, turbo-list--pulse wp2turbo-list, wp2turbo-list--pulse M да
turbo-paragraph, turbo-heading, … wp2turbo-paragraph, … M да
turbo-buttons, turbo-gallery, … wp2turbo-buttons, … M да
--turbo-gallery-columns --wp2turbo-gallery-columns L да
turbo-static-page__content wp2turbo-static-page__content M да
prose-pulse / text-pulse-* без изменений (skin tokens, не wp2lms) — —

Не дублировать: если у addon-блока уже есть wp2turbo-card, не держать параллельно turbo-card в том же элементе — оставить один.

Исключение на переход: Twig может выводить оба класса через wp2turbo_classes('wp2turbo-card', 'turbo-card', ...), затем убрать второй.


Старое Новое Риск Alias
Dependency "wp2lms-turbo": ">=1.0.0" "wp2turbo": ">=1.0.0" M читать оба ключа да
@source .../wp2lms-turbo/components @source .../wp2turbo/components C* зависит от rename папки
Deploy wp-content/plugins/wp2lms-turbo .../wp2turbo C dual build target опционально

*Если папку плагина не переименовываем — пути @source и deploy оставляем как есть.


flowchart TD
P0[Фаза 0: NAMING.md + этот документ]
P1[Фаза 1: Compatibility helpers]
P2[Фаза 2: Hooks dual-fire]
P3[Фаза 3: Options/meta migrate]
P4[Фаза 4: Handles + window globals]
P5[Фаза 5: CSS turbo-* → wp2turbo-*]
P6[Фаза 6: Categories + text domains]
P7[Фаза 7: PHP namespace class_alias]
P8[Фаза 8: REST dual namespace]
P9[Фаза 9: Plugin folder rename — optional]
P0 --> P1 --> P2 --> P3 --> P4 --> P5 --> P6 --> P7 --> P8 --> P9
  • wp2turbo() + alias wp2lms_turbo()
  • новые constants + defined aliases
  • unit/smoke: bin/smoke-wp2turbo-blocks.php зелёный
  • новый код пишет только wp2turbo/...
  • dual do_action / apply_filters для всех публичных hooks
  • Pulse: RegisterBlocks слушает оба init
  • option migrate on plugins_loaded
  • meta migrate WP-CLI / one-shot
  • не удалять старые ключи до следующего major
  • rebuild shared + icon-picker
  • dual handles, dual window globals
  • обновить @wp2turbo/* imports в Pulse
  • переименовать публичные turbo-* → wp2turbo-*
  • alias-селекторы в blocks.css / components.css
  • убрать dual-классы с addon-блоков (wp2turbo-X turbo-X → только wp2turbo-X)
  • новые slug + dual registration
  • обновить все block.json
  • WP2Turbo\ + class_alias от WP2LMS\Turbo\
  • переименовать Wp2Turbo*Transformer → короткое имя
  • wp2turbo/v1 + deprecated wp2lms-turbo/v1
  • только если slug важен для продукта
  • иначе пропустить: оставить wp2lms-turbo как WP slug, внутри уже wp2turbo

  • Новый код не вводит wp2lms_turbo / wp2lms-turbo / turbo-* (кроме alias и бренда)
  • Все публичные hooks dual-fire минимум 1 minor
  • Options/meta читаются со старых ключей
  • REST старый namespace отвечает
  • Smoke: php bin/smoke-wp2turbo-blocks.php
  • Frontend takeover + editor palette + 1 страница с card/tabs/hero
  • Документы: этот файл + ссылки из README turbo/pulse
  • Changelog: «deprecated identifiers» список

Практический компромисс (если полный путь слишком дорог)

Заголовок раздела «Практический компромисс (если полный путь слишком дорог)»

Минимально полезный subset без Critical-фаз:

  1. Hooks + helpers → wp2turbo
  2. CSS публичный → wp2turbo-* (убрать dual с turbo-*)
  3. Handles/globals → wp2turbo*
  4. Не трогать: plugin folder, text domain, PHP namespace, REST (или только dual)

Это даёт «один grep wp2turbo» для повседневной работы без миграции активации плагина.


Область Где править
Bootstrap wp2lms-turbo.php, wp2lms-turbo-pulse.php
Hooks init src/Plugin.php
Hook list (filters) SettingsRepository, StaticPageRenderer, EditorBlockRegistry, …
Block namespace (уже ок) src/Blocks/TurboBlockNamespace.php
Categories src/Editor/EditorBlockRegistry.php
Shared assets src/Blocks/TurboBlockRegistrar.php, blocks/webpack.config.js
Pulse register wp2lms-turbo-pulse/src/Blocks/RegisterBlocks.php
CSS skin wp2lms-turbo-pulse/assets/src/{skin,blocks,components}.css
Twig wp2lms-turbo-pulse/components/**/*.twig

Дата Статус
2026-07-13 Черновик по текущему состоянию turbo + pulse
2026-07-13 Фазы 1–4 внедрены: HookBridge, LegacyMigration, constants, handles, REST dual, categories
2026-07-13 Фаза 5: ClassPrefix, turbo_classes mirror, dual CSS/Twig/Alpine, pulse rebuild