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

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

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

Вихідники, задачі та релізи на GitHub

Межа, навколо якої його побудовано

Плагіну належать дані та екрани редагування. Темі — те, як усе це виглядає. У цій межі весь задум: редизайн змінює тему, а архів цього не помічає.

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

У цих заготовках навмисно немає класів жодного фреймворку. Заготовка, що приїхала зі своїм оформленням, виглядала б недоречно в будь-якій темі, крім тієї, звідки вона походить.

Кейс — це більше, ніж запис

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

Титри тримають те, що просив клієнт, хто працював і що зроблено. Написаний руками HTML усередині вмісту запису — а зазвичай цей блок живе саме там — доводиться правити вручну в кожному проєкті за першої ж зміни оформлення. У вигляді полів його розкладає тема, і всі три ключі ввімкнено в ревізії записів, куди мета за умовчанням не потрапляє.

Шаблон під кожен проєкт

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

Сторінка, яку ви читаєте, — це і є та сама можливість у дії.

Вибір стоїть на екрані редагування та у швидкому редагуванні, а в списку проєктів з’являється колонка — видно з одного погляду, у кого своя верстка. У вміст запису нічого не пишеться й нічого не видаляється: вимкнення шаблона одразу повертає версію з редактора, а зниклий файл відкочується до неї, а не показує порожню сторінку.

Чого навмисно немає в налаштуваннях

Слаги в адресах змінювати можна. Імена типу запису й таксономії — ні, і це якраз цікавіша половина.

Ці імена — ті самі рядки, під якими лежить кожен запис у базі. Винести їх у налаштування означало б дати спосіб втратити архів одним кліком: зміни ім’я на сайті, де вже є проєкти, і всі наявні записи лишаться під типом, який більше ніхто не реєструє. З адмінки вони зникнуть, а їхні адреси перестануть відкриватися. Задати імена, як і раніше, можна у файлі конфігурації сайту — до появи першого проєкту й ніколи після.

Як він влаштований усередині

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

API, до якого звертається тема, — це один клас і один імпорт, а не розсип глобальних функцій.

Залежностей у рантаймі немає зовсім, тому репозиторій працює одразу після клонування. Composer потрібен лише для інструментів розробки й ставиться окремо від плагіна — так тестовий клас ніколи не потрапить до автозавантажувача, який іде в постачання.

Що проганяється перед релізом

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

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

Ролі

Розробник
Konstantin Sorokin

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