the_contentから空の段落を削除しますか?


33

皆さん、私は単に私のワードプレスの投稿で空の段落が作成されないようにしたいだけです。これは、コンテンツを手動で配置しようとすると頻繁に発生します。

これがなぜ効かないのか分かりませんか?

/*Remove empty paragraph tags from the_content*/
function removeEmptyParagraphs($content) {

    /*$pattern = "/<p[^>]*><\\/p[^>]*>/";   
    $content = preg_replace($pattern, '', $content);*/
    $content = str_replace("<p></p>","",$content);
    return $content;
}

add_filter('the_content', 'removeEmptyParagraphs');

編集/更新:

問題はこれのようです:

function qanda($content) {

    // filters for [q=some question] and [a=some answer]
    // wraps it inside of <div class="qanda"><div class="question"> </div><div class="answer"> </div></div>
    $content = preg_replace('/\[q=(.+?)].+?\[a=(.+?)]/is', '<div class="qanda"><div class="question">$1</div><div class="answer">$2</div></div>', $content);

    return $content;
}

add_filter('the_content', 'qanda');

私は自分の投稿とページで一種のショートコードパターンをフィルタリングするために自分でこの機能を実行しました。私のバックエンドでは、投稿は段落と不要なスペースなしで完全に行われますが、結果は次のようになります:

<div class="entry">

    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>

</div>

この空のpがどこから来たのか考えていますか?



1
wpautopたとえば、フィルタを実行する前に実行してみてください。add_filter('the_content', 'qanda', 7 );..
t31os

@ t31os:コメントに答えを移動して投票できるようにできますか?
1月ファブリ

回答:


20

WordPressは、投稿またはページ内のコンテンツの区切りを区切るタグ<p></p>タグを自動的に挿入します。何らかの理由でこれらを削除する必要がある場合は、次のコードスニペットのいずれかを使用できます。

wpautopフィルターを完全に無効にするには、次を使用できます。

remove_filter('the_content', 'wpautop');

それでも機能するようにしたい場合は、フィルタに次のような優先度の値を追加してみてください:

add_filter('the_content', 'removeEmptyParagraphs',99999);

2
ありがとうございました!wordpressはpタグを自動的に挿入することを知っています。しかし、コンテンツのどこかに空の<p> </ p>タグがある場合がいくつかあります(何らかのツールでそれを検査するとき)...それは、投稿の多くの削除と編集を行うときに起こります。コンテンツに空の段落を入れたくないだけです。空の段落ではなく、段落が必要です。99999は違いはありません。うまくいきません。wpautopフィルターは私が望むものではありません。すべての<p>と自動フォーマットを防ぎます。空のpが欲しくありません!
mathiregister

投稿を更新したので、意味がわかります!すでにコンテンツをフィルタリングする機能を実行しました。それはdivを挿入し、wordpressがその前後に<p> </ p>を挿入しているように見えますが、私はそれを取得しません。何か案は?
mathiregister

21

私はあなたと同じ問題を抱えていました。私はちょうど...言った...とても美しい解決策ではありませんが、それは機能し、これまでのところ私が持っている唯一の解決策です。JavaScriptの行を少し追加しました。それにはjQueryが必要ですが、それがなくても理解できると確信しています。

これは私の小さなJSです。

$('p:empty').remove();

これは私のために働く!


ああ、それは甘い小さな数じゃない!ヒントをありがとう-それは私のために機能し、他の誰かがそれを使用する方法を疑問に思った場合は、あなたのテーマのカスタムJSファイルに入れてください。
ソル

11
:あなたはまた、CSSでこれを行うことができますp:empty { display:none; }

@D_N CSSを使用して空のParagraphタグを非表示にするのは<p></p>、でのみ機能しますが、では機能しません<p>\n</p>
マイケルエクルンド

11

これはすでに「解決済み」とマークされていることを知っていますが、参考のために、投稿にマークアップを追加することなく、必要なことを正確に実行する関数を次に示します。これをテーマのfunctions.phpに追加してください:

