Title: Multiple Custom Meta Boxes &amp; Fields
Last modified: August 22, 2016

---

# Multiple Custom Meta Boxes & Fields

 *  [tmw27529](https://wordpress.org/support/users/tmw27529/)
 * (@tmw27529)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/multiple-custom-meta-boxes-fields/)
 * I have a Custom Post Type that has multiple Custom Meta Boxes, each with multiple
   Custom Fields. The code is a bit overwhelming and I wondering if there might 
   be a better way to go about doing this.
 *     ```
       // Add the DATE OF BIRTH and DEATH DATE Meta Box
       function add_bldob_meta_box() {
           add_meta_box(
               'bldob_meta_box', // $id
               'Date of Birth and Death', // $title
               'show_bldob_meta_box', // $callback
               'obituaries', // $page
               'normal', // $context
               'default'); // $priority
       }
       add_action('add_meta_boxes', 'add_bldob_meta_box');
   
       // Field Array
       $prefix = 'bldob_';
       $bldob_meta_fields = array(
       	array(
           	'label' => 'Date of Birth',
           	'desc'  => '',
           	'id'    => $prefix.'bdate',
           	'type'  => 'date'
       	),
       	array(
           	'label' => 'Date of Death',
           	'desc'  => '',
           	'id'    => $prefix.'ddate',
           	'type'  => 'date'
       	)
       );
   
       function show_bldob_meta_box() {
       global $bldob_meta_fields, $post;
   
       // Use nonce for verification
       echo '<input type="hidden" name="bldob_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
   
           // Begin the field table and loop
           echo '<table class="form-table">';
           foreach ($bldob_meta_fields as $field) {
               // get value of this field if it exists for this post
               $meta = get_post_meta($post->ID, $field['id'], true);
               // begin a table row with
               echo '<tr>
                       <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
                       <td>';
                       switch($field['type']) {
                           // case items will go here
   
       					// Date of Birth
       					case 'date':
       						echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
       							<br /><span class="description">'.$field['desc'].'</span>';
       					break;
       					// Date od Death
       					case 'date':
       						echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
       							<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
                       } //end switch
               echo '</td></tr>';
           } // end foreach
           echo '</table>'; // end table
       }
   
       // Save the Data
       function save_bldob_meta($post_id) {
           global $bldob_meta_fields;
   
           // verify nonce
           if (!wp_verify_nonce($_POST['bldob_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;
           }
   
           // loop through fields and save the data
           foreach ($bldob_meta_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);
               }
           } // end foreach
       }
       add_action('save_post', 'save_bldob_meta');
   
       // Add the VISITATION Meta Box
       function add_blvis_meta_box() {
           add_meta_box(
               'blvis_meta_box', // $id
               'Visitation Information', // $title
               'show_blvis_meta_box', // $callback
               'obituaries', // $page
               'normal', // $context
               'default'); // $priority
       }
       add_action('add_meta_boxes', 'add_blvis_meta_box');
   
       // Field Array
       $prefix = 'blvis_';
       $blvis_meta_fields = array(
       	array(
           	'label' => 'Date',
           	'desc'  => '',
           	'id'    => $prefix.'date',
           	'type'  => 'date'
       	),
   
       	array(
               'label'=> 'Time',
               'desc'  => '',
               'id'    => $prefix.'time',
               'type'  => 'text'
           ),
   
       	array(
               'label'=> 'Location Name',
               'desc'  => '',
               'id'    => $prefix.'text',
               'type'  => 'text'
           ),
   
           array(
               'label'=> 'Location Address',
               'desc'  => '',
               'id'    => $prefix.'address',
               'type'  => 'textarea'
           ),
   
           array(
               'label'=> 'Details',
               'desc'  => '',
               'id'    => $prefix.'textarea',
               'type'  => 'textarea'
           )
       );
   
       function show_blvis_meta_box() {
       global $blvis_meta_fields, $post;
   
       // Use nonce for verification
       echo '<input type="hidden" name="blvis_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
   
           // Begin the field table and loop
           echo '<table class="form-table">';
           foreach ($blvis_meta_fields as $field) {
               // get value of this field if it exists for this post
               $meta = get_post_meta($post->ID, $field['id'], true);
               // begin a table row with
               echo '<tr>
                       <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
                       <td>';
                       switch($field['type']) {
                           // case items will go here
   
       					// Date
       					case 'date':
       						echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
       							<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// Time
                   		case "time":
           					echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// location name
       					case 'text':
           					echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// address
       					case 'address':
           					echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// details
       					case 'textarea':
           					echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
                       } //end switch
               echo '</td></tr>';
           } // end foreach
           echo '</table>'; // end table
       }
   
       // Save the Data
       function save_blvis_meta($post_id) {
           global $blvis_meta_fields;
   
           // verify nonce
           if (!wp_verify_nonce($_POST['blvis_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;
           }
   
           // loop through fields and save the data
           foreach ($blvis_meta_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);
               }
           } // end foreach
       }
       add_action('save_post', 'save_blvis_meta');
   
       // Add the SERVICE Meta Box
       function add_blser_meta_box() {
           add_meta_box(
               'blser_meta_box', // $id
               'Service Information', // $title
               'show_blser_meta_box', // $callback
               'obituaries', // $page
               'normal', // $context
               'default'); // $priority
       }
       add_action('add_meta_boxes', 'add_blser_meta_box');
   
       // Field Array
       $prefix = 'blser_';
       $blser_meta_fields = array(
       	array(
           	'label' => 'Date',
           	'desc'  => '',
           	'id'    => $prefix.'date',
       		'key' => 'servicedate',
           	'type'  => 'date'
       	),
   
       	array(
               'label'=> 'Time',
               'desc'  => '',
               'id'    => $prefix.'time',
               'type'  => 'text'
           ),
   
       	array(
               'label'=> 'Location Name',
               'desc'  => '',
               'id'    => $prefix.'text',
               'type'  => 'text'
           ),
   
           array(
               'label'=> 'Location Address',
               'desc'  => '',
               'id'    => $prefix.'address',
               'type'  => 'textarea'
           ),
   
           array(
               'label'=> 'Details',
               'desc'  => '',
               'id'    => $prefix.'textarea',
               'type'  => 'textarea'
           )
       );
   
       function show_blser_meta_box() {
       global $blser_meta_fields, $post;
   
       // Use nonce for verification
       echo '<input type="hidden" name="blser_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
   
           // Begin the field table and loop
           echo '<table class="form-table">';
           foreach ($blser_meta_fields as $field) {
               // get value of this field if it exists for this post
               $meta = get_post_meta($post->ID, $field['id'], true);
               // begin a table row with
               echo '<tr>
                       <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
                       <td>';
                       switch($field['type']) {
                           // case items will go here
   
       					// Date
       					case 'date':
       						echo '<input type="text" class="datepicker" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
       							<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// Time
                   		case "time":
           					echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// location name
       					case 'text':
           					echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// address
       					case 'address':
           					echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
       					// details
       					case 'textarea':
           					echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
               					<br /><span class="description">'.$field['desc'].'</span>';
       					break;
   
                       } //end switch
               echo '</td></tr>';
           } // end foreach
           echo '</table>'; // end table
       }
   
       // Save the Data
       function save_blser_meta($post_id) {
           global $blser_meta_fields;
   
           // verify nonce
           if (!wp_verify_nonce($_POST['blser_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;
           }
   
           // loop through fields and save the data
           foreach ($blser_meta_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);
               }
           } // end foreach
       }
       add_action('save_post', 'save_blser_meta');
       ```
   
 * [Here is a link to the site](http://www.bryan-leefuneralhome.com/obits/)
 * I want to make sure I am doing things the best efficient way. The site currently
   works great for the client but I really want to be able to showcase it as an 
   awesome custom WordPress solution (like in the WP community & with other developers).
   
   Any suggestions are greatly appreciated!

Viewing 2 replies - 1 through 2 (of 2 total)

 *  Moderator [bcworkz](https://wordpress.org/support/users/bcworkz/)
 * (@bcworkz)
 * [11 years, 2 months ago](https://wordpress.org/support/topic/multiple-custom-meta-boxes-fields/#post-5650515)
 * You’ve already done the important thing, structure the fields and use loops to
   manage the structure. Large amounts of disparate data often require a lot of 
   code to deal with it, it’s just the way it is.
 * If all the meta boxes always appear together, you could combine everything into
   one meta box that uses tabs to keep the various groups organized. It’s just as
   organized as separate boxes, but takes up less screen space. It should reduce
   you code volume at least by the extra code for multiple boxes.
 *  Thread Starter [tmw27529](https://wordpress.org/support/users/tmw27529/)
 * (@tmw27529)
 * [11 years, 1 month ago](https://wordpress.org/support/topic/multiple-custom-meta-boxes-fields/#post-5650855)
 * Thanks bcworkz for the input! I really appreciate it!

Viewing 2 replies - 1 through 2 (of 2 total)

The topic ‘Multiple Custom Meta Boxes & Fields’ is closed to new replies.

## Tags

 * [custom meta fields](https://wordpress.org/support/topic-tag/custom-meta-fields/)

 * In: [Hacks](https://wordpress.org/support/forum/plugins-and-hacks/hacks/)
 * 2 replies
 * 2 participants
 * Last reply from: [tmw27529](https://wordpress.org/support/users/tmw27529/)
 * Last activity: [11 years, 1 month ago](https://wordpress.org/support/topic/multiple-custom-meta-boxes-fields/#post-5650855)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
