Удаление всех встроенных стилей из содержимого ()
Для одного из моих текущих проектов мне пришлось перенести посты в блоге со старого сайта Wordpress на мой проект.
Все шло гладко, пока я не увидел, что все сообщения были скопированы из Word, оставив это почти перед каждым абзацем:
<span style="font-size: medium; font-family: georgia,palatino;">
И в некоторых местах такие вещи, как:
<p style="text-align: justify;">
<p style="text-align: justify;"><span style="font-size: medium; font-family: georgia,palatino;"><strong><span style="color: #000000;">
Итак, поскольку у меня нет 40 часов (еще меньше терпения), чтобы просто зайти в каждый пост (их около 100) и удалить эти нежелательные теги, я ищу фильтр, который просто удалил бы все элементы стиля (за исключением, может быть, если он содержит элементы оформления текста: подчеркивание) перед выводом the_content()
Существует ли такая вещь?
4 answers
Если мы хотим удалить все встроенные стили, то просто нужно добавить следующий код в functions.php .
add_filter('the_content', function( $content ){
//--Remove all inline styles--
$content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
return $content;
}, 20);
Просто добавьте это в свой functions.php .
Note: This filter works at the time of saving/updating the 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; }
Note: This filter works at the time when function the_content() is executed.
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; }
Я попробовал описанный выше метод с сохранением/обновлением, но у меня не получилось, поэтому я перешел к другому подходу. Я экспортировал всю таблицу wp_posts, открыл ее в Sublime и выполнил замену регулярного выражения. Я использовал style="*.*?"
, чтобы найти все случаи, и заменил их пустотой. Затем удалил содержимое старой таблицы и импортировал новую.
Если кто-нибудь попробует этот метод - пожалуйста, убедитесь, что у вас есть четкая резервная копия на случай, если в таблице wp_post есть какие-то другие типы сообщений, и все немного изменилось беспорядочный.
Я бы проверил фильтр content_save_pre и, возможно, применил бы какое-нибудь необычное регулярное выражение в этот момент.