Как отфильтровать контент блока в WordPress

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

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

Краткое введение

Каждый раз, когда запись отображается во фронтенде, функция render_block() генерирует HTML блока, начиная с объекта block.

Данная функция включает в себя следующие фильтры:

В конце этой функции объект блока парсится с помощью метода render() класса class-wp-block.php. Внутри этого метода применяются два фильтра. Это фильтры render_block и render_block_{$this->name}.

Эти два фильтра похожи друг на друга. Фильтр render_block подключает функцию ко всем блокам, входящим в запись, а фильтр render_block_{$this->name} подключает только блоки указанного типа.

Фильтр render_block

Этот фильтр позволяет подключить функцию, изменяющую содержимое одного блока.

Пример 1: Модификация блока на основе значения атрибута блока

С помощью этого фильтра можно модифицировать блоки на основе значений определенных атрибутов блока.

В приведенном ниже примере, когда атрибут hideBlock произвольного блока равен 1, вместо HTML блока возвращается пустая строка.

Этот прием мы использовали при разработке Restricted Blocks, плагина, который накладывает ограничения на определенные блоки на основе пользовательских условий. В этом плагине пользователь задает тип ограничения с помощью селектора, сохраняемого как атрибут блока. Затем плагин использует фильтр render_block для чтения этого атрибута блока и соответствующего изменения содержимого блока.

Пример 2: Изменение только определенных типов блоков

Во втором примере мы добавим рекламный блок перед каждым заголовком статьи. Чтобы определить тип блока, мы проверяем значение $block['blockName'].

Фильтр render_block_{$this->name}

Этот динамический фильтр позволяет подключить функцию, изменяющую блоки определенного типа.

Имя этого фильтра состоит из фиксированной части render_block_, за которой следует переменная часть с именем блока. Например, core/paragraph, core/image, plugin-name/custom-block и т.д.

Стоит отметить, что данный фильтр был добавлен ещё в версии WordPress 5.7. Дополнительные подробности можно найти в официальном сообщении.

Пример 1: Удаление всех изображений из записи

В данном примере мы используем хук render_block_core/image для скрытия всех изображений, входящих в статью.

Для всех блоков, зарегистрированных как core/image, вызывается функция hide_images(), которая всегда возвращает пустую строку. Как следствие, HTML всех изображений будет удален из записи.

Пример 2: Сбор данных о всех заголовках

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

Для фильтрации всех блоков с заголовками используется хук render_block_core/heading.

Выводы

Надеюсь, этот урок помог вам в фильтрации содержимого отдельных блоков.

Для получения более подробной информации по этому вопросу я рекомендую ознакомиться с ядром WordPress, в частности, со следующими файлами:

  • wp-includes/class-wp-block.php
  • wp-includes/blocks.php