web-dev-qa-db-fra.com

Comment obtenir des images de pièce jointe Page/Post Gallery dans l'ordre où elles sont définies dans le backend à l'aide de WP_Query ()?

J'essaie de récupérer toutes les images de la Gallery d'une page dans l'ordre dans lequel elles sont définies dans le backend.

Jusqu'à présent j'ai:

  $my_wp_query = new WP_Query();

  $all_wp_pages = $my_wp_query->query(
    array(
      'post_type' => 'attachment',
      'post_parent' => 54,  
      'post_mime_type' =>'image',
      'post_status' => 'inherit', 
      'posts_per_page' => '20' 
      'orderby' => 'menu_order',
      'order' => 'ASC'
    )
  );

  var_dump( $all_wp_pages );

Mais cela semble renvoyer toutes les images de pièces jointes dans l'ordre standard/par défaut plutôt que dans l'ordre dans lequel j'ai fait glisser les images dans l'interface de la galerie d'édition.

Je pense que cela est peut-être dû au fait que j'interroge toutes les images de pièce jointe de ma page plutôt que spécifiquement la Galerie, de sorte que les informations de tri de la galerie ne sont pas transmises au tableau renvoyé.

Quelqu'un peut-il me dire comment j'obtiens toutes les images de la galerie d'un certain identifiant de page dans l'ordre dans lequel elles sont définies dans le backend? Il n'y aura qu'une galerie par page si cela vous aide.

merci

4
Larry B

Lorsque vous créez une galerie via le gestionnaire de média 3.5, menu_order n'est plus utilisé pour enregistrer la commande des images, mais uniquement dans le shortcode que vous insérez lorsque vous cliquez sur le bouton Insert Gallery, via l'attribut ids=. Cela tient compte du fait que vous pouvez maintenant ajouter plusieurs galeries à une seule commande postérieure via menu_order ne fonctionnerait pas dans ce cas. Pour extraire ces identifiants, nous devrons utiliser un peu de regex afin de rechercher dans le contenu des posts pour les shortcodes gallery, puis les utiliser dans une requête post__in, qui peut désormais être facilement ordonnée par ces identifiants via la nouvelle valeur orderby new-in-3.5 post__in.

Si j’étais meilleur en regex, ce ne serait probablement pas si compliqué, mais hélas, j’en ai très peur, nous allons donc utiliser quelques fonctions natives WP et faire quelques backflips pour les extraire. les attributs. Cela fonctionnera pour une ou plusieurs galeries dans le contenu du post. Je viens de tester cela en le glissant dans la boucle d'un message, vous voudrez changer $post->post_content en quelque chose/n'importe où vous obtiendrez le contenu du message/de la page.

$pattern = get_shortcode_regex();

if( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
    && array_key_exists( 2, $matches )
    && in_array( 'gallery', $matches[2] ) ):

        $keys = array_keys( $matches[2], 'gallery' );

        foreach( $keys as $key ):
            $atts = shortcode_parse_atts( $matches[3][$key] );
                if( array_key_exists( 'ids', $atts ) ):

                    $images = new WP_Query(
                        array(
                            'post_type' => 'attachment',
                            'post_status' => 'inherit',
                            'post__in' => explode( ',', $atts['ids'] ),
                            'orderby' => 'post__in'
                        )
                    );

                    if( $images->have_posts() ):
                        // loop over returned images
                    endif;

                    wp_reset_query();

                endif;
        endforeach;

endif;
11
Milo

Vous avez raison.

Le menu_order n'est plus utilisé pour les médias dans la galerie. Malheureusement, il semble que la seule "source" de l'ordre de la galerie soit l'argument "ids" du shortcode de la galerie, qui est incorporé dans le contenu de la page/du message.

Vous ne savez pas trop si c'est par conception ou par inadvertance, mais cela pourrait être par conception, car vous pouvez désormais inclure un média dans une galerie même s'il n'est pas "attaché" à la page/à la publication. Dans tous les cas, voici la méthode que j'utilise pour récupérer les identifiants et obtenir les pièces jointes en fonction de l'ordre spécifié dans le shortcode.

La clé réside dans le fait que le paramètre "orderby" de l'appel à get_posts doit être "post__in". Il lui est donc demandé de procéder à l'aide de la commande post id spécifiée dans le paramètre "include". Voir ci-dessous.

// helper function to return first regex match
function get_match( $regex, $content ) {
    preg_match($regex, $content, $matches);
    return $matches[1];
} 

// Extract the shortcode arguments from the $page or $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));

// get the ids specified in the shortcode call
$ids = $shortcode_args["ids"];

// get the attachments specified in the "ids" shortcode argument
$attachments = get_posts(
    array(
        'include' => $ids, 
        'post_status' => 'inherit', 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image', 
        'order' => 'menu_order ID', 
        'orderby' => 'post__in', //required to order results based on order specified the "include" param
    )
);

Ce n’est pas idéal et ce serait bien si WP core stockait cette commande quelque part dans la base de données, mais cela fonctionnera jusqu’à ce que nous ayons une façon plus agréable de fonctionner.

J'espère que cela pourra aider!

3
anderly
$oImages = get_posts(
    array(
         'numberposts' => -1,
         'post_parent' => $post->ID,
         'post_status' => 'inherit',
         'post_type' => 'attachment',
         'post_mime_type' => 'image',
         'order' => 'ASC',
         'orderby' => 'menu_order'
         )
);

Cet extrait a toujours fonctionné pour moi.

0
Steve

Si vous cherchez toujours un moyen plus simple de le faire, vous pouvez utiliser le plugin attachments,

http://wordpress.org/plugins/attachments/

Il conserve la galerie séparée et ne met pas les codes courts de la galerie d’images dans le contenu des publications, vous offrant ainsi un maintien complet de l’affichage des images dans votre publication/page/publication personnalisée. Vous pouvez également changer l'ordre de vos images par un simple glisser-déposer.

voici un exemple de code sur la façon de récupérer les images de votre galerie,

<?php $attachments = new Attachments( 'attachments' ); /* pass the instance name */ ?>
<?php if( $attachments->exist() ) : ?>
  <h3>Attachments</h3>
  <p>Total Attachments: <?php echo $attachments->total(); ?></p>
  <ul>
    <?php while( $attachments->get() ) : ?>
      <li>
        ID: <?php echo $attachments->id(); ?><br />
        Type: <?php echo $attachments->type(); ?><br />
        Subtype: <?php echo $attachments->subtype(); ?><br />
        URL: <?php echo $attachments->url(); ?><br />
        Image: <?php echo $attachments->image( 'thumbnail' ); ?><br />
        Source: <?php echo $attachments->src( 'full' ); ?><br />
        Size: <?php echo $attachments->filesize(); ?><br />
        Title Field: <?php echo $attachments->field( 'title' ); ?><br />
        Caption Field: <?php echo $attachments->field( 'caption' ); ?>
      </li>
    <?php endwhile; ?>
  </ul>
<?php endif; ?> 
0
Rao