これは個々のトピックとして扱われますが、探しているのは、<p>
タグがWordpressエディターを介してショートコードや画像にラップされるのを防ぎ、空の<p>
タグを削除する単一の関数です。
<p>
タグ、つまり<p>[shortcode]</p>
を削除します<p></p>
タグを削除します<p>
タグ、つまり<p> </p>
または<p> </p>
などを削除します。<p>
タグの周りにラップされる<img>
タグ、つまり<p><img blabla /></p>
を削除します私は$content
を取り、preg_replace()
を介して<p>
タグを削除するいくつかの異なる関数を使用しましたが、4つの要件すべてを単一の関数で動作させる方法がわかりません。
$content
が表示される前に、4つの異なる関数で$content
を実行するにはオーバーヘッドが大きすぎるようです。
また、preg_replace()のすべての合意を使用する方法を学ぶための優れたソースを推奨できますか?
上記の4つの要件を満たす1つの機能を持つコンテンツフィルタは次のとおりです。
add_filter( 'the_content', 'strip_some_paragraphs', 20 );
function strip_some_paragraphs( $content ) {
$content = preg_replace(
'/<p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>/',
'$3',
$content
);
return $content;
}
実際の正規表現は<p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>
です - '
は通常通り文字列の始めと終わりを表し、/
はパターンの区切り文字です。
<p>
タグを削除したい4つのケースについて述べました。まず最初に、私たちのパターンはそのようなタグの一つ<p>
で始まり最後のコンパニオン</p>
で終わらなければなりません。それは4つすべての場合に当てはまります。内部では、4つの異なるオプションが有効な一致になるようにします。これらのオプションを大括弧で囲み、それらを区切るにはパイプの|
文字を使用します。 |
はどちらかの側に一致し、一緒に張ることができます。あなたはそれを "OR"と考えることができます。
今オプションのために:
空白から始めましょう。 \s
は空白文字クラス(スペース、タブ、および改行)を表します。前の文字クラスの0個以上に一致させるには、スター数量詞[\s]*
を使用します。
これで、空の段落タグすべてに一致しました。そして偶然にケースが3に一致するようにケースを減らしました - ゼロまたはそれ以上が<p></p>
と<p> </p>
の両方の世話をします。いいね。
他の2つに関しては、両方をさらに[\s]*
でラップするので、<p>[shortcode]</p>
だけでなく、例えば
<p>
[shortcode] </p>
一致します。
今やらなければならないことは、ショートコードとimg
タグを一致させるパターンを考え出すことです。ここでは文字クラス否定を利用します。文字クラスの先頭にあるキャレット^
はそれを否定します。したがって、[^>]
は、>
以外のすべての文字と一致します。
画像のパターンは開始タグ<img
で始まり、ショートコードのパターンは角括弧\[
で始まります。後者は正規表現の特殊文字なので、スラッシュでエスケープする必要があります。
次に、上記の否定文字クラスをスター数量詞とともに使用します。 imgの場合は[^>]*
、ショートコードの場合は[^\]]*
で、それぞれの終了文字以外のものと一致します。それから私たちはその非常に閉じたキャラクターに一度マッチして行われます。
そのため、画像には<img[^>]*
を、ショートコードには\[[^\]]*\]
を取得します。
これらを可能な複数の空白で囲んでいます:[\s]*<img[^>]*>[\s]*
と[\s]*\[[^\]]*\][\s]*
これら2つをグループ化し、最初のオプションとして空白のみを追加すると、大括弧の内側に表示され、最後に段落タグを囲みます。
置き換えのために、実際の画像とショートコードタグが消えないように配慮した後方参照$3
を使用します。空白が残らないようにするために、可能なオプションの2つのサブグループを作成しました。 imgとshortcodeのみが後方参照の対象になります。
これは主にPHPと正規表現に関するものなので、この質問はWPSEの範囲の境界線です。 StackOverflowのほうがいいかもしれません。とにかく、今それは答えている。
Pタグを完全に削除するのは悪い習慣だと思います。空のpタグには、使うことができるCSSルールがあります。 p:empty {display:none}は動作するはずです。
shortcode_unautopフィルタを使用できます。 https://developer.wordpress.org/reference/functions/shortcode_unautop/