leere Absätze aus the_content entfernen?


33

Hey Leute, ich möchte einfach die Erstellung leerer Absätze in meinem WordPress-Post verhindern. Das passiert ziemlich oft, wenn versucht wird, Inhalte manuell zu platzieren.

Ich weiß nicht, warum dies nicht wirksam wird?

/*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');

bearbeiten / aktualisieren:

Das Problem scheint folgendes zu sein:

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');

Ich habe diese Funktion selbst durchgeführt, um nach einer Art Shortcode-Muster in meinen Posts und Seiten zu filtern. Obwohl in meinem Backend der Beitrag komplett ohne Absätze und unnötige Abstände geschrieben wurde, sieht das Ergebnis so aus:

<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>

Hast du eine Idee, woher dieses leere P kommt?



1
Versuchen Sie, Ihren Filter laufen zu lassen, bevor wpautopes Sache ist, zB. add_filter('the_content', 'qanda', 7 );..
t31os

@ t31os: Kannst du deinen Kommentar auf eine Antwort verschieben, damit wir darüber abstimmen können?
Jan Fabry

Antworten:


20

Wordpress wird automatisch eingefügt <p>und </p>Tags , die Inhalte bricht in einem Beitrag oder eine Seite zu trennen. Wenn Sie diese aus irgendeinem Grund entfernen möchten oder müssen, können Sie einen der folgenden Codeausschnitte verwenden.

Um den wpautop-Filter vollständig zu deaktivieren, können Sie Folgendes verwenden:

remove_filter('the_content', 'wpautop');

Wenn Sie dennoch möchten, dass dies funktioniert, fügen Sie Ihrem Filter einen späteren Prioritätswert hinzu, beispielsweise:

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

2
Danke dir! Ich weiß, WordPress fügt automatisch p-Tags ein. Es kann jedoch vorkommen, dass sich irgendwo in meinem Inhalt nur leere <p> </ p> -Tags befinden (wenn ich sie mit einem Tool inspiziere) ... das passiert, wenn ich viele Posts entferne und bearbeite. Ich möchte einfach keine leeren Absätze in meinem Inhalt haben, das ist alles. Ich brauche Absätze, nur keine leeren. Der 99999 macht keinen Unterschied. Funktioniert einfach nicht. der wpautop filter ist nicht was ich will. Es verhindert alle <p> und die automatische Formatierung. Ich will nur keine leeren P's!
Mathiregister

Ich habe meinen Beitrag aktualisiert, damit Sie sehen, was ich meine! Ich habe eine Funktion, die bereits den Inhalt filtert. es fügt divs ein und es scheint, dass WordPress <p> </ p> davor und danach einfügt, ich verstehe es einfach nicht. irgendwelche Ideen?
Mathiregister

21

Ich hatte das gleiche Problem wie du. Ich habe gerade eine ... sagen wir mal ... nicht sehr schöne Lösung gemacht, aber sie funktioniert und bis jetzt ist sie die einzige Lösung, die ich habe. Ich habe eine kleine JavaScript-Zeile hinzugefügt. Es braucht jQuery, aber ich bin sicher, dass Sie es ohne herausfinden können.

Das ist mein kleiner JS:

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

Das funktioniert bei mir!


oh aint das eine süße kleine Nummer! Danke für den Tipp - es funktioniert für mich und falls sich jemand anders wundert, wie man es benutzt, einfach in die benutzerdefinierte JS-Datei Ihres Themes einfügen.
Sol

11
Sie können dies auch mit CSS tun:p:empty { display:none; }

@D_N Verwenden von CSS zum Ausblenden leerer Absatz-Tags funktioniert nur für <p></p>, aber nicht für <p>\n</p>.
Michael Ecklund

11

Ich weiß, dass dies bereits als "gelöst" markiert ist, aber nur als Referenz, hier ist eine Funktion, die genau das tut, was Sie wollen, ohne dass Sie Markups zu Posts hinzufügen müssen. Fügen Sie dies einfach in die functions.php Ihres Themes ein:

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);
}

Dies ist aus dieser Zusammenfassung: https://gist.github.com/1668216


6
Nur ein kleiner Hinweis zur Verwendung von force_balance_tags () ... Ich bin auf einen kniffligen Fehler gestoßen, der durch diese Funktion verursacht wurde, als sie für Inhalte verwendet wurde, die JavaScript enthielten (JS stammte von Gravity Forms, wenn Ajax für ein Formular verwendet wurde). Es sind Probleme bekannt, force_balance_tagswenn es <in bestimmten Situationen auf den Charakter trifft . Weitere Informationen finden Sie im Ticket [9270] ( core.trac.wordpress.org/ticket/9270 ).
Dave Romsey

Ich hatte das gleiche Problem, das von Dave hervorgehoben wurde: Das Snippet entfernte eingebettetes YouTube-Video und das verursachte Validierungsprobleme auch auf Amp-Seiten.
Marco Panichi

11

Benutze einfach CSS

p:empty {
  display: none;
}

Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu
Pieter Goosen

4
@PieterGoosen ist es schon selbsterklärend
mindestens drei Zeichen

Wenn Sie sie nur aus Platzgründen nicht anzeigen möchten, funktioniert dies bis zum IE9. caniuse.com/#feat=css-sel3 und developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty für mehr.
Will

1
nette Option mit CSS-Selektor-Methode, wusste nicht, dass es existiert. Vielen Dank!
i_a

1
Zu Ihrer Information: Wenn sich &nbsp;innerhalb des <p> -Tags befindet, funktioniert dies nicht.
RynoRn

5

Sie könnten einfach Ihren Filter laufen lassen, bevor sich dieser unangenehme wpautopHaken einstellt und mit dem Markup herumwirbelt.

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

Auf diese Weise haben Sie bereits konvertiert, was Sie zum Zeitpunkt des Verbindungsaufbaus benötigen, was in einigen Fällen hilfreich ist.


3

Gleicher Ansatz wie 2 Antworten vor mir, aber ein aktualisierter regulärer Ausdruck, weil er bei mir nicht funktioniert hat.

the regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (Nicht-Capture-Gruppe, die nach einer beliebigen Anzahl von Whitespaces oder &nbsp;s innerhalb des p-Tags sucht , alles unter Berücksichtigung der Groß- und Kleinschreibung.

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

0

Ich fand das seltsam, aber beim Aufrufen the_content()werden Absätze in der von Ihnen beschriebenen Weise eingefügt. Wenn Sie den HTML-Code so haben möchten, wie Sie ihn eingegeben haben (wie "HTML anzeigen" beim Bearbeiten), verwenden Sie get_the_content()what, um den Inhalt ohne Formatierung und Absatz-Tags zurückzugeben.

Da es es zurückgibt, stellen Sie sicher, dass Sie etwas verwenden wie:

echo get_the_content ();

Siehe auch: http://codex.wordpress.org/Function_Reference/get_the_content


gut danke Das will ich aber nicht! Ich brauche normale Absätze. Erstens ist es semantisches Markup und zweitens ist es genau so, wie es sein soll. Ich möchte keine leeren Absätze haben, die keinen Sinn ergeben! Einfach weil ich das Styling auf diese Absätze angewendet habe, erscheinen auch leere Absätze mit diesem Styling und meine Seite sieht seltsam aus.
Mathiregister

Ich frage mich, warum mein Add_Filter-Ding nicht funktioniert.
Mathiregister

Erwischt. Nun, eine Sache, die ich empfehlen würde, ist, ein oder zwei Mal von HTML zu Visual und zurück zu wechseln. Ich glaube, wenn der WYSIWYG-Editor geladen wird, werden leere Absatz-Tags entfernt.
KWD

0

Dadurch werden rekursiv alle leeren HTML-Tags aus der Zeichenfolge entfernt

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
);}

Das Muster stammt aus http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html


0

Wenn Sie <p>Tags mit Leerzeichen im Inhalt haben, gehen Sie zu Ihrem Beitrag oder Ihrer Seite und bearbeiten Sie ihn nicht im visuellen Stil.

Sie würden einige &nbsp;darin finden. Löschen Sie es und die leeren <p>Umbauten verschwinden.


0

Um nur HTML-Inhalte ohne zu haben

Tags können wir die folgende Schleife verwenden, um nur den HTML-Code auszugeben, ohne den Beitrag oder die Seite zu formatieren

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.