$meta_box = array( 'id' => 'wsk-recipe-details', 'title' => 'Recipe Details Box', 'page' => 'recipe', 'context' => 'normal', 'priority' => 'high', 'fields' => array( array( 'name' => 'Recipe Title', 'desc' => 'Enter Recipe Title', 'id' => '_recipetitle', 'type' => 'text', 'std' => '' ), array( 'name' => 'Ingredients', 'desc' => 'One ingredient per line, outputs as unordered list', 'id' => '_recipeingred', 'type' => 'textarea', 'std' => '' ), array( 'name' => 'Instructions', 'desc' => 'List instructions, one instruction per line, outputs as ordered list', 'id' => '_recipeinstructions', 'type' => 'textarea', 'std' => '' ), array( 'name' => 'Variations', 'desc' => 'List variations, one per line, outputs as unordered list', 'id' => '_recipevariations', 'type' => 'textarea', 'std' => '' ), array( 'name' => 'Quick Notes', 'desc' => 'List any notes ... paragraphs OK', 'id' => '_recipenotes', 'type' => 'textarea', 'std' => '' ), array( 'name' => 'Preparation Time', 'desc' => 'Enter Prep Time', 'id' => '_recipeprep', 'type' => 'text', 'std' => '' ), array( 'name' => 'Cooking Time', 'desc' => 'Enter Cooking Time', 'id' => '_recipecook', 'type' => 'text', 'std' => '' ), array( 'name' => 'Servings', 'desc' => 'Enter Servings Info', 'id' => '_recipeservings', 'type' => 'text', 'std' => '' ), array( 'name' => 'Calories', 'desc' => 'Enter Calories per Serving', 'id' => '_recipecalories', 'type' => 'text', 'std' => '' ), array( 'name' => 'Fat', 'desc' => 'Enter Fat Grams per Serving', 'id' => '_recipefat', 'type' => 'text', 'std' => '' ), array( 'name' => 'Protein', 'desc' => 'Enter Protein Grams per Serving', 'id' => '_recipeprotein', 'type' => 'text', 'std' => '' ), ) ); // Add Recipes Meta Boxes add_action('admin_menu', 'wsk_add_recipe_meta'); // Add meta box function wsk_add_recipe_meta() { global $meta_box; add_meta_box($meta_box['id'], $meta_box['title'], 'wsk_show_recipe_box', $meta_box['page'], $meta_box['context'], $meta_box['priority']); } // Callback function to show recipe fields in meta box - NEEDS TO MATCH FIELDS ABOVE function wsk_show_recipe_box() { global $meta_box, $post; // Use nonce for verification echo ''; echo ''; foreach ($meta_box['fields'] as $field) { // get current post meta data $meta = get_post_meta($post->ID, $field['id'], true); echo '', '', ''; } echo '
'; switch ($field['type']) { case 'text': echo '', '
', $field['desc']; break; case 'textarea': echo '', '
', $field['desc']; break; case 'select': //not currently used but available if needed echo ''; break; case 'radio': //not currently used but available if needed foreach ($field['options'] as $option) { echo '', $option['name']; } break; case 'checkbox': //not currently used but available if needed echo ''; break; } echo '
', '
'; } add_action('save_post', 'wsk_save_recipe_data'); // Save data from meta box function wsk_save_recipe_data($post_id) { global $meta_box; // verify nonce if (!wp_verify_nonce($_POST['wsk_recipe_meta_box_nonce'], basename(__FILE__))) { return $post_id; } // check autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } // check permissions if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) { return $post_id; } } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } foreach ($meta_box['fields'] as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } }