ЮрКлик (YurClick) — LegalTech-портал
LegalTech-платформа (онлайн юридические услуги) · LegalTech / юридические услуги
На портале юридических услуг тексты были вшиты в код: поменять слово мог только разработчик. Вывел 106 текстов и 29 ссылок в админку.
- PHP
- WordPress
- ACF
- SCF
- CMB2
- MySQL
- JavaScript
- jQuery
- CSS/SCSS
- Swiper
- Fancybox
- IMask
- Webpack
- Composer
- WP-CLI
- PHPStan
- Bitrix24
- Nginx
- VPS
- REST API
В цифрах
- 75 находок (12 крит. / 41 средн. / 22 низк.), оценка 6.5/10
- Технический код-аудит темы
- ~466 находок хардкода, из них 145 «чистого» хардкода
- Аудит захардкоженного контента
- 106 текстов + 29 ссылок/кнопок выведены в админку; 24 задачи remediation выполнены
- Аудит и доведение управляемости из админ-панели
- удалено ~640 легаси options_* + 560 легаси-мета CPT + ~147 сиротских acf-field; 332→344 поля, 12→13 JSON-групп
- Очистка и миграция SCF/ACF-полей
- 31 секция, 6 попапов, 4 компонента, 5 CPT
- Объём кастомной темы
- 7 коммитов за 18.02.2026
- Интенсивный рефакторинг-спринт (git-история темы yurclick)
Ключевое
- Порядок блоков на странице и их видимость переключаются в админке — контент-менеджер собирает страницу сам, без правки кода.
- Провёл аудит в три слоя и написал отчёты на русском: качество кода, что реально управляется из админки, как устроены поля данных.
- Нашёл в коде адрес внешней системы вместе с ключом доступа к ней и убрал его оттуда.
- Вычистил из базы наследие прежней структуры: 640 устаревших настроек, 560 записей мета-данных и 147 осиротевших полей.
- Привёл код к общепринятым стандартам и подключил анализатор, который ловит ошибки до запуска.
Задача
Портал юридических услуг уже прошёл первый этап переноса вёрстки на движок, и заказчик остался недоволен результатом. Тексты и ссылки оказались вшиты прямо в код: поменять слово на странице, переставить блоки местами или скрыть ненужный раздел мог только разработчик. Контент-менеджер, ради которого сайт и делался, не мог почти ничего.
Отдельной проблемой была накопленная неаккуратность. Часть данных дублировалась в базе, часть висела мёртвым грузом от прежней структуры, а в коде страницы лежал адрес внешней системы вместе с ключом доступа к ней.
Что сделано
- Провёл аудит в три слоя и написал по каждому отдельный отчёт: качество кода, что реально можно менять из админки, как устроены поля данных. Отчёты написаны по-русски и адресованы заказчику, а не только следующему разработчику.
- Вывел в админку 106 текстов и 29 ссылок и кнопок, которые до этого были в коде. Добавил управление порядком блоков на странице и переключатели их видимости — страница собирается без разработчика.
- Перевёл систему полей на бесплатный аналог платного расширения, сохранив все нужные возможности, и вычистил из базы наследие прежней структуры: 640 устаревших настроек, 560 записей мета-данных, 147 осиротевших полей.
- Убрал из кода адрес внешней системы вместе с ключом доступа — это находка собственного аудита, а не заявка заказчика.
- Привёл код к общепринятым стандартам и подключил анализатор, который ловит ошибки до запуска, а не на живом сайте.
Итог
Было
- Тексты и ссылки вшиты в код: правка одного слова на странице — задача для разработчика
- Часть содержимого не управлялась из админки вовсе, порядок блоков менялся только правкой шаблона
- В коде страницы — адрес внешней системы вместе с ключом доступа к ней
Стало
- 106 текстов и 29 ссылок в админке; порядок блоков и их видимость переключаются там же
- База очищена от наследия прежней структуры полей
- Ключ доступа убран из кода, сам код приведён к стандартам и проверяется анализатором
Тексты и ссылки на страницах правит контент-менеджер: 106 текстов и 29 ссылок и кнопок переехали в админку, порядок блоков и их видимость переключаются там же. Разработчик для правки содержимого больше не нужен — это и было главным требованием заказчика к этому этапу.
Все 24 задачи, поставленные по итогам аудита админки, закрыты. База очищена от наследия прежней структуры полей, ключ доступа к внешней системе убран из кода, а сам код приведён к общепринятым стандартам и проверяется анализатором.
Технические детали
Решение и подход
Архитектура — «section-based page builder»: каждая страница собирается из переиспользуемых template-part-секций (31 секция, 6 попапов, 4 карточных компонента) через get_template_part(). Ключевые инженерные решения зафиксированы в TECHNICAL_HANDOVER_YURCLICK_FULL.md:
- Полное отключение Gutenberg ради жёсткого контроля вёрстки контент-менеджером.
- Эволюция управления контентом: исходно ACF + CMB2 (CMB2 — repeater для FAQ без ACF Pro) и хранение глобальных настроек на скрытой странице
site-settings; в ходе рефакторинга — переход на SCF, SCF Options Pages и Flexible Content-порядок секций с переключателями видимости. - 5 CPT (
service,team_member,case,callback_request,partnership_request); лиды сохраняются в CPT и дублируются на e-mail (wp_mail) — защита от потери заявок при сбое почты. - Безопасность: все AJAX-обработчики через
check_ajax_referer('yurclick_nonce'), санитизация ввода и экранирование вывода; интеграция с Bitrix24 (плагиныflamix-bitrix24-and-contact-forms-7-integrations,bitrix_integration). - Кастомный BEM-Walker меню, inline SVG-спрайт, предзагрузка шрифтов, WebP с fallback.
Стек и обоснование
WordPress + кастомная тема (PHP 8.0+/WP 6.0+) — требование заказчика к самостоятельному управлению контентом. SCF вместо ACF Pro — repeater и Pro-возможности без платной лицензии при сохранении API (get_field()) и JSON-синхронизации. CMB2 — исторический repeater для FAQ (в редизайне выводится из эксплуатации). Frontend: jQuery + вендоренные Swiper 11, Fancybox 5, IMask 7.6.1; app.js — Webpack-бандл (исходники в репозитории отсутствуют). Качество: Composer (PHPCS 3.13 + WPCS 3.3, PHPCompatibility, PHPStan 2 + phpstan-wordpress, acf-pro-stubs), WP-CLI, Intelephense LSP. Деплой: Ubuntu 22.04, Nginx, PHP 8.2, MySQL, Certbot. Локальная среда — Local by Flywheel (yurclick.local).
Инженерные вызовы
- Двойная/мигрирующая система полей (ACF + CMB2 + закомментированный PHP-реестр
acf-fields.php+ JSON-sync): риск дублирования и конфликтов ключей — решено переходом на SCF JSON-sync и удалением мёртвого кода/легаси через WP-CLI с предварительным бэкапом (backup-before-phase3.sql). - Тотальный хардкод текстов/URL (~466 находок): систематизирован по типам (чистый хардкод / SCF-фолбэк / i18n / админка) и вынесен в управляемые SCF-поля без потери дефолтов в формах.
- Отсутствие build-системы и исходников JS (
app.js— бандл безsrc/): правки вносились в скомпилированные файлы; добавление сборки запрещено без явного запроса (hard-constraint). - Поддержка задачи новым разработчиком: подготовлены два подробных technical-handover-документа.
- Эволюция старая→новая тема: ведение двух кодовых баз (
yurclickпод git с аудит-отчётами иnew-yurclick— более новая редизайн-итерация вне git).
Услуги в проекте
- аудит
- доработка существующего
- рефакторинг
- миграция
- разработка
- редизайн
- деплой