rimuovere i paragrafi vuoti da the_content?


33

Ehi ragazzi, voglio semplicemente impedire la creazione di paragrafi vuoti nel mio post su wordpress. Ciò accade abbastanza spesso quando si tenta di spaziare manualmente il contenuto.

Non so perché questo non abbia effetto?

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

Modifica / aggiornamento:

sembra che il problema sia questo:

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

ho fatto questa funzione da solo per filtrare una specie di modello di shortcode nei miei post e nelle mie pagine. Anche se nel mio backend il post è completamente fatto senza paragrafi e spaziature non necessarie, il risultato è simile al seguente:

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

qualche idea da dove provenga questa p vuota?



1
Prova a eseguire il filtro prima di wpautopfarlo, ad es. add_filter('the_content', 'qanda', 7 );..
t31os

@ t31os: puoi spostare il tuo commento in una risposta in modo che possiamo votare su di esso?
Jan Fabry,

Risposte:


20

WordPress inserirà <p>e </p>tag automaticamente le interruzioni di contenuto separate all'interno di un post o di una pagina. Se, per qualche motivo, desideri o devi rimuoverli, puoi utilizzare uno dei seguenti frammenti di codice.

Per disabilitare completamente il filtro wpautop, è possibile utilizzare:

remove_filter('the_content', 'wpautop');

Se vuoi ancora che funzioni, prova ad aggiungere un valore di priorità successivo al filtro in qualche modo:

add_filter('the_content', 'removeEmptyParagraphs',99999);

2
grazie! So che wordpress inserisce automaticamente i tag p. Tuttavia, ci sono alcuni casi in cui ci sono solo tag <p> </p> vuoti da qualche parte nel mio contenuto (quando lo ispeziono con qualche strumento) ... ciò accade quando si fa molta rimozione e modifica dei post. Semplicemente non voglio avere paragrafi vuoti nei miei contenuti, tutto qui. Ho bisogno di paragrafi, ma non di quelli vuoti. Il 99999 non fa differenza. Semplicemente non funziona. il filtro wpautop non è quello che voglio. Previene tutti i <p> ​​e la formattazione automatica. Semplicemente non voglio nessuna p vuota!
mathiregister,

ho aggiornato il mio post così capisci cosa intendo! ho fatto una funzione che già filtra il contenuto. inserisce div e sembra che wordpress stia inserendo <p> </p> prima e dopo, semplicemente non capisco. qualche idea?
mathiregister,

21

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

Questo è il mio piccolo JS:

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

Questo funziona per me!


oh non è un numero così dolce! Grazie per il suggerimento: funziona per me e nel caso qualcuno si chiedesse come usarlo, basta inserirlo nel file JS personalizzato del tema.
Sol,

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

@D_N L'uso dei CSS per nascondere i tag di paragrafo vuoti funziona solo per <p></p>ma non funziona <p>\n</p>.
Michael Ecklund,

11

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. Inseriscilo nelle funzioni.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 è da questo punto di vista: https://gist.github.com/1668216


6
Solo una piccola nota sull'uso di force_balance_tags () ... Mi sono imbattuto in un bug insensato causato da questa funzione quando veniva utilizzato su contenuti che includevano JavaScript (JS proveniva da Gravity Forms quando si utilizza ajax su un modulo). Ci sono problemi noti con force_balance_tagsquando incontra il <personaggio in determinate situazioni. Vedi ticket [9270] ( core.trac.wordpress.org/ticket/9270 ) per i dettagli.
Dave Romsey,

Ho avuto lo stesso problema evidenziato da Dave: lo snippet ha rimosso il video di YouTube incorporato e ciò ha causato problemi di convalida anche sulle pagine di amplificazione.
Marco Panichi,

11

Usa semplicemente CSS

p:empty {
  display: none;
}

Per favore, aggiungi una spiegazione alla tua risposta
Pieter Goosen,

4
@PieterGoosen è già autoesplicativo
almeno tre caratteri dal

Se vuoi solo evitare di visualizzarli a fini di spaziatura, questo funziona fino a IE9. caniuse.com/#feat=css-sel3 e developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty per ulteriori informazioni.
Will

1
bella opzione con il metodo di selezione CSS, non sapevo che esistesse. Grazie!
i_a

1
Cordiali saluti: se &nbsp;all'interno del tag <p> non funziona.
RynoRn,

5

Potresti semplicemente eseguire il filtro prima che i cattivi wpautophook si aggancino e rovinino il markup.

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

In questo modo, hai già convertito quello che ti serve quando si aggancia, il che aiuta in alcuni casi.


3

Lo stesso approccio di 2 risposte prima di me, ma una regex aggiornata, perché il suo non ha funzionato per me.

il regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (gruppo non di acquisizione alla ricerca di un numero qualsiasi di spazi bianchi o di &nbsp;s all'interno di p-tag, 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);

0

Ho trovato questo strano, ma in realtà la chiamata the_content()inserirà i paragrafi nel modo che descrivi. Se vuoi il codice html, sostanzialmente come se lo avessi inserito (lo stesso di "visualizza HTML" durante la modifica), utilizza quindi il codice get_the_content()che restituisce il contenuto senza formattazione e tag di paragrafo.

Dal momento che lo restituisce, assicurati di utilizzare qualcosa come:

echo get_the_content ();

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


bene grazie. Comunque non lo voglio! Ho bisogno di paragrafi normali. Innanzitutto è un markup semantico e in secondo luogo è proprio come dovrebbe. Semplicemente non ho paragrafi vuoti che non hanno senso! Semplicemente perché ho applicato uno stile a quei paragrafi anche i paragrafi vuoti appaiono con questo stile e la mia pagina sembra strana.
mathiregister,

Mi chiedo perché il mio dispositivo add_filter non funziona?
Mathathegister,

Gotcha. Bene, una cosa che consiglierei di provare è passare dall'HTML al visual e viceversa una o due volte. Credo che quando viene caricato l'editor WYSIWYG rimuove i tag di paragrafo vuoti.
Cwd

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

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


0

Se hai <p>tag con spazi bianchi nel contenuto, vai al tuo post o pagina e modificalo non in stile visivo.

verrai trovato un po ' &nbsp;lì dentro .. Eliminalo e i <p>tag vuoti scompariranno.


0

Al fine di avere solo contenuti HTML senza

tag possiamo usare il seguente ciclo per mettere fuori solo l'html senza 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; ?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.