Как починить feed в wordpress когда в тексте есть «левые» символы?

Ссылка скопирована
1 ответ

This page contains the following errors:
error on line 1330 at column 37: Input is not proper UTF-8, indicate encoding !
Bytes: 0x07 0x2E 0x20 0x50
Below is a rendering of the page up to the first error.

В тексте встречаются следующие символы
из-за этого перестает работать Feed, есть решение без чистки текста? или может сниппет есть, который текст приведет в нормальный вид без левых символов?

Дополнительно:

Ответы:

utf8mb4 попробуйте

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Редакция Security Ответ

Ошибка Input is not proper UTF-8 в RSS означает, что в XML попал байт или управляющий символ, который не допускается в UTF-8/XML. Символ вроде типографской кавычки сам по себе нормальный, если база и страница действительно в UTF-8. В вашем примере подозрительнее байт 0x07 - это управляющий символ BEL, его в XML быть не должно.

Правильный путь:

  1. Проверить кодировку таблиц и колонок БД: желательно utf8mb4.
  2. Найти запись около строки RSS, где валится XML.
  3. Очистить контент от недопустимых XML-символов при выводе в feed.

Для WordPress можно добавить фильтр, который убирает запрещенные XML 1.0 символы из текста ленты:

function site_clean_feed_xml_chars($content) {
    if (!is_feed()) {
        return $content;
    }
 
    return preg_replace('/[^x{9}x{A}x{D}x{20}-x{D7FF}x{E000}-x{FFFD}]/u', '', $content);
}
 
add_filter('the_content_feed', 'site_clean_feed_xml_chars', 20);
add_filter('the_excerpt_rss', 'site_clean_feed_xml_chars', 20);
add_filter('the_title_rss', 'site_clean_feed_xml_chars', 20);

function site_clean_feed_xml_chars($content) { if (!is_feed()) { return $content; } return preg_replace('/[^x{9}x{A}x{D}x{20}-x{D7FF}x{E000}-x{FFFD}]/u', '', $content); } add_filter('the_content_feed', 'site_clean_feed_xml_chars', 20); add_filter('the_excerpt_rss', 'site_clean_feed_xml_chars', 20); add_filter('the_title_rss', 'site_clean_feed_xml_chars', 20);

Если preg_replace() возвращает пустоту из-за битой кодировки, сначала нормализуйте строку:

function site_force_valid_utf8($content) {
    if (!is_feed()) {
        return $content;
    }
 
    $content = wp_check_invalid_utf8($content, true);
    return preg_replace('/[^x{9}x{A}x{D}x{20}-x{D7FF}x{E000}-x{FFFD}]/u', '', $content);
}

function site_force_valid_utf8($content) { if (!is_feed()) { return $content; } $content = wp_check_invalid_utf8($content, true); return preg_replace('/[^x{9}x{A}x{D}x{20}-x{D7FF}x{E000}-x{FFFD}]/u', '', $content); }

Но это именно страховка на выводе. Если в БД реально лежит мусорная кодировка, лучше исправить источник: конвертировать таблицы в utf8mb4_unicode_ci, найти проблемные записи и удалить управляющие символы из контента.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно