You are using checkfield_<?php echo $page->ID; ?>
as name for your input fields, then trying to save $_POST['checkfield']
which is not set.
You can do the same $pages
loop on the myplugin_meta_save()
function and then save the data for each page as separate meta_key
input (checkfield_1
, checkfield_5
, etc), OR you can save all that data in a single meta_key
which is checkfield
in this case, and a little tweak to your code is needed to achieve that:
function myplugin_inner_custom_box( $post ) {
// we store data as an array, we need to unserialize it
$checkfield = maybe_unserialize( get_post_meta($post->ID, "checkfield", true) );
// Nonce to verify intention later
wp_nonce_field( 'save_quote_meta', 'custom_nonce' );
$pages = get_pages();
foreach ( $pages as $page ) { ?>
<input id="page_<?php echo $page->ID; ?>" type="checkbox" name="checkfield[]" value="<?php echo $page->ID; ?>" <?php if ( in_array($page->ID, (array) $checkfield) ) { ?> checked <?php } ?>/> <label for="page_<?php echo $page->ID; ?>"><?php echo $page->post_title; ?></label> <br>
<?php
}
}
//save the meta box action
add_action( 'save_post', 'myplugin_meta_save', 10, 2 );
//save the meta box
function myplugin_meta_save($post_id, $post)
{
if ( isset($_POST['checkfield']) ) { // if we get new data
update_post_meta($post_id, "checkfield", $_POST['checkfield'] );
}
}
Note that name="checkfield"
in the input field is replaced with name="checkfield[]"
which will make data stored as an array in $_POST['checkfield']
variable. Also the value
attribute is changed from yes
to $page->ID
.
Update: Cast checkfield
to array
: if ( in_array($page->ID, (array) $checkfield) )