Есть ли функция автоматического включения un-wp?
У меня проблема с WP, и мне нужна ваша помощь. В некоторых моих сообщениях уже есть контент, к которому были применены фильтры "wp_autop". Этот фильтр превратил все двойные линии разрыва в тег <p>
. Я хочу противоположного: превратить все теги <p>
в двойные линии разрыва.
У вас есть какие-нибудь предложения? Спасибо.
4 answers
Я только что столкнулся с этой ситуацией. Вот функция, которую я использовал для отмены wpautop. Возможно, я что-то упускаю, но это хорошее начало:
function reverse_wpautop($s)
{
//remove any new lines already in there
$s = str_replace("\n", "", $s);
//remove all <p>
$s = str_replace("<p>", "", $s);
//replace <br /> with \n
$s = str_replace(array("<br />", "<br>", "<br/>"), "\n", $s);
//replace </p> with \n\n
$s = str_replace("</p>", "\n\n", $s);
return $s;
}
Фильтр не записывается в базу данных, фильтруется на интерфейсе, при просмотре поста или другого контента. Вы деактивируете фильтр и пишете собственный фильтр для установки своей пользовательской разметки.
Мне также нужен был способ сделать это, но я не был доволен ни одним из существующих решений, поэтому решил его создать. Надеюсь, это кому-то поможет.
<?php
/**
* Replaces paragraph elements with double line-breaks.
*
* This is the inverse behavior of the wpautop() function
* found in WordPress which converts double line-breaks to
* paragraphs. Handy when you want to undo whatever it did.
*
* @see wpautop()
*
* @param string $pee
* @param bool $br (optional)
*
* @return string
*/
function fjarrett_unautop( $pee, $br = true ) {
// Match plain <p> tags and their contents (ignore <p> tags with attributes)
$matches = preg_match_all( '/<(p+)*(?:>(.*)<\/\1>|\s+\/>)/m', $pee, $pees );
if ( ! $matches ) {
return $pee;
}
$replace = array( "\n" => '', "\r" => '' );
if ( $br ) {
$replace['<br>'] = "\r\n";
$replace['<br/>'] = "\r\n";
$replace['<br />'] = "\r\n";
}
foreach ( $pees[2] as $i => $tinkle ) {
$replace[ $pees[0][ $i ] ] = $tinkle . "\r\n\r\n";
}
return rtrim(
str_replace(
array_keys( $replace ),
array_values( $replace ),
$pee
)
);
}
Https://gist.github.com/fjarrett/ecddd0ed419bb853e390
Бонус: Вы также можете потенциально использовать это, чтобы определить, был ли контент изменен wpautop
.
$is_wpautop = ( $content !== fjarrett_unautop( $content ) );
В WordPress есть встроенная функция, но она запускается на JavaScript только при переключении с визуального на HTML в редакторе сообщений (и это действительно глючит, если на самом деле используется html). Если это просто обычный контент публикации (не html-код), то вы можете просто редактировать каждую публикацию, переключать редактор туда и обратно, а затем сохранять.
Это, вероятно, самый трудоемкий, но безопасный способ.