Ankerlink an den Anfang der Seite
kermit 2285599 1920
Generic filters
Filter by Kategorien

Die Quelle für Beitragsbilder dieses Blogs ist Pixabay, eine Plattform für freie, handverlesene Bilder. Auch wenn laut Nutzungsbedingungen keine Pflicht besteht die Herkunft der Bilder zu nennen, liegt mir daran, auf Leistung der Entwickler und Fotografen hinzuweisen.

In der Beschreibung jedes Bildes von Pixabay ist daher die Bildquelle festgehalten. Die Bilder haben also etwas gemeinsam, das sich als Basis für ein Bildverzeichnis anbietet, das ist die Zeichenfolge pixabay im Bildbeschreibungsfeld. Es entspricht dem, was bei Beiträgen der Excerpt (Auszug) ist.

Schlüssel hierzu ist die außerhalb des Loops anwendbare Funktion get_post_field(), die den Inhalt eines beliebigen Feldes anhand der Angabe der Post-ID (resp. Attachment-ID, was technisch gesehen dasselbe ist), zurückgibt.

get_post_field( 'post_excerpt', $post_id, 'raw')

Die zweite Gemeinsamkeit ist, dass die Bilder ausschließlich als Beitragsbilder verwendet werden. Diese Information ist in der Tabelle prefix_postmeta untergebracht, und mit get_results() abfragbar.

Schritt eins: ermitteln der Attachment-IDs

function flxo_include() {

    global $wpdb;
    /* get all unique image-IDS that are post-thumbnails */
    $request = $wpdb->get_results ( "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id'" );
    $ids = array();
    foreach ( $request as $id ) {
        /* only add to array if pixabay source link in excerpt */ 
        if ( false === strpos( get_post_field( 'post_excerpt', $id->meta_value, 'raw' ), 'pixabay' ) ) continue;
        /* $request returns objects */
        $ids[] = $id->meta_value;
    }
    return $ids;

}

Das ist die Basis für den Query, mit dem die Bilder gelistet werden. Das Argument post__in berücksichtigt die Auswahl.

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'orderby' => 'post_date',
        'order' => 'desc',
        'post__in' => flxo_include(),
        'posts_per_page' => $atts['posts'],
        'paged' => $paged
   );

Beispielloop als Shortcode

function flxo_images_source( $atts ) {

    $atts = shortcode_atts( array(
        'cols' => '3',
        'posts' => '9',
        'size' => 'thumbnail'
    ), $atts );

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'orderby' => 'post_date',
        'order' => 'desc',
        'post__in' => flxo_include(),
        'posts_per_page' => $atts['posts'],
        'paged' => $paged
    );

    $output = '';

    $loop = new WP_Query( $args );

    if ( $loop->have_posts() ) : 

        $output .= '<div class="gallery images-list columns columns-'.absint($atts['cols']).' gallery-columns-'.absint($atts['cols']).' grid">';
        
        while ( $loop->have_posts() ) : $loop->the_post();

            $post = get_post( get_the_ID() );
            $output .= '<figure class="gallery-item">';
            $thumbnail =  wp_get_attachment_image_src( $post->ID, $atts['size'] );
            $output .= sprintf( '<div class="gallery-icon"><img src="%1$s" alt="%2$s" width="%3$s" height="%4$s" /></div>', esc_url($thumbnail[0]), $post->post_title, absint($thumbnail[1]), absint($thumbnail[2]) ); 
            $image =  wp_get_attachment_image_src( $post->ID, 'full' );
            $img_link = sprintf( '<a class="lightbox" href="%1$s">%2$s</a>', $image[0], __( '+' ) ); 
            $output .= sprintf( '<figcaption class="wp-image-caption">%1$s<br />%2$s</figcaption>', $img_link, $post->post_excerpt );
            $output .= '</figure>';

        endwhile;
        
        $output .= '</div>';

        if ( $loop->max_num_pages > 1 ) { 

            $output .= '<div class="navigation pagination">'; 
        
            $big = 999999999;

            $args = array(
                'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                'current' => max( 1, get_query_var('paged') ),
                'total' => $loop->max_num_pages
            );			
                        
            $output .= paginate_links($args);

            $output .= '</div>';
        }	

        $output .= '</div>';

        wp_reset_postdata();

    endif;

    return wp_kses_post($output);

} 

add_shortcode( 'flxo_imagelist', 'flxo_images_source' );

Hinweis: Die Pagination funktionierte so auf Anhieb auf einer Seite. Falls ein Shortcode dieser Art in einem Beitrag zum Einsatz kommen sollte, und die paginierten Links dann nicht wie erwartet erreichbar sind, hilft (wahrscheinlich) diese Maßnahme

Bitte das Kommentarfeld nicht für Supportanfragen nutzen; hier kann kein Support angeboten werden. Die Angabe von Name oder E-Mail-Adresse ist optional, ein Spitzname wäre trotzdem nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Name und E-Mail-Adresse (beides optional, da alle Kommentare moderiert werden) werden dauerhaft gespeichert. Über dieses Formular kann jeder Zeit die Löschung persönlicher Daten oder Kommentare angefordert werden; die Anfrage wird nicht veröffentlicht und nach der Bearbeitung gelöscht. IP-Adressen, die mit Kommentaren gespeichert werden, werden nach zwei Monaten automatisch gelöscht.