Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

When I'm creating a new post, just after clicking "Add New", when the post editor shows, instead of having to use the dropdown and choose a custom field to use, I'd like to have some default custom field inputs already openend.

Visually, instead of :

enter image description here

I'd like to have something like :

enter image description here

I know there are plugins for that (CPT, More fields, etc.) but I'd like a simple way to do it with a basic function.

I tried something like this (I'm using a custom post type 'product' ) :

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

But that doesn't seem to work. I think that the hook is probably wrong (because edit_post comes after an update), but I don't see any hook for "new post" (right after user clicks on "new post" in wp admin). Is there any ?

Or maybe the whole idea is wrong and there's another way?

share|improve this question
add comment

4 Answers 4

up vote 4 down vote accepted

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()
}
share|improve this answer
    
The thing is I'm not trying to add anything on save for now, I'm trying to show some custom field inputs already opened when the user arrvies on the editing page (see updates with screenshots) –  mike23 Sep 25 '11 at 13:19
    
Ah. Now I understand your problem. I've edited my answer. –  rofflox Sep 25 '11 at 16:41
    
Thanks Roman, that did put me on the right track ! –  mike23 Oct 5 '11 at 7:42
add comment

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');
share|improve this answer
add comment

You should use the save_post action and isolate your operation by checking the post type as this runs on all post types. There is obviously some more logic you will have to build into this to make it work for you. You should probably set a post meta field that checks if you've set the defaults once so your users won't be frustrated if they wish to leave a post meta field blank.

If you wish the defaults to be null (as seen in your code example), then don't create a function because this just adds overhead and post meta fields are not populated with values by default.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
share|improve this answer
add comment

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;
}
share|improve this answer
    
FYI: There's get_post_type(). Also, when doing loose comparison, you should use YODA style condition syntax. –  kaiser Oct 4 '12 at 9:41
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.