web-dev-qa-db-de.com

leere Absätze aus the_content entfernen?

Hey Leute, ich möchte einfach die Erstellung von leeren Absätzen 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 ausgefü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?

33
mathiregister

WordPress fügt automatisch <p>- und </p>-Tags ein, die die Inhaltsumbrüche innerhalb eines Posts oder einer Seite 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);
20
Bainternet

Ich hatte das gleiche Problem wie du. Ich habe gerade eine ... sagen wir mal ... nicht sehr schöne Lösung, 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!

20
David Faber

Benutze einfach CSS

p:empty {
  display: none;
}

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 diesem Gist: https://Gist.github.com/1668216

10
Michelle

Sie könnten Ihren Filter einfach ausführen, bevor sich die böse wpautop einhakt 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.

5
t31os

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 Whitespace- oder &nbsp;s innerhalb von p-tag 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);
3
kater louis

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
user2914440

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 dort einen &nbsp; finden. Löschen Sie ihn und die leeren <p>-Tags verschwinden.

0
Christian Isak

Um nur HTML-Inhalte ohne zu haben

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
0
Shashank

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

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

0
cwd