web-dev-qa-db-ja.com

htmlエディターが<p>タグをショートコードや画像などに追加しないようにする方法

これは個々のトピックとして扱われますが、探しているのは、<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
Jason

1.コンテンツをフィルタリングする

上記の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;
}

正規表現のためのリソース

  • regular-expressions.info - マニュアル、基本、および高度なチュートリアル
  • regexpal.com - オンザフライの正規表現テスターで、とても役に立ちました
  • phpの正規表現関数に関しては、 manual が最良のリソースのままです

3.のRegExは説明しました

実際の正規表現は<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のみが後方参照の対象になります。

4.サイドノート

これは主にPHPと正規表現に関するものなので、この質問はWPSEの範囲の境界線です。 StackOverflowのほうがいいかもしれません。とにかく、今それは答えている。

3
Johannes Pille

Pタグを完全に削除するのは悪い習慣だと思います。空のpタグには、使うことができるCSSルールがあります。 p:empty {display:none}は動作するはずです。

0
Jamie

shortcode_unautopフィルタを使用できます。 https://developer.wordpress.org/reference/functions/shortcode_unautop/

0
paramir