Based on your code, hope you have already register your CPT(custom post type) providing valid label & arguments with function:
register_post_type( 'freebie', $args );
Here is the complete code that, your custom meta box will be only visible to our “freebie” CPT with a input field to save demo url for this CPT posts. Add the below lines of code your functions.php
// Adding meta box for freebie custom post type
function demo_url_meta_box() {
add_meta_box(
'demo_url_meta_box',
__( 'Demo URL', '' ),
'demo_url_meta_box_callback',
'freebie',
'side',
'low'
);
}
add_action( 'add_meta_boxes_freebie', 'demo_url_meta_box' );
// Callback function of metabox
function demo_url_meta_box_callback( $post ) {
// Add a nonce field so we can check for it later.
wp_nonce_field( 'demo_url_nonce', 'demo_url_nonce' );
// postmeta key: _demo_url
$demo_url = get_post_meta( $post->ID, '_demo_url', true );
echo '<textarea style="width:100%" id="freebie-demo" name="freebie-demo">' . esc_attr( $demo_url ) . '</textarea>';
}
/**
* When the post is saved, saves our custom data.
*
* @param int $post_id
*/
function save_demo_url_meta_box_data( $post_id ) {
// Check if our nonce is set.
if ( ! isset( $_POST['demo_url_nonce'] ) ) {
return;
}
// Verify that the nonce is valid.
if ( ! wp_verify_nonce( $_POST['demo_url_nonce'], 'demo_url_nonce' ) ) {
return;
}
// If this is an autosave, our form has not been submitted, so we don't want to do anything.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Check the user's permissions.
if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return;
}
}
else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
}
/* OK, it's safe for us to save the data now. */
// Make sure that it is set.
if ( ! isset( $_POST['freebie-demo'] ) ) {
return;
}
// Sanitize user input.
$de_url = sanitize_text_field( $_POST['freebie-demo'] );
// Update the meta field in the database.
update_post_meta( $post_id, '_demo_url', $de_url );
}
// add meta box data when save_post is hooked
add_action( 'save_post', 'save_demo_url_meta_box_data' );
Hope this will help you !!!