Rimuovere tutti gli stili inline da the_content()
Per uno dei miei progetti attuali, ho dovuto trasferire articoli del blog da un vecchio sito WordPress al mio progetto.
Tutto è andato liscio finché non ho notato che tutti i post erano stati copiati e incollati da Word, lasciando questo codice prima di quasi ogni paragrafo:
<span style="font-size: medium; font-family: georgia,palatino;">
E in alcuni punti cose come queste:
<p style="text-align: justify;">
<p style="text-align: justify;"><span style="font-size: medium; font-family: georgia,palatino;"><strong><span style="color: #000000;">
Quindi, poiché non ho 40 ore (e ancora meno la pazienza) per entrare in ogni post (ce ne sono circa 100) e rimuovere questi tag indesiderati, sto cercando un filtro che rimuova semplicemente tutti gli elementi style (tranne forse se contengono text-decoration:underline) prima di generare l'output di the_content()
Esiste qualcosa del genere?

Se vogliamo rimuovere tutti gli stili inline, basta semplicemente aggiungere il seguente codice nel file functions.php.
add_filter('the_content', function( $content ){
//--Rimuove tutti gli stili inline--
$content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
return $content;
}, 20);

IMO questa è la risposta corretta. Rimuove solo gli stili e nient'altro lasciando intatte le classi. Inoltre non interferisce con il database quindi non è distruttivo. Modifica solo l'output.

Aggiungi semplicemente questo al tuo functions.php.
Nota: Questo filtro agisce al momento del salvataggio/aggiornamento del post.
add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 ); function filter_post_data( $data , $postarr ) { $content = $data['post_content']; $content = preg_replace('#<p.*?>(.*?)</p>#i', '<p>\1</p>', $content); $content = preg_replace('#<span.*?>(.*?)</span>#i', '<span>\1</span>', $content); $content = preg_replace('#<ol.*?>(.*?)</ol>#i', '<ol>\1</ol>', $content); $content = preg_replace('#<ul.*?>(.*?)</ul>#i', '<ul>\1</ul>', $content); $content = preg_replace('#<li.*?>(.*?)</li>#i', '<li>\1</li>', $content); $data['post_content'] = $content; return $data; }
Nota: Questo filtro agisce quando viene eseguita la funzione the_content().
add_filter( 'the_content', 'the_content_filter', 20 ); function the_content_filter( $content ) { $content = preg_replace('#<p.*?>(.*?)</p>#i', '<p>\1</p>', $content); $content = preg_replace('#<span.*?>(.*?)</span>#i', '<span>\1</span>', $content); $content = preg_replace('#<ol.*?>(.*?)</ol>#i', '<ol>\1</ol>', $content); $content = preg_replace('#<ul.*?>(.*?)</ul>#i', '<ul>\1</ul>', $content); $content = preg_replace('#<li.*?>(.*?)</li>#i', '<li>\1</li>', $content); return $content; }

Nota: questa funzione è eccessiva per questa domanda — rimuove tutti gli stili, sì, ma anche tutte le classi, i tipi e qualsiasi altra cosa all'interno del tag <p>
, lasciando solo un semplice <p>
. La soluzione di Reza è quella corretta per l'OP.

Nota che la prima parte di questo codice modifica il contenuto nel database e quindi è pericolosa. Se commetti un errore, il tuo contenuto viene modificato permanentemente. Supponiamo che in seguito scopri di aver bisogno di qualche informazione sulla class
. Peccato, ora è tutto cancellato. Il secondo approccio è migliore perché non è distruttivo. Se sbagli, puoi riscrivere il filtro e modificare l'output senza distruggere il materiale sorgente.

Direi che nel modo in cui programmo i miei siti, cerco di fare in modo che non sia necessario lavorare con le classi aggiunte in the_content() affinché le pagine funzionino.
Penso che lavorare in questo modo renda il cliente incapace di modificare il sito dopo che è stato consegnato.

Anche se alcuni potrebbero dire che sia esagerato, in alcuni casi si desidera rimuovere tutti gli attributi dei tag, lasciando solo il tag stesso. Esempio: esportare tutti i post in un file HTML 'pulito' che verrà importato in Word - come nel creare un ebook da post su un sito. Quindi la tecnica qui presentata è utile; basta modificare le istruzioni per 'ripulire' i tag che si desidera pulire. È anche utile per post creati con copia/incolla da documenti Word; rimuoverà i tag di formattazione di Word in modo che il tema possa stilizzare il contenuto. Quindi, l'affermazione di 'pericoloso' potrebbe in realtà essere il risultato desiderato.

Ho provato il metodo sopra descritto con il salvataggio/aggiornamento ma non ha funzionato per me, quindi ho adottato un approccio diverso. Ho esportato l'intera tabella wp_posts, l'ho aperta in Sublime e ho effettuato una sostituzione tramite regex. Ho usato style="*.*?"
per trovare tutti i casi e li ho sostituiti con una stringa vuota. Poi ho eliminato il contenuto della vecchia tabella e importato quella nuova.
Se qualcuno prova questo metodo - assicuratevi di avere un backup pulito nel caso ci siano altri tipi di post nella tabella wp_posts e le cose diventino un po' confuse.

"Questa risposta è stata automaticamente segnalata come di bassa qualità a causa della sua lunghezza e contenuto", cosa che sono sicuro non vuoi. @vancoder, il tuo suggerimento è uno dei pochi plausibili ma senza una descrizione più dettagliata e possibilmente un esempio di codice non è una risposta molto utile se non per un programmatore già esperto, una qualifica che non possiamo dare per scontata. E un programmatore avrebbe probabilmente già pensato a questa soluzione. Puoi per favore aggiungere qualche dettaglio?

Darei un'occhiata a questo (così come alla domanda su SO linkata dall'articolo) riguardo all'uso delle regex per il parsing di (X)HTML.
