How to use default image as featured image by implement some code in function.php

To make your existing code work you’ll also need to override has_post_thumbnail:

add_filter( 'has_post_thumbnail', '__return_true' );

since your theme is probably guarding get_the_post_thumbnail() with has_post_thumbnail(), so that now needs to return true in the default case.


However there’s still a chance that this won’t work, if the theme you’re using goes directly to get_post_thumbnail_id(). To make that work, you’ll need to have an ID for your image: either

  1. upload the image to the media library

  2. pick an out-of-range ID, e.g. -123, to be the thumbnail attachment ID and then fake the image by hooking image_downsize (I think!)

    function image_downsize_default_thumbnail( $downsize, $id, $size )
    {
        if ( $id == -123 )
        {
            return array(
                'https://upload.wikimedia.org/wikipedia/commons/f/f9/Google_Lens_-_new_logo.png',
                1024, 1024, false );
        }
        return $downsize;
    }
    

and then add a default_post_metadata hook to fill in the missing thumbnail ID when absent, which is the postmeta key _thumbnail_id:

function default_post_metadata__thumbnail_id( $value, $object_id, $meta_key,
                                              $single, $meta_type )
{
    if ( '_thumbnail_id' == $meta_key )
    {
        $value = -123; // the attachment ID for the default image
    }
    return $value;
}
add_filter( 'default_post_metadata', 'default_post_metadata__thumbnail_id', 10, 5 );

(We can ignore $single as get_metadata_default() will wrap the value in an array if necessary, although get_post_thumbnail_id() passes $single = true anyway.)

With this filter you shouldn’t need to hook has_post_thumbnail and post_thumbnail_html, as it should pick up the default image as if it were the real thumbnail. You could look up the default ID from a post or from an option here too if you’d prefer rather than hard-coding it.