Solution:
Here a sample of code I’ve used to add custom field in my custom post type. or you can use the plugin Advanced Custom Field to add custom field and attached them to your custom post type.
I hope this can help you !
<?php
// Metabox declaration
$prefix = 'bookmark_';
// The only way I found too pass the fields informations to the action
global $bookmark_meta_fields;
$bookmark_meta_fields = array(
array(
'label'=> 'Url',
'desc' => 'Url of the bookmark.',
'id' => $prefix.'url',
'type' => 'text'
),
array(
'label'=> 'Comments',
'desc' => 'A small comments about the bookmarks.',
'id' => $prefix.'comment',
'type' => 'textarea'
),
);
add_action('add_meta_boxes', 'vban_bookmark_metabox');
function vban_bookmark_metabox() {
add_meta_box(
'bookmark_info', // $id
'Bookmark info', // $title
'vban_bookmark_metabox_show', // $callback
'vbanBookmarks', // $page
'normal', // $context
'high'); // $priority
}
/*
* show metabox function
*/
function vban_bookmark_metabox_show() {
global $bookmark_meta_fields, $post;
// Use nonce for verification
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
// Begin the field table and loop
echo '<table class="form-table">';
foreach ($bookmark_meta_fields as $field) {
// get value of this field if it exists for this post
$meta = get_post_meta($post->ID, $field['id'], true);
// begin a table row with
echo '<tr>
<th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
<td>';
switch($field['type']) {
case 'text':
echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
<br /><span class="description">'.$field['desc'].'</span>';
// textarea
break;
case 'textarea':
echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
<br /><span class="description">'.$field['desc'].'</span>';
break;
} //end switch
echo '</td></tr>';
} // end foreach
echo '</table>'; // end table
}
/*
* SAVE metabox custom_field
*/
add_action('save_post', 'vban_bookmark_metabox_save');
// Save the Data
function vban_bookmark_metabox_save($post_id) {
global $bookmark_meta_fields;
// verify nonce
if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) {
return $post_id;
}
// check autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
return $post_id;
}
// check permissions
if ('vbanBookmarks' == $_POST['post_type']) {
if (!current_user_can('edit_bookmark', $post_id))
return $post_id;
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
// loop through fields and save the data
foreach ($bookmark_meta_fields as $field) {
$old = get_post_meta($post_id, $field['id'], true);
$new = $_POST[$field['id']];
if ($new && $new != $old) {
update_post_meta($post_id, $field['id'], $new);
} elseif ('' == $new && $old) {
delete_post_meta($post_id, $field['id'], $old);
}
} // end foreach
}
?>