Set a Default Featured Image for WordPress Posts Automatically

The following code snippet adds an option to the Settings > Media page, allowing users to set a default featured image. When no featured image exists for a post, the default image is applied automatically.

// Go to Settings > Media after activating this snippet to set the default featured image.
add_action( 'admin_init', function() {
    register_setting( 'media', 'default_featured_image', 'absint' );
    add_settings_field(
        'default_featured_image',
        __( 'Default Featured Image', 'wpcode-snippet' ),
        function() {
            wp_enqueue_media();
            $image_id  = get_option( 'default_featured_image', 0 );
            $image_url = $image_id ? wp_get_attachment_url( $image_id ) : '';
            ?>
            <div>
                <img id="default-featured-image-preview" src="<?php echo esc_url( $image_url ); ?>" style="max-width: 150px; display: <?php echo $image_url ? 'block' : 'none'; ?>; margin-bottom: 10px;"/>
                <input type="hidden" id="default_featured_image" name="default_featured_image" value="<?php echo esc_attr( $image_id ); ?>"/>
                <button type="button" class="button" id="upload-default-featured-image"><?php esc_html_e( 'Choose Image', 'wpcode-snippet' ); ?></button>
                <button type="button" class="button" id="remove-default-featured-image"><?php esc_html_e( 'Remove Image', 'wpcode-snippet' ); ?></button>
            </div>
            <script>
                jQuery( document ).ready( function ( $ ) {
                    var removeButton = $( '#remove-default-featured-image' );
                    var frame;
                    $( '#upload-default-featured-image' ).on( 'click', function ( event ) {
                        event.preventDefault();
                        if ( frame ) {
                            frame.open();
                            return;
                        }
                        frame = wp.media( {
                            title: '<?php echo esc_js( __( 'Select Default Featured Image', 'wpcode-snippet' ) ); ?>',
                            button: {
                                text: '<?php echo esc_js( __( 'Use this image', 'wpcode-snippet' ) ); ?>'
                            },
                            multiple: false
                        } );
                        frame.on( 'select', function () {
                            var attachment = frame.state().get( 'selection' ).first().toJSON();
                            $( '#default_featured_image' ).val( attachment.id );
                            $( '#default-featured-image-preview' ).attr( 'src', attachment.url ).show();
                            removeButton.show();
                        } );
                        frame.open();
                    } );
                    $( '#remove-default-featured-image' ).on( 'click', function () {
                        $( '#default_featured_image' ).val( '' );
                        $( '#default-featured-image-preview' ).hide();
                        removeButton.hide();
                    } );
                    if ( $( '#default_featured_image' ).val() === '0' ) {
                        removeButton.hide();
                    }
                } );
            </script>
            <?php
        },
        'media',
        'default',
        array( 'label_for' => 'default_featured_image' )
    );
});
add_filter( 'post_thumbnail_html', function( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( ! $html ) {
        $default_image_id = get_option( 'default_featured_image' );
        if ( $default_image_id ) {
            $image_url = wp_get_attachment_image_src( $default_image_id, $size );
            if ( $image_url ) {
                $html = '<img src="' . esc_url( $image_url[0] ) . '" class="attachment-' . esc_attr( $size ) . ' wp-post-image" alt="' . esc_attr( get_the_title( $post_id ) ) . '" />';
            }
        }
    }
    return $html;
}, 10, 5 );
add_action( 'save_post', function( $post_id ) {
    // Avoid auto-saving or revisions.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    if ( wp_is_post_revision( $post_id ) ) {
        return;
    }

    // Check if the post already has a featured image.
    if ( has_post_thumbnail( $post_id ) ) {
        return;
    }

    // Get the default featured image ID.
    $default_image_id = get_option( 'default_featured_image' );
    if ( $default_image_id ) {
        set_post_thumbnail( $post_id, $default_image_id );
    }
});