Перейти к содержимому
Эльдар Шахвалиев
Обсудить проект
← Все проекты
202604.2026 — 05.2026В продемиграция

Календарь ретритов с мастером (retreatmaster.online)

Частный заказчик — проект о выездных ретритах с мастером и наставниками · Wellness / ретриты и духовные практики / онлайн-образование

Соло fullstack WordPress-разработчик (AI-augmented): миграция вёрстки в кастомную тему, аудит, production-деплой, документация

  • PHP
  • JavaScript
  • HTML
  • CSS
  • WordPress
  • SCF
  • Fluent Forms
  • адаптивная вёрстка
  • MySQL
  • Percona
  • Memcached
  • Schema.org/JSON-LD
  • REST API
  • Composer
  • npm
  • WPCS/PHPCS
  • PHPStan
  • ESLint
  • Stylelint
  • Playwright
HTTP 200 на 16/16 endpoint'ов prod smoke-теста
результат production-деплоя 2026-04-30
~6 965 строк PHP, ~1 924 строки CSS, 48 PHP-файлов темы
объём кода кастомной темы retreat
6 CPT + 2 таксономии + 9 Options-страниц (root + 8 sub-pages), 14 SCF-файлов
архитектура контента темы
17 CPT-записей + 7 SCF Options-страниц заполнены production-like контентом
контент-фикстуры (Этап 8)
phpcs (WPCS) 0 ошибок на каждом этапе
соблюдение стандартов кода
7 кастомных субагентов, 8 слэш-команд, 3 проектных skill, 1 lint-hook
кастомный Claude Code тулинг
Полный аудит из 10 этапов (PHP/CSS/JS/БД/безопасность/перформанс/a11y/SEO/эталон/roadmap)
пред-деплойный аудит
WP root 176 MB, БД 3.85 MB, uploads 0 байт
размеры миграции на прод
Руководство администратора ~247 KB HTML
пользовательская документация для заказчика

Контекст и задача

