usunąć puste akapity z treści?

33

Cześć chłopaki, chcę po prostu zapobiec tworzeniu pustych akapitów w moim poście z wordpress. Zdarza się to dość często podczas ręcznego umieszczania zawartości w przestrzeni.

Nie wiem, dlaczego to nie działa?

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

edycja / aktualizacja:

wygląda na to, że problem jest następujący:

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

Zrobiłem tę funkcję sam, aby filtrować w poszukiwaniu rodzaju kodu shortcode w moich postach i stronach. Mimo że w moim backendie post został całkowicie wykonany bez akapitów i niepotrzebnych odstępów, wynik wygląda następująco:

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

jakiś pomysł, skąd pochodzą te puste p?

mathiregister
źródło
1
Spróbuj uruchomić filtr zanim wpautopto zrobi, np. add_filter('the_content', 'qanda', 7 );..
t31os
@ t31os: Czy możesz przenieść swój komentarz do odpowiedzi, abyśmy mogli na niego głosować?
Jan Fabry,

Odpowiedzi:

20

WordPress automatycznie wstawi <p>i doda </p>tagi oddzielające podziały treści w postie lub na stronie. Jeśli z jakiegoś powodu chcesz lub musisz je usunąć, możesz użyć jednego z następujących fragmentów kodu.

Aby całkowicie wyłączyć filtr wpautop, możesz użyć:

remove_filter('the_content', 'wpautop');

Jeśli nadal chcesz, aby to działało, spróbuj dodać później wartość priorytetu do swojego filtra, na przykład:

add_filter('the_content', 'removeEmptyParagraphs',99999);
Bainternet
źródło
2
Dziękuję Ci! Wiem, że wordpress automatycznie wstawia tagi p. Jednak zdarzają się przypadki, w których gdzieś w mojej zawartości są puste tagi <p> ​​</p> (kiedy sprawdzam to za pomocą jakiegoś narzędzia) ... dzieje się tak, gdy dużo usuwam i edytuję posty. Po prostu nie chcę mieć pustych akapitów w mojej treści, to wszystko. Potrzebuję akapitów, tylko nie pustych. 99999 nie robi różnicy. Po prostu nie działa. filtr wpautop nie jest tym, czego chcę. Zapobiega wszystkie <p> i autoformatowaniu. Po prostu nie chcę żadnych pustych p!
mathiregister
zaktualizowałem swój post, abyś zobaczył, co mam na myśli! Zrobiłem funkcję, która już filtruje zawartość. wstawia div i wydaje się, że wordpress wstawia <p> </p> przed i po nim, po prostu nie rozumiem. jakieś pomysły?
mathiregister
21

Miałem ten sam problem, co ty. Właśnie zrobiłem ... powiedzmy ... niezbyt piękne rozwiązanie, ale działa i jak dotąd jest to jedyne rozwiązanie, jakie mam. Dodałem małą linię JavaScript. Potrzebuje jQuery, ale jestem pewien, że możesz to rozwiązać bez.

Oto mój mały JS:

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

To działa dla mnie!

David Faber
źródło
och, nie jest to słodka mała liczba! Dzięki za wskazówkę - działa dla mnie i na wypadek, gdyby ktoś zastanawiał się, jak go użyć, po prostu umieść go w niestandardowym pliku JS motywu.
Sol
11
Możesz to również zrobić za pomocą CSS:p:empty { display:none; }
@D_N Używanie CSS do ukrywania pustych tagów akapitu działa tylko dla, <p></p>ale nie działa <p>\n</p>.
Michael Ecklund
11

Wiem, że jest to już oznaczone jako „rozwiązane”, ale tylko dla odniesienia, oto funkcja, która robi dokładnie to, co chcesz, bez konieczności dodawania znaczników do postów. Po prostu umieść to w funkcjach swojego motywu. 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);
}

To z tej treści: https://gist.github.com/1668216

