Eliminar todos los estilos en línea de the_content()
Para uno de mis proyectos actuales, tuve que transferir entradas de blog desde un sitio WordPress antiguo a mi proyecto.
Todo iba bien hasta que vi que todas las entradas fueron copiadas y pegadas desde Word, dejando esto antes de prácticamente cada párrafo:
<span style="font-size: medium; font-family: georgia,palatino;">
Y en algunos lugares cosas como estas:
<p style="text-align: justify;">
<p style="text-align: justify;"><span style="font-size: medium; font-family: georgia,palatino;"><strong><span style="color: #000000;">
Entonces, como no tengo las 40 horas (y menos aún la paciencia) para simplemente entrar en cada entrada (hay alrededor de 100) y eliminar esas etiquetas no deseadas, estoy buscando un filtro que simplemente elimine todos los elementos de estilo (excepto tal vez si contiene text-decoration:underline) antes de mostrar the_content()
¿Existe algo así?

Si queremos eliminar todos los estilos en línea, simplemente necesitamos agregar el siguiente código en functions.php.
add_filter('the_content', function( $content ){
//--Eliminar todos los estilos en línea--
$content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
return $content;
}, 20);

En mi opinión, esta es la respuesta correcta. Elimina solo los estilos y nada más, dejando las clases intactas. Tampoco afecta a la base de datos, por lo que no es destructivo. Solo modifica la salida.

Solo añade esto a tu functions.php.
Nota: Este filtro funciona al momento de guardar/actualizar la entrada.
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: Este filtro funciona al momento de ejecutar la función 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: esta función es excesiva para esta pregunta — sí, elimina todos los estilos, pero también todas las clases, tipos y todo lo demás dentro de la etiqueta <p>
, dejando solo un <p>
básico. La solución de Reza es la correcta para el OP.

Ten en cuenta que la primera parte de esto altera el contenido en la base de datos y, como tal, es peligroso. Si cometes un error, tu contenido se alterará permanentemente. Imagina que más adelante descubres que necesitas información de alguna class
. Demasiado tarde, todo ha sido borrado. El segundo enfoque es mejor porque no es destructivo. Si te equivocas, puedes reescribir el filtro y modificar la salida sin destruir el material fuente.

Diría que, en la forma en que programo mis sitios, intento hacer que no sea necesario trabajar con clases añadidas en the_content() para que las páginas funcionen.
Creo que trabajar de esa manera hace que el cliente no pueda modificar el sitio después de que se haya entregado.

Aunque algunos podrían decir que esto es excesivo, en algunos casos quieres eliminar todos los atributos de las etiquetas, dejando solo la etiqueta. Ejemplo: exportar todas las publicaciones a un archivo HTML 'simple' que se importará a Word - como al crear un libro electrónico a partir de publicaciones en un sitio. Entonces, la técnica aquí es útil; solo modifica las declaraciones para 'limpiar' las etiquetas que deseas limpiar. También es útil para publicaciones creadas con copiar/pegar desde un documento de Word; eliminará las etiquetas de formato de Word para que el tema pueda dar estilo al contenido. Por lo tanto, la afirmación de 'peligroso' podría ser en realidad el resultado deseado.

Probé el método mencionado anteriormente con el guardado/actualización pero no funcionó para mí, así que opté por otro enfoque. Exporté toda la tabla wp_posts, la abrí en Sublime e hice un reemplazo con expresiones regulares. Utilicé style="*.*?"
para encontrar todos los casos y los reemplacé con vacío. Luego eliminé el contenido de la tabla antigua e importé el nuevo.
Si alguien prueba este método, por favor asegúrese de tener una copia de seguridad clara en caso de que haya otros tipos de publicaciones en la tabla wp_posts y las cosas se compliquen un poco.

"Esta respuesta fue marcada automáticamente como de baja calidad debido a su longitud y contenido", lo cual estoy seguro que no deseas. @vancoder, tu sugerencia es una de un par de respuestas plausibles pero sin más descripción y posiblemente algún código de ejemplo no es una respuesta muy útil excepto para un programador ya conocedor, una calificación que no podemos asumir. Y un programador probablemente ya habría pensado en esto. ¿Podrías por favor agregar más detalles?

Te recomendaría leer esto (así como la pregunta de SO enlazada desde el artículo) con respecto al uso de expresiones regulares para el análisis de (X)HTML.
