8 votes

Affichage des images dans le flux d'atomes

J'ai des problèmes avec l'affichage des images dans le fichier atom. Il n'inclut pas les images dans le flux dans google reader, opera ou firefox.

Pour commencer, j'ai fait tout ce qui est indiqué dans le Listing 6. à [An overview of the Atom 1.0 Syndication Format] Mais cela ne fonctionne pas.

Mise à jour Ce n'est pas un problème avec les images protégées par un lien hypertexte. Décrit ici : Comment afficher la photo d'un article dans le flux atomique ?

Plus tard, j'ai changé l'alimentation en fonction de description publiée ici .

J'ai ajouté :

<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="path_to_image.jpg" />

Mais ça ne marche toujours pas

12voto

Gnomet Points 751

J'ai eu le même problème en essayant d'inclure des images comme pièce jointe, mais il m'a semblé que le moyen le plus simple était d'inclure l'image avec la balise img normale au contenu html.

(Il est également enveloppé dans CDATA, ce qui pourrait affecter la façon dont Google Reader traite le contenu. Je n'ai pas essayé sans).

L'exemple suivant fonctionne pour moi pour rendre les images des flux atomiques visibles dans Google Reader :

<content type="html">
  <![CDATA[
    <a href="http://test.lvh.me:3000/listings/341-test-pics?locale=en">
      <img alt="test_pic" src="http://test.lvh.me:3000/system/images/20/medium/test_pic.jpg?1343246102" />
    </a>
  ]]>
</content>

1voto

Hughie Molloy Points 16

Wordpress utilise le méta-champ enceinte pour régler les médias. Il s'agit de la balise correcte selon la spécification RSS. J'ai vu des personnes suggérer d'utiliser média:contenu mais si vous l'utilisez, assurez-vous de définir l'espace de nom XML.

Malheureusement, en raison d'un code Wordpress douteux, vous ne pouvez pas le définir dynamiquement. (Wordpress récupère tous les méta-champs et les parcourt en boucle au lieu d'appeler directement l'enceinte).

Vous pouvez définir l'enceinte sur le poste de sauvegarde. Ce devrait être un tableau avec des entrées de la forme "$url\n$length\n$type"

Si vous souhaitez ajouter vous-même les balises de clôture, vous pouvez procéder comme suit :

RSS

add_action( 'rss2_item', 'hughie_rss2_item_enclosure' );
function hughie_rss2_item_enclosure():void
{
    $id = get_post_thumbnail_id();
    $url = wp_get_attachment_url($id);
    $length = filesize(get_attached_file($id));
    $type = get_post_mime_type($id);

    echo apply_filters( 'rss_enclosure', '<enclosure url="' . esc_url( $url ) . '" length="' . absint( $length ) . '" type="' . esc_attr( $type ) . '" />' . "\n" );
}

ATOM :

add_action( 'atom_entry', 'hughie_atom_entry_enclosure' );
function hughie_atom_entry_enclosure():void
{
    $id = get_post_thumbnail_id();
    $url = wp_get_attachment_url($id);
    $length = filesize(get_attached_file($id));
    $type = get_post_mime_type($id);

    echo apply_filters( 'atom_enclosure', '<link rel="enclosure" href="' . esc_url( $url ) . '" length="' . absint( $length ) . '" type="' . esc_attr( $type ) . '" />' . "\n" );
}

La seule façon que j'ai trouvée pour définir le enceinte dynamiquement, c'est court-circuiter l'appel get_metadata. Vous pouvez ajouter des contrôles pour vous assurer que vous êtes dans un flux ou même vérifier le stacktrace pour vous en assurer.

add_filter('get_post_metadata', 'hughie_get_post_metadata', 10, 5 );
function hughie_get_post_metadata($value, int $object_id, string $meta_key, bool $single, string $meta_type)
{
    if (is_feed() && $meta_key === '') {

        $backtrace = debug_backtrace();
        if (isset($backtrace[7]['function']) && ( $backtrace[7]['function'] === 'rss_enclosure' || $backtrace[7]['function'] === 'atom_enclosure' ) ) {

            if (!isset($value['enclosure'])) {
                $value['enclosure'] = [];
            }

            $id = get_post_thumbnail_id();
            $url = wp_get_attachment_url($id);
            $length = filesize(get_attached_file($id));
            $type = get_post_mime_type($id);

            $value['enclosure'][] = "$url\n$length\n$type";
        }
    }

    return $value;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X