Календарь ретритов с мастером (retreatmaster.online)
Частный заказчик — проект о выездных ретритах с мастером и наставниками · Wellness / ретриты и духовные практики / онлайн-образование
- 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-теста
- ~6 965 строк PHP, ~1 924 строки CSS, 48 PHP-файлов темы
- 6 CPT + 2 таксономии + 9 Options-страниц (root + 8 sub-pages), 14 SCF-файлов
- 17 CPT-записей + 7 SCF Options-страниц заполнены production-like контентом
- phpcs (WPCS) 0 ошибок на каждом этапе
- 7 кастомных субагентов, 8 слэш-команд, 3 проектных skill, 1 lint-hook
- Полный аудит из 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) с записью в CPTinquiryи 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, создаёт CPTinquiry, пишет 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-ФЗ/ПДн
- контент
- документация
- поддержка