Rimuovere tutti gli stili inline da the_content()

22 mar 2013, 16:43:39
Visualizzazioni: 29.7K
Voti: 7

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?

2
Commenti

Non puoi sovrascrivere gli stili nei file CSS usando !important?

Shanavas M Shanavas M
24 nov 2015 15:51:41

Potrebbe essere possibile ma non è ottimale. Richiede di conoscere ogni stile che deve essere sovrascritto e può creare problemi con le priorità CSS. !important è un'ultima risorsa quando tutto il resto ha fallito.

Slam Slam
17 gen 2018 01:42:44
Tutte le risposte alla domanda 4
2
18

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);
13 mar 2017 16:45:52
Commenti

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.

Slam Slam
17 gen 2018 01:00:47

Se lo stile utilizza apici singoli all'interno dell'attributo style si romperà. Esempio: style="font-family:'comic sans ms'"

Gfra54 Gfra54
6 feb 2023 17:35:52
4

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;
}
24 mar 2013 21:54:52
Commenti

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.

Slam Slam
17 gen 2018 00:59:35

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.

Slam Slam
17 gen 2018 01:46:38

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.

Fredy31 Fredy31
17 gen 2018 17:09:03

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.

Rick Hellewell Rick Hellewell
14 set 2018 22:56:06
1

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.

26 set 2014 12:37:11
Commenti

+1 per aver menzionato l'importanza del backup del database. Aggiungo anche che se il tuo database è molto grande, potresti voler eseguire l'operazione durante la notte o nel weekend perché potrebbe richiedere un po' di tempo...

Ian Ian
26 ago 2021 21:20:28
2

Darei un'occhiata al filtro content_save_pre e probabilmente applicherei qualche espressione regolare avanzata in quel punto.

22 mar 2013 19:25:14
Commenti

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

s_ha_dum s_ha_dum
22 mar 2013 19:54:25

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.

montrealist montrealist
22 mar 2013 20:38:39