Wordpress - Is there a way to set default custom fields when creating a post?

The action hook save_post is called on save, but i don't know if you can add metadata at this time. But it should be possible to create/update your meta data after the post was saved with the action hook updated_post_meta.

EDIT

To pre-select some meta fields (custom fields) on the post creation screen, you have to add these meta values first with an empty value.

If you look at the post_custom_meta_box() function (which is the callback for the used metabox postcustom) in the file wp-admin/includes/meta-boxes.php, you can see that the function is using list_meta() to create the pre-selected meta fields.

Now lets take a look at the program flow until this metabox is displayed (We're looking for a action/filter hook we can use here):

  1. WordPress loads the file post-new.php
  2. This file generates a default post in the database on line 39 with the function get_default_post_to_edit(). Thats nice. Basically the post is already in the database as an auto-draft. Unfortunately there isn't any hook at this time to alter these data or add something new.
  3. As a next step, the file edit-form-advaned.php is included. This file will generate the hole admin page and includes all required metaboxes based on the supports parameter of the post type.
  4. On line 136 the custom fields metabox postcustom is included and the above function is called. Again, no action hook which we could use.

Conclusion

I think the only way you can do is to use jQuery or overload the postcustom metabox and add the meta values before you run the list_meta() function.

E.g.

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

This is the proper method to add custom fields support (you don't get the blank fields when edit posts)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

I'm looking to have a unique meta description for each custom post on a WP site I'm developing. So I was also looking for a default custom field and landed here.

I know this is a pretty old post, but I thought I'd post the simple answer I found at mariokostelac.com.

kg is my namespace, you can name the function what you like. I'm pretty new to hooks and WP customizing in general, but I believe wp_insert_post is the hook you're looking for.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}