Куда вставить enclosure в wordpress RSS ленте?

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

Привет, куда нужно вставить enclosure, что бы было так: < enclosure url="https://****.com/img/image.jpg" type="image/jpeg" />

Сейчас вывод изображения так: src="/wp-content/uploads/2023/07/image.jpg" alt="image">

Вот файл feed-rss который и вывод ленту:

&lt;?php /**  * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed.  *  * @package WordPress  */  header( 'Content-Type: ' . feed_content_type( 'rss' ) . '; charset=' . get_option( 'blog_charset' ), true ); $more = 1;  echo '&lt;?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '&gt;'; ?&gt; &lt;rss version="0.92"&gt; &lt;channel&gt; 	&lt;title&gt;&lt;?php wp_title_rss(); ?&gt;&lt;/title&gt; 	&lt;link&gt;&lt;?php bloginfo_rss( 'url' ); ?&gt;&lt;/link&gt; 	&lt;description&gt;&lt;?php bloginfo_rss( 'description' ); ?&gt;&lt;/description&gt; 	&lt;lastBuildDate&gt;&lt;?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?&gt;&lt;/lastBuildDate&gt; 	&lt;docs&gt;http://backend.userland.com/rss092&lt;/docs&gt; 	&lt;language&gt;&lt;?php bloginfo_rss( 'language' ); ?&gt;&lt;/language&gt; 	&lt;?php 	/** 	 * Fires at the end of the RSS Feed Header. 	 * 	 * @since 2.0.0 	 */ 	do_action( 'rss_head' ); 	?&gt;  &lt;?php while ( have_posts() ) : 	the_post(); 	?&gt; 	&lt;item&gt; 		&lt;title&gt;&lt;?php the_title_rss(); ?&gt;&lt;/title&gt; 		&lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss(); ?&gt;]]&gt;&lt;/description&gt; 		&lt;link&gt;&lt;?php the_permalink_rss(); ?&gt;&lt;/link&gt; 		&lt;?php 		/** 		 * Fires at the end of each RSS feed item. 		 * 		 * @since 2.0.0 		 */ 		do_action( 'rss_item' ); 		?&gt; 	&lt;/item&gt; &lt;?php endwhile; ?&gt; &lt;/channel&gt; &lt;/rss&gt;

&lt;?php /** * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed. * * @package WordPress */ header( 'Content-Type: ' . feed_content_type( 'rss' ) . '; charset=' . get_option( 'blog_charset' ), true ); $more = 1; echo '&lt;?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '&gt;'; ?&gt; &lt;rss version="0.92"&gt; &lt;channel&gt; &lt;title&gt;&lt;?php wp_title_rss(); ?&gt;&lt;/title&gt; &lt;link&gt;&lt;?php bloginfo_rss( 'url' ); ?&gt;&lt;/link&gt; &lt;description&gt;&lt;?php bloginfo_rss( 'description' ); ?&gt;&lt;/description&gt; &lt;lastBuildDate&gt;&lt;?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?&gt;&lt;/lastBuildDate&gt; &lt;docs&gt;http://backend.userland.com/rss092&lt;/docs&gt; &lt;language&gt;&lt;?php bloginfo_rss( 'language' ); ?&gt;&lt;/language&gt; &lt;?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?&gt; &lt;?php while ( have_posts() ) : the_post(); ?&gt; &lt;item&gt; &lt;title&gt;&lt;?php the_title_rss(); ?&gt;&lt;/title&gt; &lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss(); ?&gt;]]&gt;&lt;/description&gt; &lt;link&gt;&lt;?php the_permalink_rss(); ?&gt;&lt;/link&gt; &lt;?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?&gt; &lt;/item&gt; &lt;?php endwhile; ?&gt; &lt;/channel&gt; &lt;/rss&gt;

Подскажите пожалуйста, спасибо!

Дополнительно:

Ответы:

&lt;?php /**  * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed.  *  * @package WordPress  */  header( 'Content-Type: ' . feed_content_type( 'rss' ) . '; charset=' . get_option( 'blog_charset' ), true ); $more = 1;  echo '&lt;?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '&gt;'; ?&gt; &lt;rss version="0.92"&gt; &lt;channel&gt;   &lt;title&gt;&lt;?php wp_title_rss(); ?&gt;&lt;/title&gt;   &lt;link&gt;&lt;?php bloginfo_rss( 'url' ); ?&gt;&lt;/link&gt;   &lt;description&gt;&lt;?php bloginfo_rss( 'description' ); ?&gt;&lt;/description&gt;   &lt;lastBuildDate&gt;&lt;?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?&gt;&lt;/lastBuildDate&gt;   &lt;docs&gt;http://backend.userland.com/rss092&lt;/docs&gt;   &lt;language&gt;&lt;?php bloginfo_rss( 'language' ); ?&gt;&lt;/language&gt;   &lt;?php   /**    * Fires at the end of the RSS Feed Header.    *    * @since 2.0.0    */   do_action( 'rss_head' );   ?&gt;  &lt;?php while ( have_posts() ) :   the_post();   ?&gt;   &lt;item&gt;     &lt;title&gt;&lt;?php the_title_rss(); ?&gt;&lt;/title&gt;     &lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss(); ?&gt;]]&gt;&lt;/description&gt;     &lt;link&gt;&lt;?php the_permalink_rss(); ?&gt;&lt;/link&gt;     &lt;?php     /**      * Fires at the end of each RSS feed item.      *      * @since 2.0.0      */     do_action( 'rss_item' );     ?&gt;     &lt;!-- Add the enclosure tag for the image here --&gt;     &lt;enclosure url="&lt;?php echo esc_url( get_the_post_thumbnail_url( null, 'full' ) ); ?&gt;" type="image/jpeg" /&gt;   &lt;/item&gt; &lt;?php endwhile; ?&gt; &lt;/channel&gt; &lt;/rss&gt;

