Coding | Queries | WordPress

WordPress Attachment-Query nach Vorkommen einer bestimmten Zeichenfolge im Excerpt

wertschätzung für pixabay

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 $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 (siehe Pagination am Anfang dieses Artikels).

weiter schmökern

Schreibe einen Kommentar

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden.

Deine E-Mail-Adresse wird nicht veröffentlicht.