it-swarm.com.de

Wie paginiere ich Anhänge in einer sekundären Abfrage als Galerie?

Ich habe diesen Code, der alle Bilder zeigt, die an meinen Beitragstyp angehängt sind. Gibt es eine Möglichkeit, diese zu paginieren? Ich habe 25 Bilder und ich möchte nicht so viel scrollen wie ich kann.

Code:

<div class="galleries ten columns">
<?php
    $attachments = get_posts( array( 
   'post_type' => 'attachment',
   'post_mime_type'=>'image',
   'posts_per_page' => -1,
   'post_status' => 'any',
   'post_parent' => $post->ID)
);
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
    $src = wp_get_attachment_image_src( $attachment->ID, full);     
    $html = '<a class="fancybox" href="'.$src[0].'">';
    $html .= wp_get_attachment_image( $attachment->ID, 'gallery-thumb') .'</a>';
    echo $html;
}
}
?>
</div>

Vielen Dank!

4
Cynthia Lara

Ich gehe davon aus, dass Sie so etwas wollen:

|---------------------|   
|       content       |  
|       (static)      |  
|---------------------|  
|       gallery       |  
|       (paged)       |  
|---------------------|  
|   << pagelinks >>   |  
|---------------------|  

In diesem Setup bleibt der Inhalt des Posts unverändert, scheint statisch zu sein, während die Galerie ausgelagert wird. Das bedeutet, Sie haben die Hauptabfrage, die Ihnen den Titel, den Inhalt usw. zeigt, und eine Nebenabfrage, die für die Anzeige der Galeriebilder zuständig ist. Die Seitenlinks auf dieser Seite sind mit der Sekundärschleife verbunden und führen dort das Paging durch. Um dies zu erreichen, empfehle ich die Verwendung von WP_Query anstelle von get_posts(), nicht nur, weil ich keine Lösung für letzteres im Sinn habe, sondern auch, weil ich denke, dass dies im Allgemeinen der bessere Ansatz ist. In einem ersten Schritt müssen Sie eine neue Abfragevariable einrichten, die für die Paginierung verwendet wird. Die Funktion add_gallery_query_var() geht in Ihren functions.php ein.

Code:

    add_filter('init', 'wpse124169_attachment_gallery_add_query_var');
    function wpse124169_attachment_gallery_add_query_var() {
        global $wp;
        $wp->add_query_var('gallery_page');
    }


Wenn Sie außerdem möchten, dass hübsche Permalinks mit der neuen Abfragevariablen funktionieren, müssen Sie eine neue Umschreiberegel implementieren. Fügen Sie dazu Ihrem functions.php Folgendes hinzu, wobei add_rewrite_tag und add_rewrite_rule verwendet werden.

Code:

    add_filter('init', 'wpse124169_attachment_gallery_add_rewrite_tag_rule');
    function wpse124169_attachment_gallery_add_rewrite_tag_rule() {
        add_rewrite_tag('%gallery_page%','([^&]+)');
        add_rewrite_rule('([^/]+)/gallery/image//?([0-9]{1,})/?$', 'index.php?name=$matches[1]&gallery_page=$matches[2]', 'top');
    }


Im nächsten Schritt erstellen Sie die Sekundärschleife für die Galerie. WP_Query wird dazu verwendet, zusätzlich paginate_links gibt uns die Möglichkeit, die Links zum Blättern durch die Galerie zu erstellen. Ich habe beschlossen, eine Funktion dafür zu erstellen, daher wird der folgende Code in den functions.php eingefügt.

Code:

