I'm trying to create my own custom fields meta box filled with just checkboxes in pages. I'm basing it off this tutorial here. I was able to get the original tutorial to work, but when I started to simplify it down just to saving a checkbox, it stopped working: the checkbox won't save the 'on' state when I update the page.

I'm sure this has something to do with the saving portion of the function. Anyone have any clues, tips, or hints? Thanks!

<?php function cd_meta_box_cb() { 
// Some settings first:
    global $post;
    $check = isset( $values['page_title_off'] ) ? esc_attr( $values['page_title_off'][0] ) : '';    
    // We'll use this nonce field later on when saving.
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
// Render the custom fields:
        <input type="checkbox" id="page_title_off" name="page_title_off" <?php checked( $check, 'on' ); ?> />
        <label for="page_title_off">Turn off page title</label>
<?php } ?>
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id )
    // Bail if we're doing an auto save
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    // if our nonce isn't there, or we can't verify it, bail
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
    // if our current user can't edit this post, bail
    if( !current_user_can( 'edit_post' ) ) return;
    // now we can actually save the data
    $allowed = array( 
        'a' => array( // on allow a tags
            'href' => array() // and those anchors can only have href attribute
    // Save
    if( isset( $_POST['page_title_off'] ) )
    update_post_meta( $post_id, 'page_title_off', $_POST['page_title_off'] );


I went through all this yesterday!

According to the codex there must be a post id given to current_user_can to check 'edit_post', so your capability check should be:

if( !current_user_can( 'edit_post', $post_id ) ) return;

Also, your final two lines should be more like this:

$chk = isset( $_REQUEST['page_title_off'] ) ? 'on' : 'off';  
update_post_meta( $post_id, 'page_title_off', $chk );  

This should turn the post meta on or off depending on whether the checkbox was ticked.

  • Ah, that makes sense! However, it's still not saving the check every update click. Do I have this right? jsfiddle.net/foomarks/mH2QT
    – Marc P
    Mar 26 '13 at 3:28
  • Change your $_POST to $_REQUEST: '$chk = isset( $_REQUEST['page_title_off'] ) ? 'on' : 'off';'
    – Bev
    Mar 26 '13 at 11:54
  • Thanks for that clue! But argh, still not working. I feel like I'm so close! I updated the code to your suggestion: jsfiddle.net/foomarks/mH2QT/1
    – Marc P
    Mar 26 '13 at 15:33
  • I would suggest adding some debug code to see if the save function is actually being called, and if so, what the values of all the variables are.
    – Bev
    Mar 26 '13 at 19:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.