Rimuovere paragrafi vuoti da the_content in WordPress?
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?
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!

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.

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.

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

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

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

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!

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

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.

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.

Stesso approccio delle 2 risposte precedenti alla mia, ma con una regex aggiornata, perché la sua non funzionava per me.
La regex: /<p>(?:\s| )*?<\/p>/i
(gruppo non catturante che cerca qualsiasi numero di spazi bianchi o
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| )*?<\/p>/i', '', $content);
}, 10, 1);

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

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.

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

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

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

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();?>