add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content){
    $content = force_balance_tags($content);
    return preg_replace('#<p>\s*+(<br\s*/*>)?\s*</p>#i', '', $content);
}

これは、この要点からのものです:https : //gist.github.com/1668216


6
force_balance_tags()の使用に関するちょっとした注意... JavaScriptを含むコンテンツで使用すると、この関数によって引き起こされる厄介なバグに遭遇しました(JSはフォームでajaxを使用するときにGravity Formsから来ていました)。特定の状況でキャラクターにforce_balance_tags遭遇すると、既知の問題があります<。詳細については、チケット[9270](core.trac.wordpress.org/ticket/9270)を参照してください。
デイブロムジー

Daveによって強調された同じ問題がありました。スニペットは埋め込まれたyoutubeビデオを削除し、それはampページでも検証問題を引き起こしました。
マルコパニチ

11

CSSを使用するだけ

p:empty {
  display: none;
}

答えに説明を追加してください
ピーターグーセン

4
@PieterGoosenそれはすでに自明です
少なくとも3文字

間隔を空けるためにそれらを表示したくない場合は、IE9までうまくいきます。caniuse.com/#feat=css-sel3およびdeveloper.mozilla.org/en-US/docs/Web/CSS/%3Aemptyをご覧ください。
ウィル

1
CSSセレクターメソッドを備えた素晴らしいオプションで、存在することを知りませんでした。ありがとう!
i_a

1
参考:&nbsp;<p>タグ内にある場合、これは機能しません。
RynoRn

5

その厄介なwpautopフックの前にフィルターを実行して、マークアップを台無しにすることができます。

add_filter('the_content', 'qanda', 7 );

そうすれば、フックするまでに必要なものをすでに変換しているので、場合によっては役立ちます。


3

私の前の2つの答えと同じアプローチですが、更新された正規表現です。

正規表現:/<p>(?:\s|&nbsp;)*?<\/p>/i&nbsp;pタグ内の任意の数の空白またはsを検索する非キャプチャグループ。すべて大文字と小文字を区別しません。

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);

0

これはおかしいと感じましたが、実際に呼び出すthe_content()と、あなたが説明した方法で段落が挿入されます。基本的に入力したようなHTMLコード(編集時の "HTMLの表示"と同じ)が必要な場合get_the_content()は、フォーマットおよび段落タグなしでコンテンツを返すwhich を使用します。

返されるので、次のようなものを使用してください。

echo get_the_content();

参照:http : //codex.wordpress.org/Function_Reference/get_the_content


有難う御座います。しかし、私はそれを望んでいません!通常の段落が必要です。最初はセマンティックマークアップであり、2番目は本来の方法です。意味をなさない空の段落を持ちたくないだけです!それらの段落にスタイリングを適用しているため、空の段落もこのスタイリングで表示され、ページが奇妙に見えます。
mathiregister

私は実際に私のadd_filterがうまくいかないのだろうか?
mathiregister

わかった。さて、HTMLからビジュアルに切り替えて1〜2時間戻すことをお勧めします。WYSIWYGエディターが読み込まれると、空の段落タグが削除されると思います。
cwd

0

これにより、文字列からすべての空のhtmlタグが再帰的に削除されます

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Return if string not given or empty.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Recursive empty HTML tags.
       return preg_replace (

              //** Pattern written by Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Replace with nothing if string empty.
             !is_string ($repto) ? '' : $repto,

            //** Source string
           $str
);}

パターンはhttp://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.htmlから取得されます


0

<p>コンテンツに空白を含むタグがある場合は、投稿またはページに移動して、視覚的なスタイルではなく編集します。

あなたは&nbsp;そこにいくつかを見つけるでしょう。それを削除すると空の<p>タグは消えます。


0

なしでhtmlコンテンツのみを持つため

次のループを使用して、投稿またはページの書式を設定せずにhtmlのみを出力できるタグ

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.