array ( array( '_name', 'Name:', 'text' ), ), You can leave the 'text' field off. It is the default. 'Name Box' => array ( array( '_name', 'Name:' ), ), */ // Edit this data structure to change the form in WordPress: $sp_boxes = array ( 'General Property Info' => array ( array( '_listing_price', 'Listing Price:' ), array( '_mls', 'MLS # (if any):' ), array( '_address', 'Address:' ), array( '_city', 'City:' ), array( '_state', 'State:' ), array( '_zip_code', 'Zip Code:' ), ), 'Property Details' => array ( array( '_square_feet', 'Square Feet:' ), array( '_bedrooms', 'Bedrooms:' ), array( '_basement', 'Basement (full, 1/2, finished, unfinished):' ), array( '_addtional_features', 'Additional Features:', 'textarea' ), ), 'Property Photos' => array ( array( '_photo_1_large', 'Photo #1 large URL:' ), array( '_photo_1_thumbnail', 'Photo #1 thumbnail URL:' ), array( '_photo_2_large', 'Photo #2 large URL:' ), array( '_photo_2_thumbnail', 'Photo #2 thumbnail URL:' ), array( '_photo_3_large', 'Photo #3 large URL:' ), array( '_photo_3_thumbnail', 'Photo #3 thumbnail URL:' ), array( '_photo_4_large', 'Photo #4 large URL:' ), array( '_photo_4_thumbnail', 'Photo #4 thumbnail URL:' ), array( '_photo_5_large', 'Photo #5 large URL:' ), array( '_photo_5_thumbnail', 'Photo #5 thumbnail URL:' ), array( '_photo_6_large', 'Photo #6 large URL:' ), array( '_photo_6_thumbnail', 'Photo #6 thumbnail URL:' ), ), ); // Do not edit past this point. // Use the admin_menu action to define the custom boxes add_action( 'admin_menu', 'sp_add_custom_box' ); // Use the save_post action to do something with the data entered // Save the custom fields add_action( 'save_post', 'sp_save_postdata', 1, 2 ); // Adds a custom section to the "advanced" Post and Page edit screens function sp_add_custom_box() { global $sp_boxes; if ( function_exists( 'add_meta_box' ) ) { foreach ( array_keys( $sp_boxes ) as $box_name ) { add_meta_box( $box_name, __( $box_name, 'sp' ), 'sp_post_custom_box', 'post', 'normal', 'high' ); } } } function sp_post_custom_box ( $obj, $box ) { global $sp_boxes; static $sp_nonce_flag = false; // Run once if ( ! $sp_nonce_flag ) { echo_sp_nonce(); $sp_nonce_flag = true; } // Genrate box contents foreach ( $sp_boxes[$box['id']] as $sp_box ) { echo field_html( $sp_box ); } } function field_html ( $args ) { switch ( $args[2] ) { case 'textarea': return text_area( $args ); case 'checkbox': // To Do case 'radio': // To Do case 'text': default: return text_field( $args ); } } function text_field ( $args ) { global $post; // adjust data $args[2] = get_post_meta($post->ID, $args[0], true); $args[1] = __($args[1], 'sp' ); $label_format = '
' . '

'; return vsprintf( $label_format, $args ); } function text_area ( $args ) { global $post; // adjust data $args[2] = get_post_meta($post->ID, $args[0], true); $args[1] = __($args[1], 'sp' ); $label_format = '
' . '

'; return vsprintf( $label_format, $args ); } /* When the post is saved, saves our custom data */ function sp_save_postdata($post_id, $post) { global $sp_boxes; // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( ! wp_verify_nonce( $_POST['sp_nonce_name'], plugin_basename(__FILE__) ) ) { return $post->ID; } // Is the user allowed to edit the post or page? if ( 'page' == $_POST['post_type'] ) { if ( ! current_user_can( 'edit_page', $post->ID )) return $post->ID; } else { if ( ! current_user_can( 'edit_post', $post->ID )) return $post->ID; } // OK, we're authenticated: we need to find and save the data // We'll put it into an array to make it easier to loop though. // The data is already in $sp_boxes, but we need to flatten it out. foreach ( $sp_boxes as $sp_box ) { foreach ( $sp_box as $sp_fields ) { $my_data[$sp_fields[0]] = $_POST[$sp_fields[0]]; } } // Add values of $my_data as custom fields // Let's cycle through the $my_data array! foreach ($my_data as $key => $value) { if ( 'revision' == $post->post_type ) { // don't store custom data twice return; } // if $value is an array, make it a CSV (unlikely) $value = implode(',', (array)$value); if ( get_post_meta($post->ID, $key, FALSE) ) { // Custom field has a value. update_post_meta($post->ID, $key, $value); } else { // Custom field does not have a value. add_post_meta($post->ID, $key, $value); } if (!$value) { // delete blanks delete_post_meta($post->ID, $key); } } } function echo_sp_nonce () { // Use nonce for verification ... ONLY USE ONCE! echo sprintf( '', 'sp_nonce_name', wp_create_nonce( plugin_basename(__FILE__) ) ); } // A simple function to get data stored in a custom field if ( !function_exists('get_custom_field') ) { function get_custom_field($field) { global $post; $custom_field = get_post_meta($post->ID, $field, true); echo $custom_field; } } ?>