As shown in other answers, the problem is that the register_meta_box_cb callback will only deal with the following:
Do remove_meta_box() and add_meta_box() in the callback.
save_post not considered in the callback and should be independent. This action occurs:
whenever a message or page is created or updated, which may be from the form of importing, publishing / editing a page, xmlrpc or e-mail
When you use a class to create a meta window, I would suggest wrapping everything inside it.
PS: check the comments and add the necessary checks inside the save_post .
<?php class MyEvents { public function __construct(){ add_action( 'init', array( $this, 'init' ) ); add_action( 'save_post', array( $this, 'save_post' ), 10, 2 ); // no need to change priority to 1 } public function init(){ $labels = array( 'name' => _x( 'Events', 'post type general name' ), 'singular_name' => _x( 'Event', 'post type singular name' ), 'menu_name' => _x( 'Events List', 'admin menu' ), 'name_admin_bar' => _x( 'Events List', 'add new on admin bar' ), 'add_new_item' => __( 'Add New Event' ), 'new_item' => __( 'New Event' ), 'edit_item' => __( 'Edit Event' ), 'view_item' => __( 'View Event' ), 'all_items' => __( 'All Events' ), 'search_items' => __( 'Search Events' ), 'not_found' => __( 'No Events found.' ), 'not_found_in_trash' => __( 'No Events found in Trash.' ) ); $args = array( 'labels' => $labels, 'description' => __( 'Create Events' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'event' ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => true, 'menu_position' => 6, 'register_meta_box_cb' => array( $this, 'add_metaboxes' ), 'menu_icon' => 'dashicons-calendar-alt', 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) ); register_post_type('events',$args); } public function add_metaboxes() { add_meta_box( 'wpt_events_date', 'Events Date', array( $this, 'the_metabox' ), 'events', 'side', 'high' ); } public function the_metabox( $post ) { // No need for "global $post", it passed as parameter wp_nonce_field( 'events_date_fromto', 'events_datefromto_nonce' ); $dates = get_post_meta( $post->ID, '_fisa_events_date', true); $from = $dates ? $dates[0] : false; $to = $dates ? $dates[1] : false; echo '<label for="_fisa_date_from">Date From</label>'; printf( '<input id="fisa-event-datefrom" type="text" name="_fisa_date_from" class="widefat" value="%s" />', $from ? $from : '' ); echo ''; echo '<br/><br/>'; echo '<label for="_fisa_date_to">Date To</label>'; printf( '<input id="fisa-event-dateto" type="text" name="_fisa_date_to" class="widefat" value="%s" />', $to ? $to : '' ); } public function save_post( $post_id, $post_object ) { // second parameter has useful info about current post /* BRUTE FORCE debug */ // wp_die( sprintf( '<pre>%s</pre>', print_r( $_POST, true ) ) ); /** * ADD SECURITY AND CONTENT CHECKS, omitted for brevity */ if( !empty( $_POST['_fisa_date_from'] ) ) { $events_date = array( sanitize_text_field( $_POST['_fisa_date_from']), sanitize_text_field($_POST['_fisa_date_to']) ); update_post_meta($post_id, '_fisa_events_date', $events_date); } } } new MyEvents();