I've successfully applied a meta box and checkbox field that can save my settings. However, there is a bit of leftover code that seems to show up on my meta box field.

The checked='checked' shows up correctly in the input checkbox, but it also appears again a standalone preceding the input tag, which I don't want. This is the output:

checked='checked'<input type="checkbox" id="my_meta_box_check1" name="my_meta_box_check1"  checked='checked' /><label for="my_meta_box_check1">Do not check this</label>

In my functions.php, I have used the echo output method along with concatenation:

/* Meta Box: Create container */
add_action( 'add_meta_boxes', 'my_meta_box_add' );
function my_meta_box_add() {
    add_meta_box( 'my-meta-box', 'Rockwood Options', 'my_meta_box_fields', 'page', 'side', 'high' );

/* Meta Box: Create individual fields */
function my_meta_box_fields($post) {
    $values = get_post_custom( $post->ID );
    $check = isset( $values['my_meta_box_check1'] ) ? esc_attr( $values['my_meta_box_check1'][0] ) : '';
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
    echo '<input type="checkbox" id="my_meta_box_check1" name="my_meta_box_check1" ' . checked( $check, "on" ) . ' />';
    echo '<label for="my_meta_box_check1">Do not check this</label>';

/* Meta Box: Save fields */
add_action( 'save_post', 'my_meta_box_save' );
function my_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', $post_id ) ) return;
    // This is purely my personal preference for saving check-boxes
    $chk = isset( $_POST['my_meta_box_check1'] ) && $_POST['my_meta_box_check1'] ? 'on' : 'off';
        update_post_meta( $post_id, 'my_meta_box_check1', $chk );

I suspect I'm applying the concatenation incorrectly. Anyone have any tips on this?


checked() will echo the result by default. That's the problem.

To concat, you need to disable echo functionality by specify third param to false:

echo '<input type="checkbox" id="my_meta_box_check1" name="my_meta_box_check1" ' . checked( $check, "on", false ) . '/>';
  • Excellent, that did it! Thanks for explaining checked()'s specification, very helpful! – Marc P Jun 10 '16 at 15:02

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.