Чтобы обернуть корневые элементы контента в `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.
Также, изменения следует тестировать на тестовой среде перед применением на продакшн-сайте, чтобы убедиться, что нет нежелательных побочных эффектов.