Eliminarea stilurilor inline din the_content()

22 mar. 2013, 16:43:39
Vizualizări: 29.7K
Voturi: 7

Pentru unul dintre proiectele mele curente, a trebuit să transfer articole de blog de pe un site vechi WordPress în proiectul meu.

Lucrurile au mers bine până când am observat că toate articolele au fost copiate și lipite din Word, lăsând aceasta înaintea aproape fiecărui paragraf:

<span style="font-size: medium; font-family: georgia,palatino;">

Și în unele locuri lucruri precum acestea:

<p style="text-align: justify;">
<p style="text-align: justify;"><span style="font-size: medium; font-family: georgia,palatino;"><strong><span style="color: #000000;">

Așa că, pentru că nu am cele 40 de ore (și cu atât mai puțin răbdarea) să intru în fiecare articol (sunt aproximativ 100) și să elimin acele tag-uri nedorite, caut un filtru care să elimine toate elementele style (poate cu excepția celor care conțin text-decoration:underline) înainte de a afișa the_content()

Există așa ceva?

2
Comentarii

Nu poți suprascrie stilurile în fișierele CSS folosind !important?

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

Este posibil, dar nu este optim. Necesită cunoașterea fiecărui stil care trebuie suprascris și poate crea probleme cu prioritățile CSS. !important este o ultimă soluție atunci când toate celelalte opțiuni au eșuat.

Slam Slam
17 ian. 2018 01:42:44
Toate răspunsurile la întrebare 4
2
18

Dacă dorim să eliminăm toate stilurile inline, atunci trebuie doar să adăugăm următorul cod în functions.php.

add_filter('the_content', function( $content ){
    //--Elimină toate stilurile inline--
    $content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
    return $content;
}, 20);
13 mar. 2017 16:45:52
Comentarii

IMO acesta este răspunsul corect. Elimină doar stilurile și nimic altceva, lăsând clasele intacte. De asemenea, nu interferează cu baza de date, deci nu este distructiv. Doar modifică output-ul.

Slam Slam
17 ian. 2018 01:00:47

Dacă stilul folosește ghilimele simple în interiorul atributului style, va cauza probleme. Exemplu: style="font-family:'comic sans ms'"

Gfra54 Gfra54
6 feb. 2023 17:35:52
4

Doar adaugă acest cod în fișierul functions.php.

Notă: Acest filtru funcționează în momentul salvării/actualizării postării.

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

Notă: Acest filtru funcționează în momentul în care funcția the_content() este executată.

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
Comentarii

Notă: această funcție este excesivă pentru această întrebare — elimină toate stilurile, da. dar și toate clasele, tipurile și orice altceva din interiorul tag-ului <p>, lăsând doar un simplu <p>. Soluția lui Reza este cea corectă pentru OP.

Slam Slam
17 ian. 2018 00:59:35

Rețineți că prima parte a acestui lucru modifică conținutul din baza de date și, ca atare, este periculoasă. Dacă faci o greșeală, atunci conținutul tău este modificat permanent. Să presupunem că mai târziu descoperi că ai nevoie de informații despre class. Păcat, acum au fost șterse. A doua abordare este mai bună pentru că este nedistructivă. Dacă este greșită, poți rescrie filtrul și modifica output-ul fără a distruge materialul sursă.

Slam Slam
17 ian. 2018 01:46:38

Aș spune că în modul în care programez site-urile mele, încerc să fac astfel încât să nu fie nevoie să lucrezi cu clase adăugate în the_content() pentru ca paginile să funcționeze.

Cred că lucrul în acest fel face ca clientul să nu poată modifica site-ul după ce a fost livrat.

Fredy31 Fredy31
17 ian. 2018 17:09:03

Deși unii ar spune că este exagerat, în unele cazuri poți dori să elimini toate atributele tag-urilor, lăsând doar tag-ul în sine. Exemplu: exportarea tuturor articolelor într-un fișier HTML 'simplu' care va fi importat în Word - ca atunci când creezi un ebook din articolele de pe un site. Deci, această tehnică este utilă; doar modifică instrucțiunile pentru a 'curăța' tag-urile pe care dorești să le cureți. Este utilă și pentru articolele create prin copiere/inserare din documente Word; va elimina tag-urile de formatare Word, astfel încât tema să poată formata conținutul. Așadar, afirmația că este 'periculos' poate fi de fapt rezultatul dorit.

Rick Hellewell Rick Hellewell
14 sept. 2018 22:56:06
1

Am încercat metoda de mai sus cu salvarea/actualizarea, dar nu a funcționat pentru mine, așa că am abordat altă soluție. Am exportat întreaga tabelă wp_posts, am deschis-o în Sublime și am făcut o înlocuire folosind expresii regulate. Am folosit style="*.*?" pentru a găsi toate cazurile și le-am înlocuit cu nimic. Apoi am șters conținutul vechi al tabelei și am importat noul conținut.

Dacă cineva încearcă această metodă - vă rog să vă asigurați că aveți o copie de rezervă clară, în cazul în care există alte tipuri de postări în tabela wp_posts și lucrurile devin puțin complicate.

26 sept. 2014 12:37:11
Comentarii

+1 pentru menționarea importanței backup-ului bazei de date. De asemenea, voi menționa că dacă baza ta de date este foarte mare, poate fi indicat să rulezi procesul peste noapte/în weekend deoarece ar putea dura ceva timp...

Ian Ian
26 aug. 2021 21:20:28
2

Aș verifica filtrul content_save_pre și probabil aș aplica o expresie regulată complexă în acel moment.

22 mar. 2013 19:25:14
Comentarii

"Acest răspuns a fost marcat automat ca fiind de calitate scăzută din cauza lungimii și conținutului său", lucru despre care sunt sigur că nu doriți. @vancoder, sugestia ta este una dintre câteva răspunsuri plauzibile, dar fără mai multe detalii și eventual un exemplu de cod, nu este un răspuns foarte util decât pentru un programator deja experimentat, o calificare pe care nu o putem presupune. Și un programator ar fi probabil gândit deja la asta. Poți să adaugi câteva detalii, te rog?

s_ha_dum s_ha_dum
22 mar. 2013 19:54:25

Aș recomanda citirea acestui material (precum și a întrebării de pe SO legată din articol) în legătură cu utilizarea expresiilor regulate pentru analiza (X)HTML.

montrealist montrealist
22 mar. 2013 20:38:39