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

22 мар. 2013 г., 16:43:39
Просмотры: 29.7K
Голосов: 7

Для одного из моих текущих проектов мне нужно было перенести записи блога со старого сайта 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) и удалить эти нежелательные теги, я ищу фильтр, который просто удалит все элементы style (возможно, за исключением тех, что содержат text-decoration:underline) перед выводом the_content()

Существует ли что-то подобное?

2
Комментарии

Разве нельзя переопределить стили в CSS-файлах с помощью !important?

Shanavas M Shanavas M
24 нояб. 2015 г. 15:51:41

Это возможно, но не оптимально. Требуется знать каждый стиль, который нужно переопределить, и это может нарушить приоритеты CSS. !important — это крайняя мера, когда все другие способы не сработали.

Slam Slam
17 янв. 2018 г. 01:42:44
Все ответы на вопрос 4
2
18

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

add_filter('the_content', function( $content ){
    //--Удаляем все встроенные стили--
    $content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
    return $content;
}, 20);
13 мар. 2017 г. 16:45:52
Комментарии

IMO это правильный ответ. Он удаляет только стили и ничего больше, оставляя классы нетронутыми. Также он не затрагивает базу данных, поэтому не является разрушительным. Он только изменяет вывод.

Slam Slam
17 янв. 2018 г. 01:00:47

Если стиль использует одинарные кавычки внутри атрибута style, это может сломать код. Пример: style="font-family:'comic sans ms'"

Gfra54 Gfra54
6 февр. 2023 г. 17:35:52
4

Просто добавьте это в ваш файл functions.php.

Примечание: Этот фильтр работает в момент сохранения/обновления записи.


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

Примечание: Этот фильтр работает в момент выполнения функции 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 мар. 2013 г. 21:54:52
Комментарии

Примечание: эта функция избыточна для данного вопроса — она удаляет все стили, да. Но также удаляет все классы, типы и всё остальное внутри тега <p>, оставляя только простой <p>. Решение Reza является правильным для данного вопроса.

Slam Slam
17 янв. 2018 г. 00:59:35

Обратите внимание, что первая часть этого кода изменяет содержимое в базе данных, что может быть опасно. Если вы допустите ошибку, то ваше содержимое будет изменено навсегда. Допустим, позже вы обнаружите, что вам нужна информация о class. Увы, теперь она полностью удалена. Второй подход лучше, так как он не разрушает исходные данные. Если что-то пойдет не так, вы можете переписать фильтр и изменить вывод, не уничтожая исходный материал.

Slam Slam
17 янв. 2018 г. 01:46:38

Хочу сказать, что в моем подходе к программированию сайтов я стараюсь сделать так, чтобы вам не приходилось работать с классами, добавленными в the_content() для корректной работы страниц.

Я считаю, что работа таким образом делает клиента неспособным изменять сайт после его передачи.

Fredy31 Fredy31
17 янв. 2018 г. 17:09:03

Хотя некоторые могут сказать, что это излишне, в некоторых случаях требуется удалить все атрибуты тегов, оставив только сам тег. Например: экспорт всех записей в 'чистый' HTML-файл, который будет импортирован в Word — как при создании электронной книги из постов на сайте. Поэтому описанная здесь техника полезна; просто измените выражения для 'очистки' нужных тегов. Это также полезно для постов, созданных путем копирования/вставки из документа Word; это удалит теги форматирования Word, чтобы тема могла стилизовать контент. Таким образом, утверждение об 'опасности' может на самом деле быть желаемым результатом.

Rick Hellewell Rick Hellewell
14 сент. 2018 г. 22:56:06
1

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

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

26 сент. 2014 г. 12:37:11
Комментарии

+1 за упоминание важности резервного копирования базы данных. Также отмечу, что если ваша база данных очень большая, возможно, стоит запустить процесс на ночь/выходные, так как это может занять значительное время...

Ian Ian
26 авг. 2021 г. 21:20:28
2

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

22 мар. 2013 г. 19:25:14
Комментарии

"Этот ответ был автоматически помечен как низкокачественный из-за его длины и содержания", что, я уверен, вам не хотелось бы. @vancoder, ваше предложение является одним из нескольких возможных ответов, но без более подробного описания и, возможно, примеров кода это не очень полезный ответ, за исключением уже опытного программиста, а мы не можем предполагать, что все читатели таковыми являются. И программист, скорее всего, уже догадался бы об этом. Не могли бы вы добавить больше деталей?

s_ha_dum s_ha_dum
22 мар. 2013 г. 19:54:25

Я бы рекомендовал прочитать эту статью (а также вопрос на SO, на который ссылается статья) касательно использования регулярных выражений для разбора (X)HTML.

montrealist montrealist
22 мар. 2013 г. 20:38:39