1

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 );
}

1 Answer 1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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