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

ЮрКлик (YurClick) — LegalTech-портал

LegalTech-платформа (онлайн юридические услуги) · LegalTech / юридические услуги

Fullstack/Backend WordPress-разработчик (аудит, рефакторинг, SCF-архитектура, деплой)

На портале юридических услуг тексты были вшиты в код: поменять слово мог только разработчик. Вывел 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).
  • аудит
  • доработка существующего
  • рефакторинг
  • миграция
  • разработка
  • редизайн
  • деплой