Куда вставить enclosure в wordpress RSS ленте?
Привет, куда нужно вставить enclosure, что бы было так: < enclosure url="https://****.com/img/image.jpg" type="image/jpeg" />
Сейчас вывод изображения так: src="/wp-content/uploads/2023/07/image.jpg" alt="image">
Вот файл feed-rss который и вывод ленту:
<?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 '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?> <rss version="0.92"> <channel> <title><?php wp_title_rss(); ?></title> <link><?php bloginfo_rss( 'url' ); ?></link> <description><?php bloginfo_rss( 'description' ); ?></description> <lastBuildDate><?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?></lastBuildDate> <docs>http://backend.userland.com/rss092</docs> <language><?php bloginfo_rss( 'language' ); ?></language> <?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?> <?php while ( have_posts() ) : the_post(); ?> <item> <title><?php the_title_rss(); ?></title> <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> <link><?php the_permalink_rss(); ?></link> <?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?> </item> <?php endwhile; ?> </channel> </rss> |
<?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 '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?> <rss version="0.92"> <channel> <title><?php wp_title_rss(); ?></title> <link><?php bloginfo_rss( 'url' ); ?></link> <description><?php bloginfo_rss( 'description' ); ?></description> <lastBuildDate><?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?></lastBuildDate> <docs>http://backend.userland.com/rss092</docs> <language><?php bloginfo_rss( 'language' ); ?></language> <?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?> <?php while ( have_posts() ) : the_post(); ?> <item> <title><?php the_title_rss(); ?></title> <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> <link><?php the_permalink_rss(); ?></link> <?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?> </item> <?php endwhile; ?> </channel> </rss>
Подскажите пожалуйста, спасибо!
Дополнительно:
Ответы:
<?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 '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?> <rss version="0.92"> <channel> <title><?php wp_title_rss(); ?></title> <link><?php bloginfo_rss( 'url' ); ?></link> <description><?php bloginfo_rss( 'description' ); ?></description> <lastBuildDate><?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?></lastBuildDate> <docs>http://backend.userland.com/rss092</docs> <language><?php bloginfo_rss( 'language' ); ?></language> <?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?> <?php while ( have_posts() ) : the_post(); ?> <item> <title><?php the_title_rss(); ?></title> <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> <link><?php the_permalink_rss(); ?></link> <?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?> <!-- Add the enclosure tag for the image here --> <enclosure url="<?php echo esc_url( get_the_post_thumbnail_url( null, 'full' ) ); ?>" type="image/jpeg" /> </item> <?php endwhile; ?> </channel> </rss> |
<?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 '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?> <rss version="0.92"> <channel> <title><?php wp_title_rss(); ?></title> <link><?php bloginfo_rss( 'url' ); ?></link> <description><?php bloginfo_rss( 'description' ); ?></description> <lastBuildDate><?php echo date( 'D, d M Y H:i:s +0300', strtotime('+3 hours')); ?></lastBuildDate> <docs>http://backend.userland.com/rss092</docs> <language><?php bloginfo_rss( 'language' ); ?></language> <?php /** * Fires at the end of the RSS Feed Header. * * @since 2.0.0 */ do_action( 'rss_head' ); ?> <?php while ( have_posts() ) : the_post(); ?> <item> <title><?php the_title_rss(); ?></title> <description><![CDATA[<?php the_excerpt_rss(); ?>]]></description> <link><?php the_permalink_rss(); ?></link> <?php /** * Fires at the end of each RSS feed item. * * @since 2.0.0 */ do_action( 'rss_item' ); ?> <!-- Add the enclosure tag for the image here --> <enclosure url="<?php echo esc_url( get_the_post_thumbnail_url( null, 'full' ) ); ?>" type="image/jpeg" /> </item> <?php endwhile; ?> </channel> </rss>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Вставлять 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 && file_exists($file)) ? filesize($file) : 0; if (!$url) { return; } printf( '<enclosure url="%s" length="%d" type="%s" />' . "n", esc_url($url), (int) $length, esc_attr($mime) ); });
Этот код лучше положить не в файл ленты, а в functions.php дочерней темы или в небольшой mu-plugin, если логика должна работать независимо от темы. После добавления откройте RSS2-ленту, обычно это /feed/, и проверьте исходный код страницы: внутри каждого item, где у записи есть миниатюра, должен появиться enclosure с полным адресом изображения.
После правки не забудьте очистить кэш сайта и кэш ленты, если он есть. Если enclosure не появился, проверьте, что у записи действительно задана миниатюра, а код подключается на фронтенде, а не только в админке.