Saving metadata of messages that do not save data

I created a custom post type with metabox date and date.

Creating a custom post type with add_events_metaboxes

 function event_list_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' => 'add_events_metaboxes', 'menu_icon' => 'dashicons-calendar-alt', 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) ); register_post_type('events',$args); } add_action('init','event_list_init'); 

here is a callback function that instantiates a class to create a metabox and save message data through the save_post action save_post

 function add_events_metaboxes(){ new eventsListMetaBox(); } class eventsListMetaBox{ /* * Constructor that creates the meta box */ public function __construct(){ /** * Render and Add form meta box */ add_meta_box('wpt_events_date', 'Events Date', array($this, 'fisa_events_date'), 'events', 'side', 'high'); /** * Save Date from and to as meta key */ add_action('save_post',array($this, 'fisa_events_date_save'),1,2); } /** * Render Form for Events date */ function fisa_events_date() { global $post; // Add an nonce field so we can check for it later. wp_nonce_field( 'events_date_fromto', 'events_datefromto_nonce' ); // Echo out the field echo '<label for="_fisa_date_from">Date From</label>'; echo '<input id="fisa-event-datefrom" type="text" name="_fisa_date_from" class="widefat" />'; echo '<br/><br/>'; echo '<label for="_fisa_date_to">Date To</label>'; echo '<input id="fisa-event-dateto" type="text" name="_fisa_date_to" class="widefat" />'; } /** * Meta key actual database insertion */ function fisa_events_date_save($post_id){ /** * Check if nonce is not set */ // if (!isset($_POST['events_datefromto_nonce'])) // return $post_id; // // $nonce = $_POST['events_datefromto_nonce']; // /** // * Verify that the request came from our screen with the proper authorization // */ // if(!wp_verify_nonce($nonce,'events_date_fromto')) // return $post_id; // // //Check the user permission // // if(!current_user_can('edit_post',$post_id) ) // return $post_id; //Prepare and sanitize the data before saving it $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); } } 

My problem is that I can’t see the _fisa_events_date meta key in the wordpress.Can table, can anyone indicate what I missed, or what should I do to save it?

+6
source share
4 answers

You rely on register_meta_box_cb to display your meta box and move the save logic to save_post . The problem is that Wordpress only starts register_meta_box_cb (which connects to add_meta_boxes ) only when it is necessary to display exchangers - that is, when visiting edit pages or adding posts. But when Wordpress saves messages, it doesn't need to display exchanges, so register_meta_box_cb , add_events_metaboxes and your save_post trick save_post never called.

The simplest solution is to remove your register_meta_box_cb argument and bind your add_events_metaboxes function to the add_events_metaboxes event.

 add_action('admin_init', 'add_events_metaboxes'); 

You can do this right under the hook add_action('init', 'event_list_init') .

Find a gist here .

+5
source

According to the Wordpress documentation , register_meta_box_cb :

will be called when setting up meta-fields for the editing form.

Which is too late to connect to save_post .

Therefore, I suggest that you separately connect to save_post somewhere in the functions.php file:

Message Type Registration

 $args = array( .... 'register_meta_box_cb' => 'add_events_metaboxes', .... ); register_post_type( 'events', $args ); 

Display metabox

 function add_events_metaboxes(){ new eventsListMetaBox(); } class eventsListMetaBox{ public function __construct(){ add_meta_box('wpt_events_date', 'Events Date', array($this, 'fisa_events_date'), 'events', 'side', 'high'); } function fisa_events_date() { ... } } 

Metabolism Preservation

 add_action( 'save_post', 'fisa_events_date_save' ); function fisa_events_date_save(){ global $post; $post_id = $post->ID; // Use wp_verify_nonce and other checks to verify everything is right $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); } 

Please keep in mind that Wordpress is not designed to work fully with Object-Oriented, so there may be problems using the connectivity system with OOP concepts.

+2
source

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(); 
+1
source

The simplest and most flexible solution is to use advanced custom fields.

0
source

All Articles