WordPress удаляет теги <p>?
Я уже сталкивался со случаем, когда WordPress добавлял теги <p>
. Однако сейчас я столкнулся с противоположной ситуацией. Когда я добавляю шорткоды [] внутри тегов <p>
, WordPress автоматически удаляет теги <p>
.
<p>[anyshortcode]Привет Мир[/anyshortcode]</p>
Превращается в:
Привет Мир
Добавление dir="ltr" к тегам <p>
, похоже, решает проблему. Возможно, есть способ добавить это программно ко всем тегам <p>
?
Есть идеи, как это исправить?
Это именно то, о чем упомянул Foxsk8 в комментарии, поэтому заслуга принадлежит ему, но эти дополнительные инструкции будут полезны. Плагин WordPress под названием TinyMCE Advanced решит вашу проблему.
Этот плагин имеет опцию внутри раздела Настройки > TinyMCE Advanced
, которая исправит исчезающие теги <p>
. Отметьте чекбокс с надписью Прекратить удаление тегов <p> и <br /> при сохранении и показывать их в текстовом редакторе
, и ваши теги <p>
будут сохранены.

TinyMCE разработан для упрощения редактирования (хотя для тех, кто разбирается в HTML, это не всегда так). По умолчанию он не должен принимать теги <p>
вокруг [БЛОКОВ]. Это связано с тем, что "[]" используются для шорткодов не только в WordPress, но и во множестве других PHP-ориентированных CMS. Шорткоды должны иметь правильную обёртку для контента.
Это означает, что решение заключается в добавлении тегов <p>
в код вашего шорткода, чтобы ваш контент был обёрнут так, как вам нужно.

В дополнение к ответам Foxsk8 и E. Serrano. Если пост содержит <p>
вокруг шорткодов, WordPress всё равно удалит их. Это происходит в фильтре shortcode_unautop, который добавляется в файле '\wp-includes\default-filters.php'. Он гарантирует, что шорткоды не будут обёрнуты в <p>...</p>
.
Поэтому нам нужно удалить этот фильтр:
remove_filter( 'the_content', 'shortcode_unautop' );

Вы можете добавить следующий код в файл function.php:
function content_formatter($content){
$new_content = '';
$pattern_full = '{(\[raw\].*?\[/raw\])}is';
$pattern_contents = '{\[raw\](.*?)\[/raw\]}is';
$pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($pieces as $piece) {
if (preg_match($pattern_contents, $piece, $matches)) {
$new_content .= $matches[1];
} else {
$new_content .= wptexturize(wpautop($piece));
}
}
$array = array(
'<p>[' => '[',
']</p>' => ']',
']<br />' => ']'
);
$new_content = strtr($new_content, $array);
return $new_content;
}
Теперь вызовите эту функцию там, где это необходимо, например:
<?php echo content_formatter( get_field('field_name') ); ?>
