Rimuovere paragrafi vuoti da the_content in WordPress?

3 apr 2011, 13:13:16
Visualizzazioni: 94.3K
Voti: 39

Ciao ragazzi, Voglio semplicemente evitare la creazione di paragrafi vuoti nei miei post di WordPress. Succede spesso quando cerco di spaziare manualmente il contenuto.

Non capisco perché questa soluzione non funziona?

/*Rimuove i tag di paragrafo vuoti da 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');

modifica/aggiornamento:

Sembra che il problema sia questo:

function qanda($content) {

    // filtra per [q=domanda] e [a=risposta]
    // li racchiude in <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');

Ho creato questa funzione per filtrare un particolare pattern di shortcode nei miei post e pagine. Nonostante nel backend il post sia completamente privo di paragrafi e spaziatura non necessaria, il risultato finale è questo:

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

Qualcuno ha idea da dove provengano questi paragrafi vuoti?

3
Commenti

Prova a eseguire il tuo filtro prima che wpautop faccia il suo lavoro, ad esempio: add_filter('the_content', 'qanda', 7 );..

t31os t31os
4 apr 2011 01:16:10

@t31os: Puoi spostare il tuo commento in una risposta così possiamo votarlo?

Jan Fabry Jan Fabry
6 apr 2011 15:31:22
Tutte le risposte alla domanda 11
3
25

Ho avuto lo stesso problema che hai tu. Ho fatto una... diciamo... soluzione non molto bella, ma funziona e finora è l'unica soluzione che ho. Ho aggiunto una piccola riga di JavaScript. Ha bisogno di jQuery, ma sono sicuro che puoi capire come fare anche senza.

Questo è il mio piccolo JS:

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

Questo funziona per me!

2 gen 2012 12:00:02
Commenti

Oh, non è una bella chicca! Grazie per il suggerimento - funziona per me e nel caso qualcun altro si chiedesse come usarlo, basta inserirlo nel file JS personalizzato del tuo tema.

SolaceBeforeDawn SolaceBeforeDawn
6 set 2012 08:08:07

Puoi anche farlo con CSS: p:empty { display:none; }

User User
20 lug 2016 04:42:00

@D_N Usare CSS per nascondere i tag Paragrafo vuoti funziona solo per <p></p> ma non funziona per <p>\n</p>.

Michael Ecklund Michael Ecklund
21 apr 2017 23:51:33
6
23

Basta usare CSS

p:empty {
  display: none;
}
30 set 2015 16:24:27
Commenti

Per favore aggiungi una spiegazione alla tua risposta

Pieter Goosen Pieter Goosen
30 set 2015 16:49:24

@PieterGoosen è già autoesplicativo

at least three characters at least three characters
1 ott 2015 15:23:54

Se vuoi solo evitare di visualizzarli per scopi di spaziatura, questa soluzione funziona bene fino a IE9. http://caniuse.com/#feat=css-sel3 e https://developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty per maggiori informazioni.

Will Will
3 gen 2016 23:11:32

ottima opzione con il metodo del selettore CSS, non sapevo esistesse. grazie!

i_a i_a
14 apr 2016 14:47:18

FYI: Se c'è &nbsp; all'interno del tag <p> questo non funzionerà.

laszlo-horvath laszlo-horvath
6 giu 2019 17:52:04

Questo in realtà non funziona.

pjk_ok pjk_ok
5 gen 2021 00:27:08
Mostra i restanti 1 commenti
2
22

WordPress inserirà automaticamente i tag <p> e </p> che separano le interruzioni di contenuto all'interno di un articolo o di una pagina. Se, per qualche motivo, vuoi o hai bisogno di rimuoverli, puoi utilizzare uno dei seguenti frammenti di codice.

Per disabilitare completamente il filtro wpautop, puoi usare:

remove_filter('the_content', 'wpautop');

Se vuoi comunque che questa funzione sia attiva, prova ad aggiungere un valore di priorità più alto al tuo filtro, come ad esempio:

add_filter('the_content', 'removeEmptyParagraphs', 99999);
3 apr 2011 15:15:51
Commenti

grazie! So che WordPress inserisce automaticamente i tag p. Tuttavia, ci sono casi in cui compaiono solo tag <p></p> vuoti da qualche parte nel mio contenuto (quando lo controllo con qualche strumento)... questo accade quando si effettua molta rimozione e modifica di post. Semplicemente non voglio avere paragrafi vuoti nel mio contenuto, tutto qui. Ho bisogno di paragrafi, ma non vuoti. Il 99999 non fa differenza. Semplicemente non funziona. Il filtro wpautop non è quello che voglio. Previene tutti i <p> e la formattazione automatica. Non voglio solo paragrafi p vuoti!

mathiregister mathiregister
3 apr 2011 15:23:07

ho aggiornato il mio post così puoi capire cosa intendo! Ho creato una funzione che filtra già il contenuto. Inserisce dei div e sembra che WordPress stia inserendo <p></p> prima e dopo di esso, proprio non lo capisco. Hai qualche idea?

mathiregister mathiregister
3 apr 2011 16:02:39
2
15

So che questo è già contrassegnato come 'risolto', ma solo per riferimento, ecco una funzione che fa esattamente quello che vuoi senza dover aggiungere alcun markup ai post. Basta inserire questo nel file functions.php del tuo tema:

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

Questo codice è preso da questa gist: https://gist.github.com/1668216

23 mag 2012 01:03:32
Commenti

Solo una breve nota sull'uso di force_balance_tags()...

Mi sono imbattuto in un bug complicato causato da questa funzione quando veniva utilizzata su contenuti che includevano JavaScript (il JS proveniva da Gravity Forms quando si utilizzava ajax su un modulo). Ci sono problemi noti con force_balance_tags quando incontra il carattere < in certe situazioni. Vedi il ticket 9270 per i dettagli.

Dave Romsey Dave Romsey
15 ago 2013 00:56:57

Ho avuto lo stesso problema evidenziato da Dave: lo snippet ha rimosso il video youtube incorporato e ciò ha causato problemi di validazione anche sulle pagine amp.

Marco Panichi Marco Panichi
29 giu 2019 15:14:49
0

Potresti semplicemente eseguire il tuo filtro prima che quel fastidioso wpautop si agganci e scombini il markup.

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

In questo modo, avrai già convertito ciò che ti serve nel momento in cui si aggancia, il che aiuta in alcuni casi.

6 apr 2011 15:40:17
0

Stesso approccio delle 2 risposte precedenti alla mia, ma con una regex aggiornata, perché la sua non funzionava per me.

La regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (gruppo non catturante che cerca qualsiasi numero di spazi bianchi o &nbsp; all'interno del tag p, tutto senza distinzione tra maiuscole e minuscole.

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

Ho trovato questa cosa strana, ma in realtà chiamare the_content() inserirà i paragrafi nel modo che descrivi. Se vuoi il codice html, sostanzialmente come lo hai inserito (lo stesso di "visualizza HTML" durante la modifica), allora usa get_the_content() che restituisce il contenuto senza formattazione e tag di paragrafo.

Poiché lo restituisce, assicurati di usare qualcosa come:

echo get_the_content();

Vedi anche: http://codex.wordpress.org/Function_Reference/get_the_content

3 apr 2011 17:40:24
Commenti

bene, grazie. Tuttavia non voglio questo! Ho bisogno di paragrafi normali. Innanzitutto è un markup semantico e in secondo luogo è semplicemente come dovrebbe essere. Non voglio avere paragrafi vuoti che non hanno senso! Semplicemente perché ho dello stile applicato a quei paragrafi e anche i paragrafi vuoti appaiono con questo stile, rendendo la mia pagina strana.

mathiregister mathiregister
3 apr 2011 17:54:39

In realtà mi chiedo perché la mia funzione add_filter non funzioni?

mathiregister mathiregister
3 apr 2011 17:55:00

Capisco. Beh, una cosa che consiglierei di provare è passare da HTML a visuale e viceversa un paio di volte. Credo che quando l'editor WYSIWYG si carica, rimuova effettivamente i tag di paragrafo vuoti.

cwd cwd
4 apr 2011 06:11:15
0

Questo rimuoverà ricorsivamente tutti i tag HTML vuoti dalla stringa

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Ritorna se la stringa non è fornita o vuota.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Tag HTML vuoti ricorsivi.
       return preg_replace (

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

             //** Sostituisci con nulla se la stringa è vuota.
             !is_string ($repto) ? '' : $repto,

            //** Stringa sorgente
           $str
);}

Il pattern è preso da http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

7 mag 2014 16:37:39
0

Se hai tag <p> con spazi vuoti nel contenuto, vai al tuo articolo o pagina e modificalo non in modalità visiva.

Troverai alcuni &nbsp; all'interno.. Eliminali e i tag <p> vuoti scompariranno.

15 mag 2017 13:33:03
0

Per ottenere solo il contenuto HTML senza i tag <p></p> possiamo utilizzare il seguente loop per visualizzare solo l'HTML senza la formattazione del post o della pagina

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
19 set 2018 14:15:56
0

Se stai ottenendo un tag <p> vuoto all'inizio della tua pagina o articolo, di solito è causato dall'inserimento di <?php the_content();?> all'interno di tag di paragrafo.

PROBLEMA

Questo è ciò che causa il tag <p> isolato all'inizio della pagina/articolo:

<p><?php the_content();?></p>

SOLUZIONE

Se rimuovi i tag <p> e mantieni solo il tag del template, risolverai il problema.

<?php the_content();?>

5 gen 2021 00:37:22