Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I want WordPress to return the first post image or a default image if no featured image has been set. My theme uses the_post_thumbnail many times, so I don't want to go through and change all references to a new function. I'd rather filter the core. Here's what I've added to 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;
    }
}

How do I hook this correctly?

share|improve this question
    
what exactly you want to do ? –  amit Aug 2 '12 at 10:43
    
Set priorty higher the 10 and the number of arguments Set to 3 –  Bainternet Aug 2 '12 at 10:59
    
I've clarified my ultimate goal and filled in the function thus far. –  Zade Aug 2 '12 at 12:22
add comment

2 Answers

up vote 0 down vote accepted

Figured it out:

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;
}
share|improve this answer
add comment

Actually there isn't the_post_thumbnail filter applied anywhere.

The one you could try to use and to modify content that goes to the_post_thumbnail function is the post_thumbnail_html filter what is called with the following arguments $html, $post_id, $post_thumbnail_id, $size, $attr.

share|improve this answer
    
Thanks for the guidance. I've changed the filter to reference post_thumbnail_html, thought I don't know if I'm hooking it in properly. I'll have more time to look at this after sleep... –  Zade Aug 2 '12 at 12:26
    
I think I'm in over my head...I notice return apply_filters( 'post_thumbnail_html', $html, $post_id, $post_thumbnail_id, $size, $attr ); within the get_the_post_thumbnail function in wp-includes/post-thumbnail-template.php, but I don't understand how to modify that using my code above...which now prevents the site from fully loading a page. If it's too complicated I'll just change my theme files one by one. –  Zade Aug 11 '12 at 6:37
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.