Eliminarea stilurilor inline din the_content()
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?

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

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.

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

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.

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

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.

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.

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.

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

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.
