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 );
}
});





