Почему может неправильно сохраняться запись в wordpress?

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

нужно было получить новости ( категория 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>

вкратце что происходит в этом коде. Новость вставляется сначала в предварительное окно, затем при нажатии на кнопку открывается модалка и там уже весь текст вставляется..

Проблема максимально простая, но решения пока не нашел.. после изображения как текст вставляются следующие символы "> -просто между картинкой и следующим дивом.

Почему может неправильно сохраняться запись в wordpress?

Скрыть, так сказать сделать костыль - не проблема, но хочется понять что не так .... причем если убираю вызов 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

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

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

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

Запись в WordPress может неправильно сохраняться по нескольким причинам: конфликт хука save_post, autosave/revision, неправильная проверка nonce, неверные права пользователя, фильтры контента, REST API или плагин конструктора. Начинать нужно с логов и минимального воспроизводимого примера.

Если у вас свой metabox, типичная правильная схема сохранения такая:

add_action('save_post', function ($post_id) {
    if (defined('DOING_AUTOSAVE') &amp;&amp; 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']));
    }
});

add_action('save_post', function ($post_id) { if (defined('DOING_AUTOSAVE') &amp;&amp; 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-плагине.

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

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

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

комментарий

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

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