it-swarm.com.de

Wie kann ich mit WP_Query () die Bilder von Page/Post Gallery-Anhängen in der Reihenfolge abrufen, in der sie im Backend festgelegt wurden?

Ich versuche, alle Bilder aus der Gallery einer Seite in der Reihenfolge abzurufen, in der sie im Backend festgelegt sind.

Bisher habe ich:

  $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 );

Dies scheint jedoch alle Anhangsbilder in der Standard-/Standardreihenfolge und nicht in der Reihenfolge zurückzugeben, in der ich die Bilder in die Back-End-Bearbeitungsgalerie gezogen und dort abgelegt habe.

Ich bin der Meinung, dass dies möglicherweise auf die Tatsache zurückzuführen ist, dass ich alle Anhangsbilder meiner Seite und nicht nur die Galerie abfrage. Daher werden die Sortierinformationen für die Galerie nicht im zurückgegebenen Array übergeben.

Kann mir jemand sagen, wie ich alle Galeriebilder einer bestimmten page_id in der Reihenfolge erhalte, in der sie im Backend festgelegt sind? Es wird nur eine Galerie pro Seite geben, wenn das hilft.

vielen Dank

4
Larry B

Wenn Sie eine Galerie über den 3.5-Medienmanager erstellen, wird menu_order nicht mehr zum Speichern der Reihenfolge der Bilder verwendet. Die Reihenfolge ist nur in dem Shortcode enthalten, den Sie beim Klicken auf die Schaltfläche Insert Gallery über das Attribut ids= einfügen. Dies soll der Tatsache Rechnung tragen, dass Sie jetzt mehrere Galerien zu einer einzelnen Nachbestellung über menu_order hinzufügen können, was in diesem Fall nicht funktioniert. Um diese IDs zu extrahieren, müssen wir mit ein wenig Regex nach gallery-Shortcodes suchen und diese IDs dann in einer post__in-Abfrage verwenden, die jetzt von diesen IDs bequem über den new-in-3.5 orderby-Wert bestellt werden kann post__in.

Wenn ich Regex besser beherrschen würde, wäre das wahrscheinlich nicht so kompliziert, aber leider bin ich schrecklich darin, also werden wir einige native WP -Funktionen verwenden und ein paar Backflips ausführen, um diese ID zu extrahieren Attribute. Dies funktioniert für eine oder mehrere Galerien im Beitragsinhalt. Ich habe dies gerade getestet, indem ich es in die Schleife eines Posts geworfen habe. Du solltest den $post->post_content in das ändern, von dem du den Inhalt des Posts/der Seite erhältst.

$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

Du hast Recht.

Die menu_order wird nicht mehr für Medien in der Galerie verwendet. Leider sieht es so aus, als ob die einzige "Quelle" der Galeriereihenfolge das Argument "ids" für den in den Seiten-/Beitragsinhalt eingebetteten Galerie-Shortcode ist.

Wir sind uns nicht sicher, ob dies beabsichtigt oder beabsichtigt ist, aber es könnte beabsichtigt sein, da Sie jetzt Medien in eine Galerie aufnehmen können, auch wenn sie nicht an die Seite/den Beitrag angehängt sind. In jedem Fall ist unten die Methode, die ich verwende, um die IDs zu erfassen und die Anhänge basierend auf der im Shortcode angegebenen Reihenfolge abzurufen.

Der Schlüssel ist, dass der Parameter "orderby" beim Aufruf von get_posts "post__in" sein muss. Dies weist ihn an, nach der Post-ID-Reihenfolge zu bestellen, die im Parameter "include" angegeben ist. Siehe unten.

// 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
    )
);

Dies ist nicht ideal und es wäre schön, wenn WP core diese Bestellung irgendwo in der Datenbank speichern würde, aber es funktioniert, bis wir eine bessere Möglichkeit haben.

Hoffentlich hilft das!

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'
         )
);

Dieser Ausschnitt hat immer für mich gearbeitet.

0
Steve

Wenn Sie immer noch nach einer einfacheren Möglichkeit suchen, können Sie das Attachments-Plugin verwenden.

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

Es hält die Galerie getrennt und fügt die Shortcodes der Bildergalerie nicht in den Inhalt des Beitrags ein, sodass Sie die Anzeige der Bilder in Ihrem Beitrag/Ihrer Seite/Ihrem benutzerdefinierten Beitrag uneingeschränkt steuern können. Sie können die Reihenfolge Ihrer Bilder auch durch einfaches Ziehen und Ablegen ändern

hier ist ein Beispielcode, wie Sie Ihre Galeriebilder abrufen können.

<?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