web-dev-qa-db-fra.com

Comment obtenir des images de galerie?

J'ai quelques images téléchargées dans des publications wordpress (par exemple, la publication n ° 1 et la publication n ° 2). Maintenant, j'ai créé un nouveau message (par exemple, le message n ° 3) et dans ce message, j'ai inséré la galerie WordPress 3.5. et post # 2. Maintenant, dans le post # 3, je voudrais obtenir les liens vers les images, mais je n'arrive pas à obtenir. J'utilise le code suivant:

$attachments = get_children( array('post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
            echo wp_get_attachment_image( $attachment_id, 'medium' );
   }

Il ne montrera que l'image si je poste dans l'article, mais il ne sera pas affiché si j'ajoute à partir des autres articles. Alors, comment puis-je obtenir les liens vers les images qui sont ajoutées dans la galerie mais non téléchargées.

Merci pour toute aide.

4
jay

J'ai eu le même problème - comment puis-je afficher toutes les images d'un article contenant une galerie où certaines images ne sont pas attachées à l'article, ou sont attachées à des articles différents?

La nouvelle interface multimédia dans WP3.5 vous permet d'ajouter n'importe quelle image de la médiathèque à une galerie, qu'elles soient "attachées" ou non. Comme vous l'avez découvert, la fonction "get_children" ne renvoie que les images jointes au message. Le truc que j’ai utilisé est d’obtenir les identifiants du shortcode [gallery] lui-même plutôt que du fait qu’ils sont des pièces jointes. Le shortcode inclut tous les identifiants d’image, qu’ils soient ou non attachés à la publication. Par exemple. [gallery ids = "410,411,412,413,414,415"]. De toute évidence, wordpress peut analyser cela pour récupérer toutes les images et les afficher au format galerie en utilisant la fonction "gallery_shortcode" incluse dans le noyau de wordpress (dans includes/media.php). Pour obtenir les identifiants de toutes les images dans le code court [gallery], j'ai créé une nouvelle fonction dans mon fichier functions.php:

function grab_ids_from_gallery() {

global $post;
$attachment_ids = array();
$pattern = get_shortcode_regex();
$ids = array();

if (preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) ) {   //finds the     "gallery" shortcode and puts the image ids in an associative array at $matches[3]
$count=count($matches[3]);      //in case there is more than one gallery in the post.
for ($i = 0; $i < $count; $i++){
    $atts = shortcode_parse_atts( $matches[3][$i] );
    if ( isset( $atts['ids'] ) ){
    $attachment_ids = explode( ',', $atts['ids'] );
    $ids = array_merge($ids, $attachment_ids);
    }
}
}
  return $ids;

 }
add_action( 'wp', 'grab_ids_from_gallery' );

Utilisez maintenant la fonction "grab_ids_from_gallery ()" pour renvoyer tous les identifiants sous forme de tableau dans votre modèle.

Je suis sûr qu'il existe un moyen plus élégant de le faire - Mais cela fonctionne pour moi. La base de ce code provient de:

http://core.trac.wordpress.org/ticket/22960

qui discute de cette question.

5
steveO

Je dois avouer que je n'ai pas eu le temps de jouer avec les nouveaux médiathèques de 3.5 et autres, mais je ne me suis pas servi de ce code sans tenir compte des fonctionnalités de la galerie de WP ...

Le code que vous avez fourni utilise get_children() avec la variable de requête post_parent définie sur get_the_ID() (ID de l'objet publication en cours de traitement dans la boucle de contenu). En tant que tel, l’appel de get_children() est uniquement capable d’interroger les pièces jointes de la publication en cours, et aucune autre .

Dans la terminologie de votre exemple, votre code, lorsqu'il est exécuté dans le contexte de la boucle lors du traitement de Post # 3, ne peut pas récupérer les pièces jointes attachées à Post # 1 _ et Post # 2 parce qu'il demande spécifiquement les pièces jointes attachées à Message n ° 3.

Malheureusement, Wordpress ne pas prend en charge le passage de plusieurs valeurs dans la requête post_parent, donc pour récupérer les pièces jointes des autres publications de la manière souhaitée, vous devez obtenir les ID de publication de la pièce jointe. contenant des posts (Post # 1 _ et Post # 2) et exécutez un appel à get_children() pour chacun, en remplaçant la valeur post_parent de "get_the_ID()" par l'ID correspondant.

Une solution plus efficace (bien que théoriquement plus complexe) peut être possible en utilisant intelligemment l'objet WP_Query , mais je pense que la solution que vous recherchez (ou que vous supposez recherchée - vous n'avez jamais réellement posé de question; )) ressemblerait à quelque chose du genre

