Вопрос или проблема
У меня есть пользовательская функция, которая извлекает (3) поста из другого блога на WordPress, и она получает их из определенных категорий, которые я указываю через короткий код.
С учетом этого, я не могу заставить ее работать и отображать фактическое изображение, так как могу получить только ID изображений (ID медиа вложений).
Вот мой рабочий код, который работает, за исключением того, что изображение не отображается, вместо этого выводится ID изображения (числовое значение).
function feedpuller_func($atts)
{
$url = $atts['url'];
$count = ($atts['count']) ? $atts['count'] : '3';
if($atts['catid'])
{
$cat = "?categories=" . $atts['catid'] . '&per_page="' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/?_embed" . $cat);
}
else if ($atts['slug'])
{
$slug = $atts['slug'];
echo $url . '/wp-json/wp/v2/categories?slug=' . $slug;
$responseslug = wp_remote_get($url . '/wp-json/wp/v2/categories?slug=' . $slug);
$postdata = json_decode(wp_remote_retrieve_body($responseslug));
if($postdata)
$catid = $postdata[0]->id;
else
echo 'нет записи по этому слугу';
if($catid)
{
$cat = "?categories=" . $catid . '&per_page="' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/?_embed" . $cat);
}
}
else
$cat = "";
if(is_wp_error($response)) {
return;
}
$posts = json_decode(wp_remote_retrieve_body($response));
if(empty($posts)) {
return;
}
if(!empty($instance['title'])) {
echo $args['before_title'] . apply_filters('widget_title', $instance['title'], $instance, $this->id_base) . $args['after_title'];
}
if(!empty($posts)) {
echo '<ul class="feedothersite">';
foreach($posts as $post) { //echo '<pre>'; print_r($post);
echo '<li><a href="' . $post->link . '">' . '<img src="' . $post->featured_media . '">' . '<br>' . $post->title->rendered . '<br>' . $post->excerpt->rendered . '</a></li>';
}
echo '</ul>';
}
}
add_shortcode("feedpuller", "feedpuller_func");
Изменение: Я НЕ хочу использовать уже готовый плагин, и также я пробовал решения в связанных постах, но мои функции отличаются, потому что я отображаю посты из определенных категорий, а типичные посты извлекаются и отображаются без этих параметров.
Предложенный метод (я знаю, что это работает для обычных постов)
/?rest_route=/wp/v2/posts&_embed
/wp-json/wp/v2/posts?_embed
Но мои вызываются так:
/wp-json/wp/v2/categories?slug=' . $slug
Я нашел решение с помощью отличного друга. Я опубликую его здесь, если кому-то еще нужно использовать эту функцию. В целом, эта функция будет отображать посты с другого блога, и вы можете ввести специфические ID категорий с другого блога, а также контролировать, сколько постов отображается.
function feedpuller_func($atts)
{
$url = $atts['url'];
$count = ($atts['count']) ? $atts['count'] : '3';
$imgsize = (in_array($atts['img'], array('thumbnail', 'medium', 'large', 'full'))) ? $atts['img'] : 'thumbnail';
if($atts['catid'])
{
$cat = "?_embed&categories=" . $atts['catid'] . '&per_page="' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/' . $cat);
}
else if ($atts['slug'])
{
$slug = $atts['slug'];
echo $url . '/wp-json/wp/v2/categories?slug=' . $slug;
$responseslug = wp_remote_get($url . '/wp-json/wp/v2/categories?slug=' . $slug);
$postdata = json_decode(wp_remote_retrieve_body($responseslug));
if($postdata)
$catid = $postdata[0]->id;
else
echo 'нет записи по этому слугу';
if($catid)
{
$cat = "?categories=" . $catid . '&per_page="' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/' . $cat);
}
}
else
$cat = "";
if(is_wp_error($response)) {
return;
}
$posts = json_decode(wp_remote_retrieve_body($response));
if(empty($posts)) {
return;
}
if(!empty($instance['title'])) {
echo $args['before_title'] . apply_filters('widget_title', $instance['title'], $instance, $this->id_base) . $args['after_title'];
}
if(!empty($posts)) {
echo '<ul class="feedothersite">';
foreach($posts as $post) { //echo '<pre>'; print_r(); exit;
$imgurl = $post->_embedded->{'wp:featuredmedia'}[0]->media_details->sizes->$imgsize->source_url;
if($imgurl)
$img = '<img src="' . $imgurl . '">';
else
$img = '';
echo '<div class="feedcontent"><a href="' . $post->link . '"><li><div class="feedimg">' . $img . '<div><h2>' . $post->title->rendered . '</h2></a></div></li>';
}
echo '</ul>';
}
}
add_shortcode("feedpuller", "feedpuller_func");
Значение короткого кода должно выглядеть так: [feedpuller url=”http://othersite.com/” catid=”22″ count=”4″] Чтобы отобразить изображение, используйте: img=”full”, img=”medium” или img=”thumbnail”.
Ответ или решение
Конечно! Вот полноценный ответ на ваш вопрос о том, как отобразить изображение миниатюры поста вместе с категориями через WP Rest API, с учетом представленного вами кода.
Решение проблемы отображения изображения миниатюры
Ваша задача заключается в том, чтобы получить посты с другого блога на WordPress, а также отобразить их миниатюры и категории. Вы правильно указали, что получение миниатюр возможно через расширенный ответ (_embed
) от WP Rest API. Базовая проблема, с которой вы столкнулись, заключается в том, что вы получаете только ID миниатюры, а не саму URL-ссылку.
Обновленный код функции
Ниже представлен исправленный код вашей функции, который успешно отобразит миниатюры постов вместе с категориями:
function feedpuller_func($atts) {
$url = $atts['url'];
$count = (!empty($atts['count'])) ? $atts['count'] : '3';
$imgsize = (in_array($atts['img'], array('thumbnail', 'medium', 'large', 'full'))) ? $atts['img'] : 'thumbnail';
// Построение категории для API
if (!empty($atts['catid'])) {
$cat = "?_embed&categories=" . $atts['catid'] . '&per_page=' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/" . $cat);
} elseif (!empty($atts['slug'])) {
$slug = $atts['slug'];
$responseslug = wp_remote_get($url . '/wp-json/wp/v2/categories?slug=' . $slug);
$postdata = json_decode(wp_remote_retrieve_body($responseslug));
if ($postdata) {
$catid = $postdata[0]->id;
$cat = "?_embed&categories=" . $catid . '&per_page=' . $count;
$response = wp_remote_get($url . "/wp-json/wp/v2/posts/" . $cat);
} else {
return 'Нет записи по этому слагу.';
}
} else {
$cat = '';
}
if (is_wp_error($response)) {
return;
}
$posts = json_decode(wp_remote_retrieve_body($response));
if (empty($posts)) {
return;
}
echo '<ul class="feedothersite">';
foreach ($posts as $post) {
$imgurl = $post->_embedded->{'wp:featuredmedia'}[0]->media_details->sizes->$imgsize->source_url;
$img = $imgurl ? '<img src="' . esc_url($imgurl) . '">' : '';
echo '<li>';
echo '<a href="' . esc_url($post->link) . '">' . $img . '<br>';
echo '<h2>' . esc_html($post->title->rendered) . '</h2>';
echo '</a>';
echo '</li>';
}
echo '</ul>';
}
add_shortcode("feedpuller", "feedpuller_func");
Пояснение кода
- Параметры шорткода: Вы используете атрибуты
$atts
для передачи необходимых данных, таких как URL другого блога, ID категории и количество постов. - Использование
_embed
: Вы добавили_embed
в запрос, что позволяет получить дополнительные данные, включая подробности о медиапредметах при запросе постов. - Извлечение URL изображения: Здесь вы корректно получаете URL изображения миниатюры для указанного размера через
$post->_embedded->{'wp:featuredmedia'}
. Это важно, так как без этого вы получали бы только ID изображения. - Экранирование данных: Используются функции
esc_url()
иesc_html()
для экранирования данных перед выводом в HTML, что помогает предотвратить потенциальные уязвимости.
Использование шорткода
Вы можете использовать шорткод следующим образом:
[feedpuller url="http://othersite.com/" catid="22" count="4" img="full"]
Здесь img
— это параметр, который позволяет задать размер изображения, и может принимать значения thumbnail
, medium
, large
или full
.
Если у вас есть дополнительные вопросы или уточнения, не стесняйтесь обращаться!