function wpse124169_get_attachment_gallery() {
    global $post;
    $gallery_page = (get_query_var('gallery_page')) ? get_query_var('gallery_page') : 1;
    $args = array(
        'posts_per_page' => 1, 
        'orderby' => 'menu_order', 
        'order' => 'ASC', 
        'post_type' => 'attachment',
        'post_status' => 'inherit', 
        'post_mime_type' => 'image', 
        'post_parent' => $post->ID, 
        'paged' => $gallery_page
    ); 
    $gallery = new WP_Query($args);
        if ( $gallery->have_posts() ) :
            echo '<div class="my_cpt_gallery_paged">';
                    while ( $gallery->have_posts() ) : $gallery->the_post();
                        echo wp_get_attachment_image( $post->ID, 'medium' );
                    endwhile;
            echo '</div>';
            echo '<div class="my_cpt_gallery_paginate_links">';
                    if ( get_option('permalink_structure') ) {
                        $format = 'gallery/image/%#%';
                    } else {
                        $format = '&gallery_page=%#%';
                    }
                    $args = array(
                        'base' => get_permalink( $post->post_parent ) . '%_%',
                        'format' => $format,
                        'current' => $gallery_page,
                        'total' => $gallery->max_num_pages
                    );
                    echo paginate_links( $args );
                    wp_reset_postdata();
            echo '</div>';
        endif;
}


Wie Sie sehen, verwendet die sekundäre Abfrage ein zusätzliches Post-Objekt - $gallery - und die zuvor definierte Abfragevariable - gallery_page -, um eine ordnungsgemäße Paginierung zu ermöglichen. Letzteres wird zum Einrichten des Parameters format von paginate_links() verwendet. Wir sollten nicht vergessen, wp_reset_postdata() zurückzusetzen, um Probleme zu vermeiden. Dies ist natürlich nur die sekundäre Schleife, nicht die vollständige Vorlage.

Ich rufe die sekundäre Anhangsgalerie-Abfrage in meinem single.php nach der Hauptabfrage/Schleife über die Funktion wpse124169_get_attachment_gallery() auf. Befolgen Sie die obigen Schritte, um Ihre paginierte Anhangsgalerie einzurichten. Ich habe das getestet und es funktioniert für mich.




Nachstehend liste ich die wichtigsten Informationen und Quellen auf. Wenn Sie an weiteren Details interessiert sind, erhalten Sie mehr als nur den Anfang.

Information:

  1. WP_Query
  2. paginate_links
  3. Klasse WP/source/add_query_var
  4. API umschreiben
  5. add_rewrite_tag
  6. Add_rewrite_rule
  7. Mehrere WP_Query-Schleifen mit Paginierung
  8. Wie separate Paginierung für mehrere Schleifen zu erstellen?




Wahlweise:

Dadurch wird der Standardlink für das erste Bild geändert. Normalerweise ist es http://site.ext/?p=123 oder http://site.ext/post-name/, der übergeordnete Anhang-Permalink. Das ist in Ordnung, es zeigt Ihnen standardmäßig das erste Bild. Aber Wenn der Link für das erste Bild die Galerie-Abfragevariable in der URL darstellen soll, müssen Sie sich in paginate_links einbinden. Dies führt dazu, dass der Link wie folgt aufgebaut wird: http://site.ext/?p=123&gallery_page=1 oder http://site.ext/post-name/gallery/image/1. Dies gilt nur für die Navigation über den Link von paginate_links(), bei Aufruf des übergeordneten Posts wird nur der entsprechende übergeordnete Permalink angezeigt. Der Code würde auch in den functions.php gehen.

Code:

add_filter( 'paginate_links', 'wpse124169_attachment_gallery_first_image_link' );
function wpse124169_attachment_gallery_first_image_link( $link ) {
    global $post;
    if ( get_option('permalink_structure') ) {
        $gpg_num = substr( strrchr( $link, '/' ), 1 );
    } else {
        $gpg_plk = wp_parse_args($link);
        $gpg_num = $gpg_plk['gallery_page'];
    }
    if ( empty( $gpg_num ) ) {
        if ( get_option('permalink_structure') ) {
            $link = get_permalink( $post->post_parent ) . 'gallery/image/1';
        } else {
            $link = get_permalink( $post->post_parent ) . '&gallery_page=1';
        }
    }

    return $link;
}




Update:

Dies kann verwendet werden, um den Shortcode [gallery] zu ändern, wie hier gezeigt: Wie kann man den Shortcode von wordpress [gallery] paginieren? .

7
Nicolai