The function get_post_thumbnail_id()
needs a value to be passed if using outside the wordpress loop. You forgot to pass it.
The code you’re using will create a new custom field on each update so here’s the modified code that’ll perform update_post_meta
function if that meta_key is already present in database.
The bellow code is tested on WordPress 3.4.1 with Twenty Ten theme installed
add_action('publish_page', 'add_custom_field_automatically');
add_action('publish_post', 'add_custom_field_automatically');
function add_custom_field_automatically($post_ID) {
global $wpdb;
$post_thumbnail_id = get_post_thumbnail_id( $post_ID );
$post_thumbnail_url = wp_get_attachment_url($post_thumbnail_id);
//to make sure if we already has set the value
$has_image = get_post_meta($post_ID, 'lead_image', true);
//will update instead of add if meta_key has value.
if ($has_image != '') {
add_post_meta($post_ID, 'lead_image', $post_thumbnail_url, true);
} else {
update_post_meta($post_ID, 'lead_image', $post_thumbnail_url, $has_image);
}
}