Neben Parametern für Größe und Attribute ist auch der HTML-Output eines Beitragsbildes überschreibbar – vorausgesetzt, man hat kein Theme installiert, das ihn bereits so überschreibt, dass es den entsprechenden Filter außer Kraft setzt (Hinweis: das kann auch nur dann der Fall sein, wenn man ein benutzerdefiniertes Format definiert hat, also ggf. zuerst Einstellungen prüfen). In diesem Fall wird das Beispiel nicht funktionieren.
Im Weiteren geht das Beispiel der Einfachheit halber davon aus, dass Advanced Custom Fields
aktiv ist.
Die Anforderung
Der Websiteinhaber wünschte sich für Archivansichten andere Vorschaubilder als jene, die in den Beiträgen selbst als Beitragsbilder verwendet werden.
Es braucht dafür zwei Dinge: den post_thumbnail_html
-Filter und die ID des Bildes das in den Archivansichten das Standard-Beitragsbild ersetzen soll.
Berücksichtigt
- Responsive Images
- Anwendung optional (wird kein Archivbild festgelegt, wird das Thumbnail-Format des Beitragsbilds verwendet).
Als benutzerdefiniertes Feld in Beiträgen einen Bild-Upload anlegen (hier archive_featured_image
benannt) und die Bild-ID zurückgeben lassen.
functions.php
/**
* Replace post thumbnail html on archive pages
*/
function mytheme_replace_post_thumbnail_html( $html, $post_id, $post_thumbnail_id ) {
if ( is_singular() ) return $html;
if ( 'post' != get_post_type( $post_id ) ) return $html;
$size = 'full';
$img = get_field( 'archive_featured_image', $post_id );
$post = get_post( $post_id );
/* Beitragsbild als Ersatzbild */
if ( !$img ) {
$img = $post_thumbnail_id ;
$size = 'thumbnail';
}
/* gar kein Bild? - Abbruch */
if ( empty( $img ) ) return $html;
$src = wp_get_attachment_image_src( $img, $size );
$srcset = wp_get_attachment_image_srcset( $img, $size );
$html = sprintf('<img src="%1$s" width="%2$s" height="%3$s" srcset="%4$s" alt="%5$s" />', $src[0], $src[1], $src[2], $srcset, ( !empty( $img->post_excerpt ) ? $img->post_excerpt : $post->post_title ) );
return $html;
}
add_filter('post_thumbnail_html', 'mytheme_replace_post_thumbnail_html', 14, 5);
Schreibe einen Kommentar