Search code examples
phpwordpresswordpress-themingwordpress-rest-api

Unable to Save custom meta box input data in WP


Hi I followed this yt tutorial and have tried making a custom input field for my custom post type 'Events'. I am able to render the meta box and the < input type="date" > but wp can't seem to save the date after updating the post. Im still pretty new to WP so I can't tell where I'm going wrong. Here's my code:

//custom fields meta box

function event_post_date_meta_box(){
    add_meta_box('event_date', 'Add Event Date', 'event_post_date_callback', 'event', 'normal', 'high');
}

function event_post_date_callback( $post ){
    wp_nonce_field('save_event_post_date', 'event_post_date_nonce');

    $value = get_post_meta($post->ID, '_event_post_date_value_key', true);

    echo '<lable for="event_post_post_date_field"> Event Date: </lable>';
    echo '<input type="date" id="event_post_post_date_field" name="event_post_post_date_field" value="'. esc_attr($value) .'" size="25" />';
}

add_action('add_meta_boxes','event_post_date_meta_box');

function event_post_date_save($post_id) {
    if( ! isset ($_POST['event_post_date_nonce'])){
        return;
    }

    if( ! wp_verify_nonce($POST['event_post_date_nonce'], 'event_post_date_save')) {
        return;
    }

    if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
        return;
    }

    if ( ! current_user_can('edit_post', $post_id)){
        return;
    }

    if( ! isset($_POST['event_post_post_date_field'])){
        return;
    }

    $event_date_data = $_POST['event_post_post_date_field'];

    update_post_meta( $post_id, '_event_post_date_value_key', $event_date_data );

}

add_action( 'save_post', 'event_post_date_save');


Solution

  • I can see some issues with the code

    wp_nonce_field('save_event_post_date', 'event_post_date_nonce');

    It will verify the nonce if( ! wp_verify_nonce($POST['event_post_date_nonce'], 'event_post_date_save'))

    'save_event_post_date' not equals 'event_post_date_save'

    1. Change wp_nonce_field('save_event_post_date', 'event_post_date_nonce'); to wp_nonce_field('event_post_date_save', 'event_post_date_nonce');

    2. Also here if( ! wp_verify_nonce($POST['event_post_date_nonce'], 'event_post_date_save')) the method $POST must be $_POST

    Here is your full code after fixes:

    //custom fields meta box
    function event_post_date_meta_box(){
        add_meta_box('event_date', 'Add Event Date', 'event_post_date_callback', 'event', 'normal', 'high');
    }
    
    function event_post_date_callback( $post ){
        wp_nonce_field('event_post_date_save', 'event_post_date_nonce');
    
        $value = get_post_meta($post->ID, '_event_post_date_value_key', true);
    
        echo '<lable for="event_post_post_date_field"> Event Date: </lable>';
        echo '<input type="date" id="event_post_post_date_field" name="event_post_post_date_field" value="'. esc_attr($value) .'" size="25" />';
    }
    
    add_action('add_meta_boxes','event_post_date_meta_box');
    
    function event_post_date_save($post_id) {
        if( ! isset ($_POST['event_post_date_nonce'])){
            return;
        }
    
        if( ! wp_verify_nonce($_POST['event_post_date_nonce'], 'event_post_date_save')) {
            return;
        }
    
        if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
            return;
        }
    
        if ( ! current_user_can('edit_post', $post_id)){
            return;
        }
    
        if( ! isset($_POST['event_post_post_date_field'])){
            return;
        }
    
        $event_date_data = $_POST['event_post_post_date_field'];
    
        update_post_meta( $post_id, '_event_post_date_value_key', $event_date_data );
    
    }
    
    add_action( 'save_post', 'event_post_date_save');