Как добавить изображение в RSS-ленту WordPress без плагина?

28 авг. 2014 г., 12:18:30
Просмотры: 40.7K
Голосов: 10

Я искал способ добавления изображения записи в RSS-ленту WordPress без использования плагина. Я нашел несколько примеров и применил их согласно инструкциям. Но пока что результата нет. Изображение все еще не отображается.

Последнее и лучшее (на мой взгляд) решение (как указано здесь) которое я нашел - это добавление следующего кода в файл functions.php текущей темы

function featured_image_in_feed( $content ) {
    global $post;
    if( is_feed() ) {
        if ( has_post_thumbnail( $post->ID ) ){
            $output = get_the_post_thumbnail( $post->ID, 'medium', array( 'style' => 'float:right; margin:0 0 10px 10px;' ) );
            $content = $output . $content;
        }
    }
    return $content;
}
add_filter( 'the_content', 'featured_image_in_feed' );

Я не заметил никаких изменений. Нужно ли сделать что-то еще?

То, что я хочу сделать - это добавить изображение записи как отдельный элемент в XML. Это было бы удобнее для отображения в моем слайдере.

1
Комментарии

Я думаю, вы добавляете изображение записи в контенте, а не в лентах. Проверьте ответ, который я опубликовал.

Robert hue Robert hue
28 авг. 2014 г. 12:27:46
Все ответы на вопрос 5
7
13

На основе заметок здесь и множества других прочитанных ресурсов я разработал это решение специально для работы с конвертером RSS в Email от Mailchimp, используя фид из WordPress. Их шаблоны используют расширение <media:content> для элемента item, чтобы заполнить макрос изображения. Этот код нужно поместить в functions.php темы.

// Добавляем пространство имен для элемента media:image, используемого ниже
add_filter( 'rss2_ns', function(){
  echo 'xmlns:media="http://search.yahoo.com/mrss/"';
});

// Вставляем объект изображения в элемент RSS (см. MB-191)
add_action('rss2_item', function(){
  global $post;
  if (has_post_thumbnail($post->ID)){
    $thumbnail_ID = get_post_thumbnail_id($post->ID);
    $thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'medium');
    if (is_array($thumbnail)) {
      echo '<media:content medium="image" url="' . $thumbnail[0]
        . '" width="' . $thumbnail[1] . '" height="' . $thumbnail[2] . '" />';
    }
  }
});

Размер изображения 'medium' можно заменить на 'thumbnail', если требуется изображение меньшего размера.

31 янв. 2018 г. 20:53:24
Комментарии

Спасибо. Именно то, что нужно, чтобы другие агрегаторы могли найти изображение. Просто добавления тега изображения в контент недостаточно

Juergen Schulze Juergen Schulze
7 июн. 2018 г. 12:38:14

rss2_ns — это хук действия. Поэтому вместо add_filter следует использовать add_actionhttps://core.trac.wordpress.org/browser/tags/5.7.1/src/wp-includes/feed-rss2.php#L36

Aakash Chakravarthy Aakash Chakravarthy
15 мая 2021 г. 18:24:31

Привет! У меня вопрос. Что нужно вставить в выделенную область? Скриншот --> https://snipboard.io/rn6vWx.jpg

Jornes Jornes
29 дек. 2022 г. 16:10:20

@Jornes оставь эту часть как есть. Почему ты думаешь, что её нужно менять?

vick vick
31 дек. 2022 г. 07:15:07

Привет, Vick, спасибо за ответ! Я не уверен. Я думал, что ссылка должна быть ссылкой на мой RSS-канал.

Jornes Jornes
1 янв. 2023 г. 08:15:36

Привет @Vick, SEOpress рекомендовал мне игнорировать первую часть. И это работает. Но я заметил некоторые ошибки (выделенные) здесь. Пожалуйста, посмотрите скриншот. -> https://snipboard.io/iDXZBj.jpg

Как мне это исправить?

Jornes Jornes
5 янв. 2023 г. 17:40:16

Эта ссылка на Yahoo предназначена для получения определения элемента RSS 'media:image', как указано в комментарии. Я не могу понять, в чем ваша ошибка, по этой ссылке с корабля. Все, что я вижу, это страница, полная рекламы.

vick vick
2 февр. 2023 г. 15:34:30
Показать остальные 2 комментариев
8
12

Вот отличный пример. Как выводить миниатюры записей в лентах WordPress

Вставьте этот код в файл functions.php вашей темы

// вывод миниатюр записей в лентах WordPress
function wcs_post_thumbnails_in_feeds( $content ) {
    global $post;
    if( has_post_thumbnail( $post->ID ) ) {
        $content = '<p>' . get_the_post_thumbnail( $post->ID ) . '</p>' . $content;
    }
    return $content;
}
add_filter( 'the_excerpt_rss', 'wcs_post_thumbnails_in_feeds' );
add_filter( 'the_content_feed', 'wcs_post_thumbnails_in_feeds' );
28 авг. 2014 г. 12:20:43
Комментарии

Как я могу добавить imgURL и imgTitle как отдельные ключи в XML?

zkanoca zkanoca
28 авг. 2014 г. 12:28:22

Для этого вам нужно изменить шаблон фида. Вот руководство по этому поводу: http://digwp.com/2012/10/customizing-wordpress-feeds/#customize-templates

