web-dev-qa-db-fra.com

Comment ajouter une image en vedette à la balise d'élément RSS?

Je suis en mesure d'ajouter une image sélectionnée au flux RSS comme suit:

function insertThumbnailRSS($content) {
    global $post;
    if(has_post_thumbnail($post->ID)){
        $content = ''.get_the_post_thumbnail($post->ID, 'thumbnail', array('alt' => get_the_title(), 'title' => get_the_title(), 'style' => 'float:right;')).''.$content;
    }
    return $content;
}
add_filter('the_excerpt_rss', 'insertThumbnailRSS');
add_filter('the_content_feed', 'insertThumbnailRSS');

Cependant, en examinant le code XML généré pour le flux RSS, j'ai remarqué que l'image sélectionnée était collée dans la balise d'élément de description XML.

Comment puis-je insérer l'image de l'article en vedette dans sa propre balise d'élément de fil RSS, disons "image", plutôt que de l'insérer dans le contenu de l'article?

8
Michael Ecklund

Vous pouvez le faire en ajoutant une action au hook 'rss2_item' comme ceci:

add_action('rss2_item', function(){
  global $post;

  $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;
});
10
codekipple

Construit à partir de l'excellente réponse de codekipple , voici ma mise en œuvre modifiée, qui utilise l'élément valide Media RSS media:content ( spec ) et vérifiant l'existence d'une image miniature/sélectionnée:

    function dn_add_rss_image() {
        global $post;

        $output = '';
        if ( has_post_thumbnail( $post->ID ) ) {
            $thumbnail_ID = get_post_thumbnail_id( $post->ID );
            $thumbnail = wp_get_attachment_image_src( $thumbnail_ID, 'thumbnail' );

            $output .= '<media:content xmlns:media="http://search.yahoo.com/mrss/" medium="image" type="image/jpeg"';
            $output .= ' url="'. $thumbnail[0] .'"';
            $output .= ' width="'. $thumbnail[1] .'"';
            $output .= ' height="'. $thumbnail[2] .'"';
            $output .= ' />';
        }
        echo $output;
    }
    add_action( 'rss2_item', 'dn_add_rss_image' );

Remarque: Incluez l'attribut xmlns ici pour le valider. L'installation initiale de WordPress n'inclut pas cette déclaration d'espace de noms, et bien que vous puissiez la modifier, d'autres thèmes/plugins le peuvent également.

Plus de détails sur les autres attributs, etc. sont dans ma réponse non spécifique à WordPress, ici .

Cela s'intègre au bâtiment de la newsletter RSS de MailChimp.

7
D_N

En me basant sur codekipple et D_N, je voulais quelques attributs supplémentaires dans mon media:content, alors voici ce que j'ai fait:

function add_media_content_to_feed() {
  global $post;

  $post_id = $post->ID;

  if(!has_post_thumbnail($post)) {
    return;
  }

  $thumbnail_size = 'large';
  $thumbnail_id   = get_post_thumbnail_id($post_id);

  $file           = image_get_intermediate_size(get_post_thumbnail_id(), $thumbnail_size);

  $url            = $file['url'];
  $type           = $file['mime-type'];
  $height         = $file['height'];
  $width          = $file['width'];
  $file_size      = '';

  $path           = $file['path'];
  if($path && 0 !== strpos($path, '/') && !preg_match('|^.:\\\|', $path) && (($uploads = wp_get_upload_dir()) && false === $uploads['error'])) {
    $path         = $uploads['basedir']."/$path";
    $file_size    = filesize($path);
  }

  echo sprintf(__('<media:content url="%s" type="%s" medium="image" height="%s" width="%s" fileSize="%s" />'),
    $url,
    $type,
    $height,
    $width,
    $file_size
  );

}
add_action('rss2_item', 'add_media_content_to_feed');

la réponse de codekipple ajoute également l’image sous le contenu de tous les flux. Je voulais mon image au-dessus du contenu, alors j'ai fait ceci:

function add_featured_image_to_feed($content, $feed_type) {
  global $post;
  $post_id = $post->ID;
  if(has_post_thumbnail($post)) {
    $content = '<div class="feed-image">'.get_the_post_thumbnail($post_id, 'large').'</div>'.$content;
  }
  return $content;
}
add_filter('the_content_feed', 'add_featured_image_to_feed', 10, 9999);
0
cfx