&lt;?php /** * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed. * * @package WordPress */ header( 'Content-Type: ' . feed_content_type( 'rss' ) . '; charset=' . get_option( 'blog_charset' ), true ); $more = 1; echo '&lt;?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '&gt;'; ?&gt; &lt;rss version="0.92"&gt; &lt;channel&gt; &lt;title&gt;&lt;?php wp_title_rss(); ?&gt;&lt;/title&gt; &lt;link&gt;&lt;?php bloginfo_rss( 'url' ); ?&gt;&lt;/link&gt; &lt;description&gt;&lt;?php bloginfo_rss( 'description' ); ?&gt;&lt;/description&gt; &lt;lastBuildDate&gt;&lt;?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?&gt;&lt;/lastBuildDate&gt; &lt;docs&gt;http://backend.userland.com/rss092&lt;/docs&gt; &lt;language&gt;&lt;?php bloginfo_rss( 'language' ); ?&gt;&lt;/language&gt; &lt;?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?&gt; &lt;?php while ( have_posts() ) : the_post(); ?&gt; &lt;item&gt; &lt;title&gt;&lt;?php the_title_rss(); ?&gt;&lt;/title&gt; &lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss(); ?&gt;]]&gt;&lt;/description&gt; &lt;link&gt;&lt;?php the_permalink_rss(); ?&gt;&lt;/link&gt; &lt;?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?&gt; &lt;!-- Add the enclosure tag for the image here --&gt; &lt;enclosure url="&lt;?php echo esc_url( get_the_post_thumbnail_url( null, 'full' ) ); ?&gt;" type="image/jpeg" /&gt; &lt;/item&gt; &lt;?php endwhile; ?&gt; &lt;/channel&gt; &lt;/rss&gt;

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

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

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Вставлять enclosure прямо в файл feed-rss из ядра WordPress не стоит. Такой файл перезапишется при обновлении, а сама задача решается безопаснее через хук, который добавляет нужный тег в каждый элемент ленты. Важно также понять формат: enclosure нормально относится к RSS 2.0, а в показанном примере используется старый шаблон RSS 0.92. Если вам нужна совместимость с агрегаторами, подкастовыми или новостными сервисами, лучше использовать стандартную RSS2-ленту WordPress и добавлять enclosure в нее.

Сам тег enclosure должен содержать абсолютный URL файла, тип файла и желательно размер в байтах. Относительный путь вида /wp-content/uploads/... для этого не подходит: внешняя система, которая читает RSS, не обязана знать домен сайта и может не суметь открыть такое изображение. Поэтому URL нужно получать средствами WordPress, например из миниатюры записи или из ID вложения.

add_action('rss2_item', function () {
    if (!has_post_thumbnail()) {
        return;
    }
 
    $image_id = get_post_thumbnail_id();
    $url = wp_get_attachment_image_url($image_id, 'full');
    $file = get_attached_file($image_id);
    $mime = get_post_mime_type($image_id) ?: 'image/jpeg';
    $length = ($file &amp;&amp; file_exists($file)) ? filesize($file) : 0;
 
    if (!$url) {
        return;
    }
 
    printf(
        '&lt;enclosure url=&quot;%s&quot; length=&quot;%d&quot; type=&quot;%s&quot; /&gt;' . "n",
        esc_url($url),
        (int) $length,
        esc_attr($mime)
    );
});

add_action('rss2_item', function () { if (!has_post_thumbnail()) { return; } $image_id = get_post_thumbnail_id(); $url = wp_get_attachment_image_url($image_id, 'full'); $file = get_attached_file($image_id); $mime = get_post_mime_type($image_id) ?: 'image/jpeg'; $length = ($file &amp;&amp; file_exists($file)) ? filesize($file) : 0; if (!$url) { return; } printf( '&lt;enclosure url=&quot;%s&quot; length=&quot;%d&quot; type=&quot;%s&quot; /&gt;' . "n", esc_url($url), (int) $length, esc_attr($mime) ); });

Этот код лучше положить не в файл ленты, а в functions.php дочерней темы или в небольшой mu-plugin, если логика должна работать независимо от темы. После добавления откройте RSS2-ленту, обычно это /feed/, и проверьте исходный код страницы: внутри каждого item, где у записи есть миниатюра, должен появиться enclosure с полным адресом изображения.

  • Если нужно брать не миниатюру, а первое изображение из текста записи, сначала получите URL или ID этого изображения, затем выводите enclosure тем же способом.
  • Если изображение хранится не во вложениях WordPress, размер файла может быть неизвестен. В этом случае можно оставить length равным 0, но для строгих RSS-потребителей лучше передавать реальный размер.
  • Если вы редактируете кастомный шаблон RSS 0.92, это будет локальный костыль. Для долгосрочного решения безопаснее переключиться на RSS2 и работать через rss2_item.

После правки не забудьте очистить кэш сайта и кэш ленты, если он есть. Если enclosure не появился, проверьте, что у записи действительно задана миниатюра, а код подключается на фронтенде, а не только в админке.

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

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

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

комментарий

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

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