web-dev-qa-db-fra.com

Comment remplacer la balise de modèle the_post_thumbnail et afficher la première image à l'intérieur de la publication

Je souhaite que WordPress renvoie la première image de publication ou une image par défaut si aucune image sélectionnée n'a été définie. Mon thème utilise the_post_thumbnail plusieurs fois, aussi je ne souhaite pas modifier toutes les références à une nouvelle fonction. Je préfère filtrer le noyau. Voici ce que j'ai ajouté à functions.php:

add_filter('post_thumbnail_html', 'my_thumbnail_html', 10, 5);

function my_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    global $post, $posts;
    if (has_post_thumbnail() ) {
        echo get_the_post_thumbnail( null, $size, $attr );
    }
    else {
        $first_img = '';
        ob_start();
        ob_end_clean();
        $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
        $first_img = $matches [1] [0];
        if(empty($first_img)){
            $first_img = get_bloginfo("template_url") . '/images/default.gif';
        }
        return $first_img;
    }
}

Comment puis-je accrocher ceci correctement?

1
Zade

Deviner:

function get_attachment_id_from_src( $image_src ) {
    global $wpdb;
    $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
    $id = $wpdb->get_var($query);
    return $id;
}

add_filter( 'post_thumbnail_html', 'my_post_image_html', 10, 5 );

function my_post_image_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if( '' == $html ) {
        global $post, $posts;
        ob_start();
        ob_end_clean();
        $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
        $first_img = $matches [1] [0];
        if ( empty( $first_img ) ){
            $image_id = 129; // default image ID
        }
        else {
            $image_id = get_attachment_id_from_src($first_img);
        }
        $html = wp_get_attachment_image( $image_id, $size, false, $attr );
    }
    return $html;
}
1
Zade

En fait, aucun filtre the_post_thumbnail n'est appliqué nulle part.

Celui que vous pouvez essayer d’utiliser et de modifier le contenu qui passe à la fonction the_post_thumbnail est le filtre post_thumbnail_html appelé avec les arguments suivants $html, $post_id, $post_thumbnail_id, $size, $attr.

4
nvartolomei