Как мне обернуть каждый элемент в div с помощью WordPress?

Как можно настроить функцию с регулярным выражением, чтобы обертывание в div применялось только к корневым элементам и не вмешивалось в шорткоды? В частности, какой приоритет следует установить для функции обработки контента, чтобы она корректно обрабатывала блоки и не вмешивалась в шорткоды?
  • 24 января 2024 г. 6:08
Ответы на вопрос 2
Чтобы обернуть корневые элементы контента в `div` используя WordPress и при этом не вмешиваться в шорткоды, вам нужно добавить фильтр в файл `functions.php` вашей темы. В WordPress шорткоды обрабатываются на различных уровнях приоритета, так что важно установить правильный приоритет для вашего фильтра. По умолчанию шорткоды обрабатываются на приоритете 11 функцией `do_shortcode`.

Вот пример функции, которая должна сработать для оборачивания корневых элементов контента (не вложенных тегов) в `div`:

```php
add_filter('the_content', 'wrap_root_elements_in_div', 20);

function wrap_root_elements_in_div($content) {
    // Возвращаем оригинальный контент, если это страница администратора или не содержит основного текста
    if (is_admin() || empty($content)) {
        return $content;
    }

    // Отключаем обработку шорткодов во время применения регулярного выражения и сохраняем текущее состояние
    $original_do_shortcode = $GLOBALS['shortcode_tags'];
    remove_all_shortcodes();

    // Применение регулярного выражения к контенту
    $pattern = '#(?<=^|</div>)([^<]+|<[^/]+?>.*?</[^>]+?>|\[.*?\])(?=$|<div>)#s';
    $replacement = '<div class="custom-wrapper">$1</div>';
    $content = preg_replace($pattern, $replacement, $content);

    // Восстановление обработки шорткодов
    $GLOBALS['shortcode_tags'] = $original_do_shortcode;

    return $content;
}
```

В этой функции:

1. `add_filter('the_content', 'wrap_root_elements_in_div', 20);` добавляет нашу функцию обработки к фильтру `the_content` с приоритетом 20, что означает, что она будет выполняться после обработки шорткодов.

2. В функции `wrap_root_elements_in_div` мы временно отключаем обработку шорткодов, чтобы наше регулярное выражение не воздействовало на шорткоды.

3. Применяем регулярное выражение к контенту, чтобы обернуть корневые элементы в `div`.

4. В конце функции мы восстанавливаем обработку шорткодов в исходное состояние.

Пожалуйста, учтите, что приведенное выше регулярное выражение является простым примером и может не охватить все возможные варианты HTML-контента. Регулярные выражения могут быть сложными и их использование для парсинга HTML не всегда оправдано. В некоторых случаях лучше применять DOM-манипуляцию с использованием специализированных PHP-библиотек, таких как DOMDocument.

Также, изменения следует тестировать на тестовой среде перед применением на продакшн-сайте, чтобы убедиться, что нет нежелательных побочных эффектов.
Посмотрите в коде где у вас функция создания шорткода и ее приоритет, после этого просто укажите приоритет обертке раньше (ближе к 1). Скорее всего приоритет шорткода стоит 10. 
PS На вашем месте я бы лучше шаблон переписал , делать регулярку чтоб он оборачивал все в div сомнительное занятие
Похожие вопросы