Create & Save multiple Meta-boxes

I created a custom-post-type and multiple metaboxes which needs to be saved. I have a function that saves one metabox, but I can’t figure out how to reuse this function to save all the metaboxes.

add_action ("add_meta_boxes", "add_dedications_jh");

function add_dedications_jh() {
     add_meta_box('jh_dedicationDate', 'Enter Date', 'jh_dedicationDate', 'jh_dedications', 'side', 'default');
     add_meta_box('jh_dedicationName', 'Enter Name', 'jh_dedicationName', 'jh_dedications', 'normal', 'default');
     add_meta_box('jh_dedicationOccasion', 'Enter Occasion', 'jh_dedicationOccasion', 'jh_dedications', 'normal', 'default');
}

function jh_dedicationDate($object, $box) {
    wp_nonce_field( basename( __FILE__ ), 'dedicationDate_nonce' ); 
    ?>
    <input type="text" name="dedicationDate" value="<?php echo esc_attr( get_post_meta( $object->ID, 'dedicationDate', true) ); ?>" />
    <?php 
}

function jh_dedicationName ($object, $box) {
    wp_nonce_field( basename( __FILE__ ), 'dedicationName_nonce' ); 
    ?>
    <input type="text" size="60" name="dedicationName" value="<?php echo esc_attr( get_post_meta( $object->ID, 'dedicationName', true) ); ?>" /> 
    <?php
}

function jh_dedicationOccasion ($object, $box) {
    wp_nonce_field( basename( __FILE__ ), 'dedicationOccasion_nonce' ); 
    ?>
    <input type="text" size="60" name="jh_dedicationOccasion" value="<?php echo esc_attr( get_post_meta( $object->ID, 'dedicationOccasion', true) ); ?>" /> 
    <?php
}

add_action('save_post', 'jh_save_dedication', 10, 2);

function jh_save_dedication($post_id, $post) {
    /* Verify the nonce before proceeding. */
    if ( !isset( $_POST["dedicationDate_nonce"] ) || !wp_verify_nonce( $_POST["dedicationDate_nonce"], basename( __FILE__ ) ) )
        return $post_id;
    if ( !isset( $_POST["dedicationName_nonce"] ) || !wp_verify_nonce( $_POST["dedicationName_nonce"], basename( __FILE__ ) ) )
        return $post_id;
    if ( !isset( $_POST["dedicationOccasion_nonce"] ) || !wp_verify_nonce( $_POST["dedicationOccasion_nonce"], basename( __FILE__ ) ) )
        return $post_id;

    /* Get the post type object. */
    $post_type = get_post_type_object( $post->post_type );
    /* Check if the current user has permission to edit the post. */
    if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
        return $post_id;

    /* Get the posted data and sanitize it for use as an HTML class. */
    $new_meta_value = ( isset( $_POST['dedicationDate'] ) ? sanitize_html_class( $_POST['dedicationDate'] ) : '' );
    /* Get the meta key. */
    $meta_key = 'dedicationDate';
    /* Get the meta value of the custom field key. */
    $meta_value = get_post_meta( $post_id, $meta_key, true );
    /* If a new meta value was added and there was no previous value, add it. */
    if ( $new_meta_value && '' == $meta_value )
        add_post_meta( $post_id, $meta_key, $new_meta_value, true );
    /* If the new meta value does not match the old value, update it. */
    elseif ( $new_meta_value && $new_meta_value != $meta_value )
        update_post_meta( $post_id, $meta_key, $new_meta_value );
    /* If there is no new meta value but an old value exists, delete it. */
    elseif ( '' == $new_meta_value && $meta_value )
        delete_post_meta( $post_id, $meta_key, $meta_value );
}

Related posts

Leave a Reply

1 comment

  1. You have to repeat the last 9 lines of your code for the other 2 nonce fields. Consider the following function

    function wp64123_sanitize_save_meta($nonce_field){
    
        /* Get the posted data and sanitize it for use as an HTML class. */
        $new_meta_value = ( isset( $_POST[$nonce_field] ) ? sanitize_html_class( $_POST[$nonce_field] ) : '' );
    
        /* Get the meta key. */
        $meta_key = $nonce_field;
    
        /* Get the meta value of the custom field key. */
        $meta_value = get_post_meta( $post_id, $meta_key, true );
    
            /* If a new meta value was added and there was no previous value, add it. */
        if ( $new_meta_value && '' == $meta_value )
            add_post_meta( $post_id, $meta_key, $new_meta_value, true );
            /* If the new meta value does not match the old value, update it. */
        elseif ( $new_meta_value && $new_meta_value != $meta_value )
            update_post_meta( $post_id, $meta_key, $new_meta_value );
            /* If there is no new meta value but an old value exists, delete it. */
        elseif ( '' == $new_meta_value && $meta_value )
            delete_post_meta( $post_id, $meta_key, $meta_value );      
    }
    

    Now you have to call the above function for each nonce field.

    wp64123_sanitize_save_meta("dedicationDate");
    wp64123_sanitize_save_meta("dedicationName");
    wp64123_sanitize_save_meta("dedicationOccassion");
    

    If you are submitting and processing the form inside the WP administration area, then you can use check_admin_referer() instead of wp_verify_nonce()

    if ( !empty($_POST) && check_admin_referer('name_of_my_action','name_of_nonce_field') )
    {
        // process form data
    }   
    

    Read more at Codex
    http://codex.wordpress.org/Function_Reference/wp_nonce_field