Вопрос или проблема
Я использую wp_insert_post
. Я обрабатываю текстовый файл построчно и для каждой строки создаю запись. Текст устанавливается как `post_title`, для текста, который не является utf8, запись вставляется, но с пустым заголовком.
Почему это происходит, если я могу создать запись в админке, используя не-utf8 символы, похоже, что WordPress преобразует кодировку в админке.
Как я могу обойти это с помощью wp_insert_post
и вставить заголовок записи с не-utf8 символами?
Спасибо
Это может быть связано с тем, что кодировка текста, которую вы используете, не установлена на UTF8, попробуйте использовать iconv() и установить.
iconv(‘ISO-8859-1′,’UTF-8’, $post_info[‘post_content’]);
Здесь помогают функции очистки данных WordPress, в частности sanitize_text_field()
. Попробуйте использовать эту функцию с вашим текстом перед/во время вставки. Это также должно быть безопасно для строк, которые сейчас работают.
wp_insert_post(array(
'post_title' => sanitize_text_field( $text_from_row )
));
Ответ или решение
Проблема, с которой вы столкнулись при использовании функции wp_insert_post
в WordPress, касается обработки заголовков постов, содержащих символы, не относящиеся к кодировке UTF-8. Ваша ситуация действительно указывает на то, что при вставке заголовков с не-UTF-8 символами WordPress не может корректно обработать их, что приводит к созданию поста с пустым заголовком.
Причины возникновения проблемы
-
Кодировка текста:
wp_insert_post
ожидает, что заголовок поста будет в кодировке UTF-8. Если ваш текст из файла хранится в другой кодировке, например, ISO-8859-1 или Windows-1251, WordPress не сможет правильно интерпретировать эти символы. Это и приводит к тому, что заголовок поста становится пустым. -
Санитаризация данных: WordPress применяет ряд функций для очистки и обработки входных данных, включая заголовки постов. Если переданный текст не соответствует ожидаемой кодировке, функция очистки может вернуть пустую строку, что также повлечет за собой создание поста без заголовка.
Решения проблемы
Чтобы обойти эту проблему, вам необходимо убедиться, что текст преобразован в UTF-8 до передачи его в wp_insert_post
. Вот несколько шагов, которые вы можете предпринять:
1. Преобразование кодировки
Используйте функцию iconv
для преобразования текста в UTF-8. Вот пример кода:
$text_from_row = iconv('ISO-8859-1', 'UTF-8//IGNORE', $text_from_row);
Эта строка будет преобразовывать текст из кодировки ISO-8859-1 в UTF-8, игнорируя символы, которые не могут быть преобразованы.
2. Использование функции санитаризации
После преобразования текста используйте функцию sanitize_text_field()
. Эта функция гарантирует, что строка будет безопасной для использования в WordPress:
$sanitized_title = sanitize_text_field($text_from_row);
3. Вставка поста
После того как вы подготавливали заголовок, вставьте пост с правильно обработанным заголовком:
$post_id = wp_insert_post(array(
'post_title' => $sanitized_title,
'post_content' => 'Ваш контент здесь',
'post_status' => 'publish', // или другой статус
));
Заключение
Вкратце, основная причина, по которой wp_insert_post
создает пост с пустым заголовком на основе текста с кодировкой, отличной от UTF-8, заключается в невозможности WordPress корректно обработать данные. Для решения этой проблемы рекомендуется сначала преобразовать текст в правильную кодировку, а затем использовать функцию для санитаризации, чтобы убедиться в корректности вставляемых данных. Это позволит избежать проблем с пустыми заголовками и улучшит обработку данных в вашей системе WordPress.