KS Projects — плагин для WordPress

Задача Вынести архив портфолио из темы, чтобы смена темы не уносила работы с собой, — и опубликовать результат для всех, кто делает портфолио на WordPress.

Портфолио живёт в теме ровно до того дня, когда тему меняют, — и тогда вместе с ней уходят тип записи, теги и все кейсы. KS Projects забирает архив из темы и возвращает его отдельным типом содержимого, с открытым кодом под GPLv3.

Исходники, задачи и релизы на GitHub

Граница, вокруг которой он построен

Плагину принадлежат данные и экраны редактирования. Теме — то, как всё это выглядит. В этой границе весь замысел: редизайн меняет тему, а архив этого не замечает.

Поэтому плагин везёт простую версию каждого из трёх экранов проекта, а тема перехватывает любой из них, просто имея файл с тем же именем. Ничего переключать и отменять не нужно — проверка та же, которой WordPress и так находит шаблоны везде.

В этих заготовках намеренно нет классов ни одного фреймворка. Заготовка, приехавшая со своим оформлением, выглядела бы неуместно в любой теме, кроме той, откуда она родом.

Кейс — это больше, чем запись

Два метабокса держат то, что кейсу действительно нужно. Карточка — короткое имя, подзаголовок и адрес, по которому работа вышла в свет: заголовок в портфолио обычно целое предложение, а сетке нужно имя.

Титры держат то, что просил клиент, кто работал и что сделано. Написанный руками HTML внутри содержимого записи — а обычно этот блок живёт именно там — приходится править вручную в каждом проекте при первой же смене оформления. В виде полей его раскладывает тема, и все три ключа включены в ревизии записей, куда мета по умолчанию не попадает.

Шаблон под каждый проект

Одному кейсу нужна галерея во всю ширину, другому — длинный текст. Проект может назвать PHP-файл в теме, и этот файл выводится вместо содержимого записи и только вместо него: заголовок, теги и титры остаются за темой. Шаблон — это тело, а не страница: обвязка не дублируется, и правка рамки доходит до всех проектов разом.

Страница, которую вы читаете, — это и есть та самая возможность в действии.

Выбор стоит на экране редактирования и в быстром редактировании, а в списке проектов появляется колонка — видно с одного взгляда, у кого своя вёрстка. В содержимое записи ничего не пишется и ничего не удаляется: выключение шаблона сразу возвращает версию из редактора, а пропавший файл откатывается к ней, а не показывает пустую страницу.

Чего намеренно нет в настройках

Слаги в адресах менять можно. Имена типа записи и таксономии — нельзя, и это как раз более интересная половина.

Эти имена — те самые строки, под которыми лежит каждая запись в базе. Вынести их в настройки значило бы дать способ потерять архив одним кликом: смени имя на сайте, где уже есть проекты, и все существующие записи останутся под типом, который больше никто не регистрирует. Из админки они пропадут, а их адреса перестанут открываться. Задать имена по-прежнему можно в файле конфигурации сайта — до появления первого проекта и никогда после.

Как он устроен внутри

Классы в пространствах имён с современной автозагрузкой, и хук объявлен прямо на методе, который его обрабатывает, а не в списке регистраций где-то в стороне: переименованный метод не оставит регистрацию, ведущую в никуда. За этим нет ни скомпилированного кеша, ни обхода папок — сервисы перечислены руками в одном файле, поэтому есть одно очевидное место, где написано, из чего плагин состоит.

API, к которому обращается тема, — это один класс и один импорт, а не россыпь глобальных функций.

Зависимостей в рантайме нет вовсе, поэтому репозиторий работает сразу после клонирования. Composer нужен только для инструментов разработки и ставится отдельно от плагина — так тестовый класс никогда не попадёт в автозагрузчик, который уходит в поставку.

Что прогоняется перед релизом

Статический анализ на самом строгом уровне, который есть у инструмента, проверка стандартов кода по правилам WordPress с записанной причиной у каждого отступления, и модульные тесты на то, о чём можно рассуждать отдельно, — правила слагов, набор ключей меты, список избранного.

Две проверки существуют потому, что иначе их поломка молчалива: одна не пропускает коммит, где поставляемый автозагрузчик расходится с исходниками, вторая — перевод, который отредактировали, но так и не скомпилировали.

Роли

Разработчик
Konstantin Sorokin

Выполнено
  • Тип записи, таксономия и два метабокса кейса
  • Шаблоны по умолчанию, которые тема перехватывает по имени
  • Шаблоны под конкретный проект — выбор на записи или в быстром редактировании
  • Экран настроек с проверкой слагов и отложенным сбросом правил перезаписи
  • Переводы на русский и украинский
  • PHPStan 8-го уровня, стандарты кода WordPress, модульные тесты, CI