webentwicklung-frage-antwort-db.com.de

the_post_thumbnail Fallback mit Hooks

Ich verwende dieses große Thema, das sich fast ausschließlich auf Widgets und Schieberegler stützt. Jetzt versuche ich zu vermeiden, in allen enthaltenen Dateien nach post_thumbnail-Ausgabecode zu suchen, um einen Fallback zu erzielen, der dann das erste Bild im Post oder zuletzt das Standardbild anzeigen sollte.

Gibt es eine Möglichkeit, dies über die Datei functions zu steuern?

Jede Hilfe dankbar.

Lösung basierend auf post_thumbnail_htmlfilter hook zeigt kein Bild an, wenn es nicht explizit festgelegt ist:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        $image = get_children( "post_parent={$post_id}&post_type=attachment&post_mime_type=image&numberposts=1" );
        if($image){
                foreach ($image as $attachment_id => $attachment) {
                        $src = wp_get_attachment_image_src($attachment_id);
                 return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,$src[0]
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
            }
         } 
         else {
               return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,get_template_directory_uri().'/images/featured/featured.jpg'
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
         }  
    } 
        return $html;
}

Eine andere Lösung, die ich in diesem Artikel gefunden habe und die auf einem anderen action hooks basiert, macht das, was beabsichtigt ist, und zeigt (setzt) ​​das erste Bild im Anhang als Feature an oder im letzten Fall zeigt (setzt) ​​das Standardbild als Beitrag an Empfohlenes Bild:

function autoset_featured() {
          global $post;
          $already_has_thumb = has_post_thumbnail($post->ID);
              if (!$already_has_thumb)  {
              $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                          if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                set_post_thumbnail($post->ID, $attachment_id);
                                }
                           } else {
                                set_post_thumbnail($post->ID, '414');
                           }
                        }
      }  //end function
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

Nun ... ich mag diese post_thumbnail_htmlfilter hook Lösung und bin fasziniert davon, dass sie nicht funktioniert.

Jede Hilfe dankbar.

2
daniel.tosaba

sie können den Filter-Hook post_thumbnail_html verwenden, der Ihrer Hook-Funktion 5 Variablen übergibt:

  • $html - das Ausgabe-HTML des Post-Thumbnails
  • $post_id - die Post-ID.
  • $post_thumbnail_id - die Anhangs-ID des Bildes
  • $size - die gewünschte Größe oder Standardgröße
  • $attr - Abfragezeichenfolge oder Array von Attributen.

Also so etwas wie:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        // return you fallback image either from post of default as html img tag.
    }
    return $html;
}
5
Bainternet

Als Ergänzung zu @Bainternet-Antwort:

Rufen Sie die eingestellte Größe aus der Optionstabelle ab. Dies bedeutet, dass das zurückgegebene Bild mit allen Benutzereinstellungen übereinstimmt. Ruft das Standard-Miniaturbild nur aus dem Verzeichnis template auf, um Fälle zu umgehen, in denen untergeordnete Themen vorhanden sind und das Miniaturbild nicht vorhanden ist.

/**
 * Default post thumbnail image.
 * 
 * @param  string $html The Output HTML of the post thumbnail
 * @param  int $post_id The post ID
 * @param  int $post_thumbnail_id The attachment id of the image
 * @param  string $size The size requested or default
 * @param  mixed string/array $attr Query string or array of attributes
 * @return string $html the Output HTML of the post thumbnail
 */
function wpse64763_post_thumbnail_fb( $html, $post_id, $post_thumbnail_id, $size, $attr )
{
    if ( empty( $html ) )
    {
        return sprintf(
            '<img src="%s" height="%s" width="%s" />',
            get_template_directory_uri().'/path/to/default-thumb.png',
            get_option( 'thumbnail_size_w' ),
            get_option( 'thumbnail_size_h' )
        );
    }

    return $html;
}
add_filter( 'post_thumbnail_html', 'wpse64763_post_thumbnail_fb', 20, 5 );
3
kaiser

Los geht's, einfach getestet und für mich funktioniert das prima;)

    add_filter( 'post_thumbnail_html', 'wc_post_thumbnail_fallback', 20, 5 );
function wc_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
   if ($html) {
        return $html;
    }else {
        $args = array(
            'numberposts' => 1,
            'order' => 'ASC',
            'post_mime_type' => 'image',
            'post_parent' => $post_id,
            'post_status' => null,
            'post_type' => 'attachment',
        );

        $images = get_children($args);

        if ($images) {
            foreach ($images as $image) {
                return wp_get_attachment_image($image->ID, $size);
            }
        }else{
            printf('<img src="%s" height="%s" width="%s" />'
                ,get_template_directory_uri().'/images/featured/featured.jpg'
                ,get_option( 'thumbnail_size_w' )
                ,get_option( 'thumbnail_size_h' ));
        }

    }
}
0
WebCaos