WordPress Attachment-Query nach Vorkommen einer bestimmten Zeichenfolge im Excerpt

wertschätzung für pixabay
Bildquelle: Pixabay, Alexas_Fotos

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 Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

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

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable