Удаление всех встроенных стилей из содержимого ()


Для одного из моих текущих проектов мне пришлось перенести посты в блоге со старого сайта 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()

Существует ли такая вещь?

Author: Fredy31, 2013-03-22

4 answers

Если мы хотим удалить все встроенные стили, то просто нужно добавить следующий код в functions.php .

add_filter('the_content', function( $content ){
    //--Remove all inline styles--
    $content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
    return $content;
}, 20);
 15
Author: Reza Mamun, 2017-03-13 14:45:52

Просто добавьте это в свой 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;
}
 5
Author: golchha21, 2013-03-24 19:54:52

Я попробовал описанный выше метод с сохранением/обновлением, но у меня не получилось, поэтому я перешел к другому подходу. Я экспортировал всю таблицу wp_posts, открыл ее в Sublime и выполнил замену регулярного выражения. Я использовал style="*.*?", чтобы найти все случаи, и заменил их пустотой. Затем удалил содержимое старой таблицы и импортировал новую.

Если кто-нибудь попробует этот метод - пожалуйста, убедитесь, что у вас есть четкая резервная копия на случай, если в таблице wp_post есть какие-то другие типы сообщений, и все немного изменилось беспорядочный.

 3
Author: alordiel, 2014-09-26 09:37:11

Я бы проверил фильтр content_save_pre и, возможно, применил бы какое-нибудь необычное регулярное выражение в этот момент.

 0
Author: vancoder, 2013-03-22 17:25:14