нужно было получить новости ( категория 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')
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>
вкратце что происходит в этом коде. Новость вставляется сначала в предварительное окно, затем при нажатии на кнопку открывается модалка и там уже весь текст вставляется..
Проблема максимально простая, но решения пока не нашел.. после изображения как текст вставляются следующие символы "> -просто между картинкой и следующим дивом.
Скрыть, так сказать сделать костыль - не проблема, но хочется понять что не так .... причем если убираю вызов the_post_thumbnail() - то и эти символы пропадают... если ставлю в конец тега img - alt с описанием, то выводится и он.... поэтому собственно пока его в начало и переставил.
3. Все вроде бы неплохо, вот только описание новости дается очень маленькое, и становится очевидный вопрос - как получить полностью текст новости целиком...