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

Если мы хотим удалить все встроенные стили, то достаточно просто добавить следующий код в functions.php.
add_filter('the_content', function( $content ){
//--Удаляем все встроенные стили--
$content = preg_replace('/ style=("|\')(.*?)("|\')/','',$content);
return $content;
}, 20);

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

Просто добавьте это в ваш файл 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;
}

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

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

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

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

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

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

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