This might be kind of simple, but I couldn't find a way to do so in the WP docs. My plugin currently uses custom fields for things I could just have radio buttons/check boxes for each post. How do I add a little section where I can have such options rather than custom fields?


Below is the example of a couple of checkboxes to set custom field values:

// register the meta box
add_action( 'add_meta_boxes', 'my_custom_field_checkboxes' );
function my_custom_field_checkboxes() {
        'my_meta_box_id',          // this is HTML id of the box on edit screen
        'My Plugin Checkboxes',    // title of the box
        'my_customfield_box_content',   // function to be called to display the checkboxes, see the function below
        'post',        // on which edit screen the box should appear
        'normal',      // part of page where the box should appear
        'default'      // priority of the box

// display the metabox
function my_customfield_box_content() {
    // nonce field for security check, you can have the same
    // nonce field for all your meta boxes of same plugin
    wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_nonce' );

    echo '<input type="checkbox" name="my_plugin_paid_content" value="1" /> Paid Content <br />';
    echo '<input type="checkbox" name="my_plugin_network_wide" value="1" /> Network wide';

// save data from checkboxes
add_action( 'save_post', 'my_custom_field_data' );
function my_custom_field_data($post_id) {

    // check if this isn't an auto save
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )

    // security check
    if ( !wp_verify_nonce( $_POST['mypluing_nonce'], plugin_basename( __FILE__ ) ) )

    // further checks if you like, 
    // for example particular user, role or maybe post type in case of custom post types

    // now store data in custom fields based on checkboxes selected
    if ( isset( $_POST['my_plugin_paid_content'] ) )
        update_post_meta( $post_id, 'my_plugin_paid_content', 1 );
        update_post_meta( $post_id, 'my_plugin_paid_content', 0 );

    if ( isset( $_POST['my_plugin_network_wide'] ) )
        update_post_meta( $post_id, 'my_plugin_network_wide', 1 );
        update_post_meta( $post_id, 'my_plugin_network_wide', 0 );

Following following hooks and functions are required for adding a meta box, see below references for more information about them:


  1. admin_init (action)
  2. save_post (action)
  3. add_meta_boxes (action) (you don't need admin_init in WordPress 3.0+)


  1. add_meta_box
  2. wp_verify_nonce
  • By the way - do you have a recommendation for API reference for WP? Their main docs I was looking at seem absurdly incomplete in the way of getting information about each action – Jon Phenow May 26 '11 at 14:54
  • Also having trouble getting the values to show their current value in the Edit Post page – Jon Phenow May 26 '11 at 16:48
  • Here's my current source. I apologize for it being bit clunky, I made a lot of changes at the coffee shop... and I'm new to WP plugin creation github.com/jphenow/WP-Difficulty-and-Platform/blob/experimental/… – Jon Phenow May 26 '11 at 16:55
  • 1
    The code on github looks fine to me, can't test it right now. For the API docs, you can use: adambrown.info/p/wp_hooks Or just put the action/filter name on google and you will find a pretty good tutorial about it. – Hameedullah Khan May 26 '11 at 17:32

This is call in the WordPress world a MetaBox you need to use add_meta_box() function to add your own.

there is a great tutorial and a PHP class you can use in your plugin at deluxeblogtips.com I would suggest you use that for a starting point which will make your life easier.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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