Eliminar todos los estilos en línea de the_content()

22 mar 2013, 16:43:39
Vistas: 29.7K
Votos: 7

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

2
Comentarios

¿No puedes sobrescribir estilos en archivos CSS usando !important?

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

Puede ser posible pero no es lo óptimo. Requiere conocer cada estilo que necesita ser sobrescrito y puede causar estragos con las prioridades de CSS. !important es un último recurso cuando todo lo demás ha fallado.

Slam Slam
17 ene 2018 01:42:44
Todas las respuestas a la pregunta 4
2
18

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

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.

Slam Slam
17 ene 2018 01:00:47

Si el estilo utiliza comillas simples dentro del atributo style, se romperá. Ejemplo: style="font-family:'comic sans ms'"

Gfra54 Gfra54
6 feb 2023 17:35:52
4

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

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.

Slam Slam
17 ene 2018 00:59:35

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.

Slam Slam
17 ene 2018 01:46:38

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.

Fredy31 Fredy31
17 ene 2018 17:09:03

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.

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

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.

26 sept 2014 12:37:11
Comentarios

+1 por mencionar la importancia de hacer una copia de seguridad de la base de datos. También quiero señalar que si tu base de datos es muy grande, quizás quieras ejecutar el respaldo durante la noche o el fin de semana porque podría tomar bastante tiempo...

Ian Ian
26 ago 2021 21:20:28
2

Yo revisaría el filtro content_save_pre y probablemente aplicaría alguna expresión regular sofisticada en ese punto.

22 mar 2013 19:25:14
Comentarios

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

s_ha_dum s_ha_dum
22 mar 2013 19:54:25

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.

montrealist montrealist
22 mar 2013 20:38:39