Как подружить WordPress и Twig

Click here to view original web page at www.kobzarev.com
Обложка к записи Как подружить WordPress и Twig

Twig — компилирующий обработчик шаблонов с открытым исходным кодом, написанный на языке программирования PHP

Что такое шаблонизатор?

Шаблонизатор (в web) — программное обеспечение, позволяющее использовать html-шаблоны для генерации конечных html-страниц. Основная цель использования шаблонизаторов — это отделение представления данных от исполняемого кода. Часто это необходимо для обеспечения возможности параллельной работы программиста и дизайнера-верстальщика. Использование шаблонизаторов часто улучшает читаемость кода и внесение изменений во внешний вид, когда проект целиком выполняет один человек.

Wikipedia

Самая важная функция шаблонизатора это именно отделение представления данных от исполняемого кода. Именно этого в темах WordPress не хватает совсем. В файлах шаблонов страниц можно добавить какой угодно код и это сильно соблазняет написать говнокод.

Кроме всего прочего большинство шаблонизаторов сокращают синтаксис кода.

Шаблонизаторы для PHP

На момент написания статьи самые популярные шаблонизаторы для php были:

  • Twig (Symfony)
  • Blade (Laravel)
  • Smarty (просто старый :))

Все они достаточно похожи между собой. Вы можете выбрать тот, который вам нравится больше. Мой выбор пал на Twig.

Установка и подключение twig

В теме устанавливаем twig через composer:

Затем в functions.php где-то вначале добавляем

Использование twig-шаблонов

Для удобства я сделал абстактный класс, который дает возможность работать с twig-шаблонами. Данный в конструкторе описывает как должен работать twig и в каких директориях искать шаблоны. Также он имеет единственный публичный метод render, который и подключает сам шаблон.

Теперь для работы с шаблонами нам нужно просто наследовать этот Twig_Controller.

Заменить php-шаблоны на twig-шаблоны

Мы можем для этого использовать два хука template_redirect или template_include. Первый отрабатывает раньше и затем появляются данные в global $wp_query, $post и т.д. Попробуем переопределить шаблоны для всех страниц:

Теперь вместо page.php будет подключаться page.twig. Как поменялся синтаксис?

Было:

Стало:

Особо ничего не изменилось, но теперь данные во вьюшку могут попасть только через наш контроллер. Никаких лишних данных там не будет и соответсвенно основная задача шаблонизаторов выполняется.

Все нужные данные на фронте можно добавить в template_include. Т.к. наш контроллер мы добавили на хук template_include у нас уже есть global $wp_query, $post и остальные «прелести» WordPress’а.

Расширяем Twig под WordPress

Все же для полноценной работы не хватает хуков. Для того чтобы их добавить нужно в twig зарегистрировать необходимые функции.

В Twig_Controller создаем метод register_functions и вызываем его в конце конструктора:

Конфликт версий

Будьте готовы к тому, что версия 1.x.x не совместима с версией 2.x.x. Решить проблему можно путем добавления неймспейсов в twig-шаблон и вынесением библиотеки из vendor’a. Неймспейсы можно добавить путем утилы: https://github.com/OnTheGoSystems/twig-scoper.