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?

mathiregister
quelle
Siehe die Frage: Ich verwende einen Filter, um die <p> -Tags automatisch
umbrechen zu lassen
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);
Bainternet
quelle
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!

David Faber
quelle
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

Michelle
quelle
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;
}
mindestens drei Zeichen
quelle
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.

t31os
quelle
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);
kater louis
quelle
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

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

user2914440
quelle
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.

Christian Isak
quelle
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; ?>
Shashank
quelle