$attachmentParentIds = getAttachmentParentIds( get_the_ID() );
foreach( $attachmentParentIds as $attParentId ) {
    $attachments = get_children( array('post_parent' => $attParentId, 'post_type' => 'attachment', 'post_mime_type' =>'image') );
    foreach ( $attachments as $attachment_id => $attachment ) {
        echo wp_get_attachment_image( $attachment_id, 'medium' );
    }
}

qui utilise une fonction comme

//Returns an array of post IDs containing attachments that should be displayed
//on the post indicated by the passed post ID.
function getAttachmentParentIds( $intPostId ) {
    $ids = array();

    //Figure out which posts contain attachments that need to be displayed for $intPostID

    //...

    return $ids; //return an array of IDs
}

en tant qu'espace réservé pour la logique qui détermine les publications qui contiennent des pièces jointes devant être affichées pour l'ID de publication passée. Je ne suis pas optimiste quant à l’ampleur de votre mise en œuvre ni à votre application. Je ne sais donc pas ce que les détails de cette logique peuvent impliquer pour votre projet.

0
bosco

La vraie solution serait la création d'une nouvelle "galerie" d'objets "réels" avec son propre identifiant.

Une galerie n'est rien d'autre qu'un tableau d'identifiants d'images, mais il serait plus facile à gérer:

  • Vous pouvez le créer directement à partir du Media Manager, de la même manière que vous créez les nouvelles "galeries" maintenant dans WP 3.5.x Au lieu de générer un shortcode comme ceci: [gallery ids = "xx, yy, zz "] il pourrait simplement créer une nouvelle" Galerie " avec son propre identifiant et l'appeler ainsi: [gallery galley_id =" 123 "]

  • Vous pouvez gérer vos objets "vraies galeries" sous des médias, dans une nouvelle section "Galeries"

  • Vous auriez un ensemble de fonctions pour gérer un tel objet. De cette manière, le problème de l'OP serait résolu simplement en transmettant l'identifiant gallery_id à utiliser dans le modèle attachment.php (ou un nouveau modèle gallery.php pouvant également être implémenté) à l'aide de la fonction correspondante.

  • Vous seriez capable de mélanger des images attachées à divers articles dans un objet de la galerie sans vous soucier de l'article original.

  • Vous pouvez ajouter plusieurs galeries à un message en un tour de main.

Si vous y réfléchissez, ce sont les galeries NextGen en un mot. Pas étonnant que les gens utilisent beaucoup ce plugin. Malheureusement, je ne pense pas qu'une fonctionnalité aussi importante devrait être reportée à un plugin, en particulier un assez lourd et lourd comme Nextgen, qui contient de nombreuses fonctionnalités superflues.

En ce sens, la logique du nouveau responsable des médias est un peu imparfaite, je pense. Cela suggère en quelque sorte que vous "créez" une nouvelle entité appelée galerie alors qu’elle ne fait que fusionner un tas d’id d’images pour vous.

Je comprends que vous ne verrez pas la faille si vous utilisez l’affichage du carrousel de Jetpack, car cela ne vous sortira pas de la page en cours et vous n’aurez pas besoin d’obtenir l’image liée à la galerie que vous avez créée. ".

Néanmoins, je pense qu'il existe un fossé dangereux entre l'interface utilisateur du nouveau responsable des médias et ce qu'elle fait réellement pour montrer une galerie.

0
CamilloMiller