Почему может неправильно сохраняться запись в wordpress?
нужно было получить новости ( категория it - gnews, на русском языке).
Вообщем была написана такая функция:
function addNews() { if (!function_exists('wp_insert_post')) { return; } $apiKey = "**"; $url = "https://gnews.io/api/v4/top-headlines?token=$apiKey&topic=technology&country=ru"; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } $data = json_decode($response, true); $article = $data["articles"][1]; $post = array( 'post_title' => $article['title'], 'post_content' => $article['content'], 'post_status' => 'publish', 'post_date' => date('Y-m-d H:i:s'), 'post_type' => 'post', 'post_author' => 1 ); // Добавляем описание $additional_text = sprintf('<p class="news__it__desc" >%s</p>', $article['description']); // Дополнительный текст //функция добавления описания в начало содержимого function add_text_to_content($content,$newtext) { $additional_text = $newtext; $new_content = $additional_text . $content; return $new_content; } $post['post_content']= add_text_to_content($post['post_content'], $additional_text); // $post['post_content'] .= $additional_text; // Добавляем дополнительный текст в конец содержимого записи // Добавляем ссылку $link_url = $article['url']; // URL ссылки $link_text = 'Подробнее'; // Текст ссылки $link_html = sprintf('<a href="%s" class="news__it__more" target="_blank">%s</a>', $link_url, $link_text); // Форматирование ссылки в HTML $post['post_content'] .= $link_html; // Добавляем ссылку в конец содержимого записи // Вставляем пост в базу данных $post_id = wp_insert_post($post); // присваиваем рубрику к посту wp_set_object_terms($post_id, 'newsIT', 'category'); // Проверяем ошибки при вставке поста if (is_wp_error($post_id)) { $error_message = $post_id->get_error_message(); echo "Ошибка сохранения поста: $error_message"; } // Вставляем картинку и получаем ее URL $image_url = $article['image']; // URL изображения // Получаем расширение файла $ext = pathinfo($image_url, PATHINFO_EXTENSION); // Создаем временный файл $temp_file = tmpfile(); // Получаем дескриптор файла $temp_file_meta = stream_get_meta_data($temp_file); $temp_filename = $temp_file_meta['uri']; // Скачиваем картинку и сохраняем ее во временный файл $ch = curl_init($image_url); $fp = fopen($temp_filename, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp); // Получаем данные поста, в который нужно добавить картинку $newpost = get_post($post_id); // Создаем новое вложение в WordPress $attachment_id = media_handle_sideload(array( 'name' => basename($image_url), 'type' => 'image/' . $ext, 'tmp_name' => $temp_filename, ), $post_id); // Проверяем успешность загрузки вложения if (is_wp_error($attachment_id)) { echo 'Ошибка загрузки файла: ' . $attachment_id->get_error_message(); } else { // Добавляем вложение к посту update_post_meta($post_id, '_thumbnail_id', $attachment_id); } } // проверяем кэш if (!get_transient('my_function_cache')) { addNews(); // устанавливаем кэш на 1 день set_transient('my_function_cache', true, 60 * 60 * 24); } |
function addNews() { if (!function_exists('wp_insert_post')) { return; } $apiKey = "**"; $url = "https://gnews.io/api/v4/top-headlines?token=$apiKey&topic=technology&country=ru"; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } $data = json_decode($response, true); $article = $data["articles"][1]; $post = array( 'post_title' => $article['title'], 'post_content' => $article['content'], 'post_status' => 'publish', 'post_date' => date('Y-m-d H:i:s'), 'post_type' => 'post', 'post_author' => 1 ); // Добавляем описание $additional_text = sprintf('<p class="news__it__desc" >%s</p>', $article['description']); // Дополнительный текст //функция добавления описания в начало содержимого function add_text_to_content($content,$newtext) { $additional_text = $newtext; $new_content = $additional_text . $content; return $new_content; } $post['post_content']= add_text_to_content($post['post_content'], $additional_text); // $post['post_content'] .= $additional_text; // Добавляем дополнительный текст в конец содержимого записи // Добавляем ссылку $link_url = $article['url']; // URL ссылки $link_text = 'Подробнее'; // Текст ссылки $link_html = sprintf('<a href="%s" class="news__it__more" target="_blank">%s</a>', $link_url, $link_text); // Форматирование ссылки в HTML $post['post_content'] .= $link_html; // Добавляем ссылку в конец содержимого записи // Вставляем пост в базу данных $post_id = wp_insert_post($post); // присваиваем рубрику к посту wp_set_object_terms($post_id, 'newsIT', 'category'); // Проверяем ошибки при вставке поста if (is_wp_error($post_id)) { $error_message = $post_id->get_error_message(); echo "Ошибка сохранения поста: $error_message"; } // Вставляем картинку и получаем ее URL $image_url = $article['image']; // URL изображения // Получаем расширение файла $ext = pathinfo($image_url, PATHINFO_EXTENSION); // Создаем временный файл $temp_file = tmpfile(); // Получаем дескриптор файла $temp_file_meta = stream_get_meta_data($temp_file); $temp_filename = $temp_file_meta['uri']; // Скачиваем картинку и сохраняем ее во временный файл $ch = curl_init($image_url); $fp = fopen($temp_filename, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp); // Получаем данные поста, в который нужно добавить картинку $newpost = get_post($post_id); // Создаем новое вложение в WordPress $attachment_id = media_handle_sideload(array( 'name' => basename($image_url), 'type' => 'image/' . $ext, 'tmp_name' => $temp_filename, ), $post_id); // Проверяем успешность загрузки вложения if (is_wp_error($attachment_id)) { echo 'Ошибка загрузки файла: ' . $attachment_id->get_error_message(); } else { // Добавляем вложение к посту update_post_meta($post_id, '_thumbnail_id', $attachment_id); } } // проверяем кэш if (!get_transient('my_function_cache')) { addNews(); // устанавливаем кэш на 1 день set_transient('my_function_cache', true, 60 * 60 * 24); }
Итак, все вроде бы работает, но есть ряд проблем:
1. сначала пытался добавить в отдельно созданный тип записи, все добавлялось, но сами записи не открывались. Поэтому было принято решение сделать сохранение в обычные записи но со своей категорией.
Что в итоге получилось. Запись добавляется, все в итоге сохраняется, но через несколько секунд после того как захожу в добавленную запись, выскакивает критическая ошибка. - Правда эта ошибка только на локальном сервере. - на хостинге все ок....
текст ошибки следующий:
TypeError: Cannot read properties of undefined (reading 'includes')
TypeError: Cannot read properties of undefined (reading 'includes')
at https://......../wp-includes/js/dist/editor.min.js...
at Array.some ()
at https://......./wp-includes/js/dist/editor.min.js?...
at kt (https://...../wp-includes/js/dist/vendor/react-dom...)
...
2. Там где вставляю фото, вставляется знак больше и кавычка.....
сам код страницы следующий:
<div class="news__inner__posts"> <?php $args = array( 'posts_per_page' => -1, 'cat' => 12 ); $the_query = new WP_Query($args); ?> <?php if ($the_query->have_posts()) : $count = 0; ?> <?php while ($the_query->have_posts()) : $the_query->the_post(); $count++; ?> <?php $post_id = get_the_ID(); ?> <div class="news__inner__posts__item"> <div class="news__inner__posts__item__top newsit__inner__posts__item__top"> <div class='news__inner__posts__item__top__background'> <img class="news__inner__posts__item__top__background__img" src="<?php the_post_thumbnail() ?>"> <div class="news__inner__posts__item__top__background__buttons"> </div> </div> </div> <div class="news__inner__posts__item__bottom"> <time class="news__inner__posts__item__bottom__time" datetime="<?php the_date(); ?>"><?php echo get_the_date(); ?></time> <h3 class="news__inner__posts__item__bottom__title"><?php the_title() ?></h3> <div class="news__inner__posts__item__bottom__text" id="news-container"><?php the_excerpt(); ?> </div> <button type="button" class="news__inner__posts__item__bottom__view" data-id="<?php echo $post_id ?>">Подробнее</button> </div> </div> <div class=" popuptel news__popup fix__block" id="<?php echo $post_id ?>"> <div class="container container__center"> <div class="popuptel__body news__popup__body"> <div class="popuptel__form news__popup__form"> <div class="formtel__cancel"> <img class="formtel__cancel__close" src="<?php bloginfo('template_url'); ?>/assets/images/popup/cross.svg" alt="cancel"> </div> <div class="news__popup__body__bottom"> <h2 class="news__popup__body__title"><?php the_title() ?></h2> <div class="newsit__box"> <img alt="newsIt" src="<?php the_post_thumbnail() ?>"> <div class="newsit__popup__body__content"><?php the_content() ?></div> </div> </div> </div> </div> </div> </div> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php endif; ?> </div> |
<div class="news__inner__posts"> <?php $args = array( 'posts_per_page' => -1, 'cat' => 12 ); $the_query = new WP_Query($args); ?> <?php if ($the_query->have_posts()) : $count = 0; ?> <?php while ($the_query->have_posts()) : $the_query->the_post(); $count++; ?> <?php $post_id = get_the_ID(); ?> <div class="news__inner__posts__item"> <div class="news__inner__posts__item__top newsit__inner__posts__item__top"> <div class='news__inner__posts__item__top__background'> <img class="news__inner__posts__item__top__background__img" src="<?php the_post_thumbnail() ?>"> <div class="news__inner__posts__item__top__background__buttons"> </div> </div> </div> <div class="news__inner__posts__item__bottom"> <time class="news__inner__posts__item__bottom__time" datetime="<?php the_date(); ?>"><?php echo get_the_date(); ?></time> <h3 class="news__inner__posts__item__bottom__title"><?php the_title() ?></h3> <div class="news__inner__posts__item__bottom__text" id="news-container"><?php the_excerpt(); ?> </div> <button type="button" class="news__inner__posts__item__bottom__view" data-id="<?php echo $post_id ?>">Подробнее</button> </div> </div> <div class=" popuptel news__popup fix__block" id="<?php echo $post_id ?>"> <div class="container container__center"> <div class="popuptel__body news__popup__body"> <div class="popuptel__form news__popup__form"> <div class="formtel__cancel"> <img class="formtel__cancel__close" src="<?php bloginfo('template_url'); ?>/assets/images/popup/cross.svg" alt="cancel"> </div> <div class="news__popup__body__bottom"> <h2 class="news__popup__body__title"><?php the_title() ?></h2> <div class="newsit__box"> <img alt="newsIt" src="<?php the_post_thumbnail() ?>"> <div class="newsit__popup__body__content"><?php the_content() ?></div> </div> </div> </div> </div> </div> </div> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php endif; ?> </div>
вкратце что происходит в этом коде. Новость вставляется сначала в предварительное окно, затем при нажатии на кнопку открывается модалка и там уже весь текст вставляется..
Проблема максимально простая, но решения пока не нашел.. после изображения как текст вставляются следующие символы "> -просто между картинкой и следующим дивом.
Скрыть, так сказать сделать костыль - не проблема, но хочется понять что не так .... причем если убираю вызов the_post_thumbnail() - то и эти символы пропадают... если ставлю в конец тега img - alt с описанием, то выводится и он.... поэтому собственно пока его в начало и переставил.
3. Все вроде бы неплохо, вот только описание новости дается очень маленькое, и становится очевидный вопрос - как получить полностью текст новости целиком...
Дополнительно:
прячьте длинные портянки кода под спойлер.
Ответ по поводу лишних знаков найден. Из-за того что внутри очень много кавычек с разрешениями, здесь нужно вставить просто src=<?php the_post_thumbnail() ?> и все сразу стало хорошо.
По поводу редактора записей. ошибки все нашел, устранил, но это не помогло. Просто открывается пустая страница без ошибок.
Ошибки были anycomment - 3 штуки и одна по версии php. изменил версию.
Т.к результата это не принесло, было принято решение установить Classic Editor и теперь все работает.
Ответы:
Несмотря на "много букв", из вашего вопроса мало что понятно.
the_post_thumbnail() формирует полный тэг img. Это видно на скрине. Так что ваш код ведёт себе совершенно безошибочно в соответствии с <img alt="newsIt" src="<?php the_post_thumbnail() ?>">
TypeError: Cannot read properties of undefined (reading 'includes')
at https://......../wp-includes/js/dist/editor.min.js...
Ошибка в js - откройте dev tools, включите pause on uncaught exceptions и смотрите что нам undefined у которого должны быть includes
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Запись в WordPress может неправильно сохраняться по нескольким причинам: конфликт хука
save_post, autosave/revision, неправильная проверка nonce, неверные права пользователя, фильтры контента, REST API или плагин конструктора. Начинать нужно с логов и минимального воспроизводимого примера.Если у вас свой metabox, типичная правильная схема сохранения такая:
add_action('save_post', function ($post_id) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } if (wp_is_post_revision($post_id)) { return; } if (! current_user_can('edit_post', $post_id)) { return; } if ( empty($_POST['my_nonce']) || ! wp_verify_nonce($_POST['my_nonce'], 'save_my_box') ) { return; } if (isset($_POST['my_field'])) { update_post_meta($post_id, 'my_field', sanitize_text_field($_POST['my_field'])); } });
Частые ошибки: забыли
nameу поля, сохраняете не тотpost_id, перезаписываете данные пустым значением на autosave, используетеsanitize_text_fieldдля HTML, который потом исчезает.Если проблема только в Gutenberg/REST, откройте Network в браузере и проверьте ответ запроса сохранения. Если приходит 403/500, причина будет в PHP error log, nonce, правах или security-плагине.