Michelle
źródło
6
Tylko mała uwaga na temat użycia force_balance_tags () ... Wpadłem na trudny błąd spowodowany przez tę funkcję, gdy był on używany w treści zawierającej JavaScript (JS pochodził z Gravity Forms, kiedy używałem ajax na formularzu). Znane są problemy, force_balance_tagsgdy napotyka on <postać w określonych sytuacjach. Zobacz bilet [ 9270 ] ( core.trac.wordpress.org/ticket/9270 ), aby uzyskać szczegółowe informacje.
Dave Romsey,
Miałem ten sam problem, na który zwrócił uwagę Dave: fragment usunął osadzone wideo z youtube i to spowodowało problemy z weryfikacją na stronach wzmacniacza.
Marco Panichi
11

Po prostu użyj CSS

p:empty {
  display: none;
}
co najmniej trzy znaki
źródło
Dodaj wyjaśnienie do swojej odpowiedzi
Pieter Goosen
4
@PieterGoosen jest już zrozumiałe
co najmniej trzy znaki
Jeśli chcesz uniknąć wyświetlania ich w celu uzyskania odstępów, działa to dobrze aż do IE9. caniuse.com/#feat=css-sel3 i developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty po więcej.
Czy
1
fajna opcja z metodą wyboru CSS, nie wiedziałam, że istnieje. dzięki!
i_a
1
FYI: Jeśli &nbsp;wewnątrz znacznika <p> nie będzie to działać.
RynoRn
5

Możesz po prostu uruchomić filtr, zanim te paskudne wpautopzahaczenia i bałagan ze znacznikami.

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

W ten sposób przekonwertowałeś już to, czego potrzebujesz, zanim się połączy, co w niektórych przypadkach pomaga.

t31os
źródło
3

To samo podejście niż 2 odpowiedzi przede mną, ale zaktualizowane wyrażenie regularne, ponieważ jego nie działało dla mnie.

regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (grupa nie przechwytująca szukająca dowolnej liczby białych znaków lub &nbsp;s wewnątrz tagu p, wszystkie bez znaczenia.

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
Kater Louis
źródło
0

Uważam to za dziwne, ale w rzeczywistości wywołanie the_content()spowoduje wstawienie akapitów w opisany sposób. Jeśli chcesz kod HTML, w zasadzie tak jak go wpisałeś (to samo, co „edytuj HTML” podczas edycji), użyj tego, get_the_content()który zwraca treść bez formatowania i znaczników akapitu.

Ponieważ to zwraca, upewnij się, że używasz czegoś takiego:

echo get_the_content ();

Zobacz także: http://codex.wordpress.org/Function_Reference/get_the_content

cwd
źródło
Dziękuję. Jednak tego nie chcę! Potrzebuję normalnych akapitów. Po pierwsze, znacznik semantyczny, a po drugie taki właśnie powinien. Po prostu nie mam pustych akapitów, które nie mają sensu! Po prostu dlatego, że zastosowałem styl do tych akapitów, w tym stylu pojawiają się puste akapity, a moja strona wygląda dziwnie.
mathiregister
Naprawdę zastanawiam się, dlaczego mój add_filter coś nie działa?
mathiregister
Gotcha Cóż, jedną rzeczą, którą poleciłbym wypróbowanie, jest przejście z HTMLa na visual i cofnięcie się raz lub dwa. Wierzę, że kiedy edytor WYSIWYG ładuje się, usuwa puste tagi akapitów.
cwd
0

Spowoduje to rekurencyjne usunięcie wszystkich pustych tagów HTML z ciągu

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

Wzór pochodzi z http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

użytkownik2914440
źródło
0

Jeśli masz <p>w tekście tagi z białymi spacjami, przejdź do posta lub edytuj go nie w stylu wizualnym.

znajdziesz &nbsp;tam trochę . Usuń go, a puste <p>tagi znikną.

Christian Isak
źródło
0

Aby mieć tylko zawartość HTML bez

tagi możemy użyć poniższej pętli, aby umieścić tylko HTML bez formatowania postu lub strony

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Shashank
źródło