WPに問題があります。あなたの助けが必要です。私の投稿の中にはすでに "wp_autop"フィルタが適用されているコンテンツがあるものがあります。このフィルタは二重改行をすべて<p>
タグに変えました。私は反対のことをしたい:すべての<p>
タグを二重改行にする。
何か提案はありますか?ありがとうございました。
私はちょうどこの状況に遭遇しました。これは私が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コードではない)の場合は、各投稿を編集し、エディタを前後に切り替えてから保存できます。
これはおそらく最も労働集約的ですが、最も安全な方法です。