Заказчику требовался сайт-каталог выездных ретритов с мастером (плюс наставники, книги, онлайн-встречи и форма заявки), управляемый из админки. Исходно существовала только статическая вёрстка из 8 HTML-страниц (эталон retreat-calendar.vercel.app, тексты — преимущественно placeholder'ы). Задача: превратить статический макет в полноценный WordPress-сайт, где весь контент редактируется без программиста, и довести его до production-запуска с базовой безопасностью, SEO и документацией для передачи.

Что я сделал

Соло-исполнитель полного цикла (AI-augmented):

  • Миграция вёрстки → WordPress. Перенёс 8 HTML-секций/страниц в PHP-шаблоны кастомной классической темы retreat; CSS/JS перенесены как vanilla (без сборщика), HTML-структура и классы сохранены, чтобы стили работали 1-в-1.
  • Разработка темы с нуля. Построил архитектуру: 6 CPT (retreat, mentor, book, online_meeting, article, inquiry), 2 таксономии, 9 SCF Options-страниц (корень «Ретриты» + 8 sub-pages), 14 SCF-файлов с repeater/tab-полями, переиспользуемые template-parts, модальная форма заявок (Fluent Forms) с записью в CPT inquiry и e-mail-маршрутизацией (опц. CC наставнику).
  • Аудит. Провёл 10-этапный аудит (PHP, CSS, JS, БД, безопасность, перформанс, accessibility, SEO, соответствие эталону, roadmap) и закрыл находки кодом.
  • Деплой и devops. Подготовил deploy-пакет и развернул на Timeweb (Percona, Memcached object-cache) через rsync + WP-CLI search-replace.
  • Документация. Руководство администратора (~247 KB HTML) и production-checklist для передачи заказчику/преемнику.

Честно о роли: это миграция статической вёрстки в новую кастомную тему (тема написана с нуля), с включёнными фазами аудита и production-деплоя. Это независимый проект 2026 года (не относится к работе в BIA).

Решение и подход

  • Паттерн «контент в Options Pages» (по образцу arctic-m). Глобальный контент и контент уникальных страниц вынесен в SCF Options Pages с tab-группировкой и default_value из исходной вёрстки; повторяющиеся сущности — в CPT с полями на самих записях. SCF (Secure Custom Fields) выбран вместо ACF Pro как API-совместимая бесплатная альтернатива (get_field, acf_add_local_field_group, acf_add_options_page).
  • Graceful degradation. Каждый шаблон проверяет function_exists('get_field') и имеет __()-fallback, поля экранируются (esc_html/attr/url, wp_kses_post); секции управляются тоглами section_*_visible.
  • Безопасность как код. Отдельные модули inc/security-headers.php (HSTS/CSP-Report-Only/X-Frame-Options/Referrer-Policy/Permissions-Policy), inc/security-cleanup.php (скрытие генератора, отключение XML-RPC, ограничение REST user-enumeration), нонсы и capability-проверки в обработчиках форм.
  • SEO/Schema. inc/seo.php (meta description, canonical, OpenGraph, Twitter Card) и inc/schema.php (JSON-LD: Organization, WebSite, Event, Person, Article, FAQPage); WP core sitemap.
  • SCF Local JSON. Field-группы синхронизируются в acf-json/ (версионирование + ускорение загрузки), при этом регистрируются и через PHP.
  • Деплой best-practice 2026. Поскольку медиабиблиотека пуста, а SCF-группы регистрируются кодом, миграция свелась к коду + БД (3.85 MB): rsync, импорт дампа, wp search-replace домена, Memcached drop-in, security-заголовки, post-deploy backup на сервере.

Результат

  • Сайт в проде: https://retreatmaster.online — на момент анализа отдаёт HTTP 200 (проверено). Деплой 2026-04-30; smoke-тест дал 200 на 16/16 endpoint'ов (5 страниц + 2 single CPT + REST + sitemap + robots + health + xmlrpc/author-enum 403 + admin 302), контент-каунты на проде совпали с локалью (источник: production-deploy-plan.md).
  • Объём: ~6 965 строк PHP и ~1 924 строки CSS в теме (48 PHP-файлов), 13 SCF Field Groups, 17 CPT-записей + 7 Options-страниц с production-like контентом.
  • Качество: phpcs (WPCS) — 0 ошибок на каждом зафиксированном этапе; debug.log чист после фикстур.
  • Бизнес-метрики (трафик/конверсии/выручка) не зафиксированы (уточнить у автора).

Стек и обоснование

WordPress (classic theme, не FSE) — заказчику нужна редактируемость из админки без сборки. SCF вместо ACF Pro — тот же API, бесплатно. Fluent Forms Lite — формы заявок без платных аддонов. Vanilla CSS/JS (ES modules) без Tailwind/Sass/Vite — исходная вёрстка уже на чистом CSS, сборщик не нужен (и на проде нет Node). MySQL/Percona + Memcached — стек хостинга Timeweb. Тулинг качества: Composer (WPCS 3.x, PHPStan, WP-stubs), npm (@wordpress/eslint-plugin, Stylelint, Prettier). PHP 8.2+ с типизацией функций.

Роль ИИ в проекте

Проект — эталонный пример зрелого AI-процесса под WordPress на Claude Code (Opus). Подход — doc-driven development: корневой и тематический CLAUDE.md задают стек, conventions (WPCS strict, безопасность, i18n, SCF-паттерны) и запреты; живые план-документы (workspace-setup-plan.md с журналом/чеклистом, full-site-audit-plan.md, production-deploy-plan.md) ведутся по ходу; промпты вынесены в docs/prompts/. Цикл: research → audit → implement → deploy (см. docs/reports/research-*.md).

Кастомные субагенты (.claude/agents/):

  • wp-builder — скаффолдинг файлов темы (header/footer/single/page/template-parts), авто-применяет WPCS, экранирование/санитизацию, i18n, Yoda; решает, что идёт в Options Page, что в CPT-поля, что хардкодится.
  • html-to-php-migrator — конвертирует секцию исходного HTML в template-part, регистрируя редактируемый контент как SCF-поля на нужной Options Page/CPT; ведёт карту «секция → Options slug → файл», инвентаризует динамический контент, ставит default_value из вёрстки, обновляет родительский шаблон через get_template_part().
  • scf-fields-architect — проектирует и пишет SCF Field Groups / Options Pages по образцу arctic-m: cheat-sheet типов полей, naming-конвенции ключей, tab-группировка, location-правила, хук acf/init.
  • wp-code-reviewer — ревью кода по severity (CRITICAL/WARNING/INFO): XSS/unescaped output, SQLi без prepare(), отсутствие нонсов/capability, прямой доступ к файлам, секреты, i18n, a11y, перформанс (N+1).
  • wp-test-runner — прогон линтеров/тестов (phpcs → phpstan → eslint → stylelint), классификация auto-fix vs manual, авто-починка, до 3 ретраев на файл; запрещено глушить правила.
  • visual-diff — Playwright-сравнение локального сайта с эталоном vercel: скриншоты на 3 viewport'ах, метрики (высота/DOM/текст), уровни tolerance PASS/WARN/FAIL.
  • wp-cli-runner — безопасная обёртка WP-CLI с корректными --path/--socket, типовые операции (плагины/тема/посты/SCF/кэш/локаль), явный deny-list разрушительных команд.

Кастомные слэш-команды (.claude/commands/): /wp-import-section (вызывает html-to-php-migrator на секцию), /wp-create-cpt (регистрация CPT + SCF-скелет + rewrite flush), /wp-create-scf (добавление SCF-поля), /wp-visual-diff (Playwright-сравнение страницы), /wp-lint (все линтеры), /wp-debug-on и /wp-debug-off (переключение WP_DEBUG/WP_DEBUG_LOG/SCRIPT_DEBUG в wp-config), /wp-fixtures (тестовые данные), /wp (обёртка WP-CLI).

Проектные skills (.claude/skills/): retreat-cpt-architect (паттерны регистрации CPT, в т.ч. read-only inquiry), html-to-wp-template (пошаговая процедура миграции секции), okta-neue-fontface (генерация @font-face + preload для self-host шрифта).

Прочая инфраструктура ИИ: hook post-edit-lint.sh (PostToolUse: авто-линт PHP/JS/CSS только в каталоге темы, non-blocking, вывод в stderr); .mcp.json с Playwright MCP для визуальной регрессии; deny-list в .claude/settings.json на разрушительные WP-CLI/shell-команды (wp db drop/reset, site empty, plugin uninstall, rm -rf и т.п.) как гард-рейл против автономных ошибок.

Инженерные вызовы

  • Контент 1-в-1 для приёмки. Заказчик требовал идентичности с эталоном (Q-A.1) — написан импортёр scripts/import-source.php (~51 KB), воспроизводящий placeholder'ы из 8 HTML-файлов на наполненных Options-страницах и CPT.
  • Маршрутизация заявок. Модалка передаёт data-атрибуты (mentor/retreat/meeting id, режим) в скрытые поля формы; inc/mail-routing.php слушает fluentform/submission_inserted, создаёт CPT inquiry, пишет SCF/мету и шлёт письмо с Reply-To клиента и опц. CC наставнику. По ходу найден и исправлен баг с проверкой несуществующей function_exists('fluentform') → helper через shortcode_exists.
  • Расхождение окружений на проде. PHP CLI 8.2 vs заявленный web-PHP 8.4, устаревший Composer, отсутствие Node и cron только через панель Timeweb — обойдено стратегией «без сборки на проде» (vanilla) и ручным rsync+WP-CLI; зафиксировано в prod-server-probe.
  • Безопасность поэтапно. HSTS с max-age=300 и CSP в режиме Report-Only — фазовый ввод с планом ramp-up (HSTS до года, CSP → enforce) в production-checklist, чтобы не сломать прод необратимыми заголовками.
  • разработка
  • миграция
  • аудит
  • деплой
  • SEO
  • 152-ФЗ/ПДн
  • контент
  • документация
  • поддержка