Robert hue Robert hue
28 авг. 2014 г. 12:33:12

Лучше я буду манипулировать строкой описания. (:

zkanoca zkanoca
28 авг. 2014 г. 12:39:30

Что именно вы хотите сделать? Если вы объясните подробнее, возможно, кто-то здесь сможет вам помочь.

Robert hue Robert hue
28 авг. 2014 г. 12:47:40

Я хочу отображать изображения и заголовки избранных новостей в компоненте карусели Bootstrap. Пытаюсь написать .php файл. Ваша помощь уже достаточно хороша, чтобы решить мою проблему. Спасибо. Я буду извлекать путь к изображению из ключа описания.

zkanoca zkanoca
28 авг. 2014 г. 12:52:50

Это здорово. Рад, что смог помочь. :)

Robert hue Robert hue
28 авг. 2014 г. 12:55:56

@Roberthue Можешь подтвердить, что это работает для ленты постов по категории? /?cat=15&feed=rss2

jackncoke jackncoke
1 апр. 2016 г. 19:57:09

@jackncoke Да, работает. Почему бы и нет? Нет параметра, который ограничивал бы это для категории.

Robert hue Robert hue
18 апр. 2016 г. 09:30:15
Показать остальные 3 комментариев
0

Я попробовал выбранный ответ и получил действительно большое изображение в своей ленте. Я бы порекомендовал добавить размер изображения в код.

// отображение миниатюр избранных записей в RSS-лентах
function WPGood_rss_thumbs( $content ) {
    global $post;
    if( has_post_thumbnail( $post->ID ) ) {
        $content = '<figure>' . get_the_post_thumbnail( $post->ID, 'thumbnail' ) . '</figure>' . $content;
    }
    return $content;
}
add_filter( 'the_excerpt_rss', 'WPGood_rss_thumbs' );
add_filter( 'the_content_feed', 'WPGood_rss_thumbs' );

Я использовал 'thumbnail' для своей ленты, но 'medium' может работать лучше для некоторых сайтов.

30 дек. 2015 г. 00:15:37
0

Я перепробовал все предложенные выше решения, но ничего не сработало. Изображение продолжало добавляться в область описания.

Я нашел это решение на другом сайте, немного модифицировал его, и вуаля — оно заработало.

add_action('rss2_item', function(){
global $post;
 if(has_post_thumbnail($post->ID)){
  $output = '';
  $thumbnail_ID = get_post_thumbnail_id( $post->ID );
  $thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'thumbnail');
  $output .= '<post-thumbnail>';
  $output .= '<url>'. $thumbnail[0] .'</url>';
  $output .= '<width>'. $thumbnail[1] .'</width>';
  $output .= '<height>'. $thumbnail[2] .'</height>';
  $output .= '</post-thumbnail>';

  echo $output;
 }
});
19 окт. 2017 г. 21:03:04
0

Вот как я получаю изображения вместе со ссылкой и заголовком записи из внешнего RSS-канала.

<div class="row">

    <?php
    /*
     * Получаем последние записи блога из RSS-канала
     * Сортируем записи по дате публикации
     * Получаем SRC и ALT атрибуты Featured Image с помощью регулярных выражений
     * Цикл повторяется 4 раза для отображения 4 статей
     */
    $feed = 'https://www.somewpsite.com/feed/';
    $entries = array();
    $xml = simplexml_load_file($feed);
    $entries = array_merge($entries, $xml->xpath("//item"));
    //Сортируем записи по pubDate
    usort($entries, function ($feed1, $feed2) {
        return strtotime($feed2->pubDate) - strtotime($feed1->pubDate);
    });
    ?>

    <?php
    $counter = 0;
    foreach ($entries as $entry) {
        //получаем Featured Image
        //Забираем контент записи блога
        $blogContent = $entry->description;
        //регулярное выражение для поиска атрибутов img
        preg_match('/(<img[^>]+>)/i', $blogContent, $matches);
        //сохраняем первое изображение в переменную
        $featuredImage = $matches[0];
        //Получаем атрибут src с помощью регулярного выражения
        preg_match('@src="([^"]+)"@', $featuredImage, $getSrc);
        //Получаем атрибут alt с помощью регулярного выражения
        preg_match('@alt="([^"]+)"@', $featuredImage, $getAlt);
        //Сохраняем отфильтрованные атрибуты для их отображения.
        $imgAlt = array_pop($getAlt);
        $imgSrc = array_pop($getSrc);
        // удаляем параметры URL
        $url = $entry->link;
        $url = strtok($url, '?');
        //Устанавливаем счетчик для итерации по 4 элементам и останавливаем цикл.
        if ($counter <= 3) { ?>

            <div class="col-12 col-sm-12 col-md-6 col-lg-3 col-xl-3">
                <div class="imgContainer">
                    <a href="<?php echo $url ?>">
                        <img src="<?php echo $imgSrc ?>" alt="<?php echo $imgAlt; ?>" class="img-fluid">
                    </a>
                </div>
                <h4>
                    <a class="blog-entry-link" href="<?php echo $url ?>"><?= $entry->title ?></a>
                </h4>
            </div>

            <?php
            $counter++;
        } // конец условия счетчика
    }// конец цикла ?>
</div>
11 мая 2020 г. 14:12:03