@rvitalia

Почему может неправильно сохраняться запись в 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);
}


Итак, все вроде бы работает, но есть ряд проблем:
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>

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

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

Скрыть, так сказать сделать костыль - не проблема, но хочется понять что не так .... причем если убираю вызов the_post_thumbnail() - то и эти символы пропадают... если ставлю в конец тега img - alt с описанием, то выводится и он.... поэтому собственно пока его в начало и переставил.

3. Все вроде бы неплохо, вот только описание новости дается очень маленькое, и становится очевидный вопрос - как получить полностью текст новости целиком...
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
@rvitalia Автор вопроса
Ответ по поводу лишних знаков найден. Из-за того что внутри очень много кавычек с разрешениями, здесь нужно вставить просто src=<?php the_post_thumbnail() ?> и все сразу стало хорошо.
По поводу редактора записей. ошибки все нашел, устранил, но это не помогло. Просто открывается пустая страница без ошибок.
Ошибки были anycomment - 3 штуки и одна по версии php. изменил версию.
Т.к результата это не принесло, было принято решение установить Classic Editor и теперь все работает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
Несмотря на "много букв", из вашего вопроса мало что понятно.

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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы