Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save a checkbox meta box in WordPress?

Tags:

php

wordpress

I'm trying to add a checkbox into my custom meta box in WordPress and I ran into a problem with saving it - whenever I check the checkbox and update the post/page, it comes back unchecked again.

Here's the code I'm using:

add_meta_box(
    'sl-meta-box-sidebar',      // id
    'Sidebar On/Off',           // title
    'sl_meta_box_sidebar',      // callback function
    'page',                     // type of write screen
    'side',                     // context
    'low'                       // priority
);

function sl_meta_box_sidebar() {
    global $meta; sl_post_meta( $post->ID ); ?>
    <input type="checkbox" name="sl_meta[sidebar]" value="<?php echo htmlspecialchars ($meta['sidebar']); ?>" />Check to turn the sidebar <strong>off</strong> on this page.
}

This creates the checkbox in the sidebar of the "Edit Page" screen, as it should, no problem there. I'm not sure what should I enter in the value of the checkbox, with text fields it obviously returns whatever was saved as meta information... I tried just using "checked" instead cause that would be my first guess (then simply check for the value when using this meta data), but it didn't save the checkbox either.

Here's the function that saves all the meta data, which I assume causes this problem:

function sl_save_meta_box( $post_id, $post ) {
    global $post, $type;

    $post = get_post( $post_id );

    if( !isset( $_POST[ "sl_meta" ] ) )
        return;

    if( $post->post_type == 'revision' )
        return;

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

    $meta = apply_filters( 'sl_post_meta', $_POST[ "sl_meta" ] );

    foreach( $meta as $key => $meta_box ) {
        $key = 'meta_' . $key;
        $curdata = $meta_box;
        $olddata = get_post_meta( $post_id, $key, true );

        if( $olddata == "" && $curdata != "" )
            add_post_meta( $post_id, $key, $curdata );
        elseif( $curdata != $olddata )
            update_post_meta( $post_id, $key, $curdata, $olddata );
        elseif( $curdata == "" )
            delete_post_meta( $post_id, $key );
    }

    do_action( 'sl_saved_meta', $post );
}

add_action( 'save_post', 'sl_save_meta_box', 1, 2 );

It works perfectly for text fields, but the checkbox just won't save. I'm not sure if the saving function is wrong, or am I missing something about the value of the checkbox.

Any help appreciated!

like image 914
Justine Avatar asked Sep 23 '11 08:09

Justine


People also ask

How do I create a custom meta box in WordPress?

Creating a Meta Box function custom_meta_box_markup() { } function add_custom_meta_box() { add_meta_box("demo-meta-box", "Custom Meta Box", "custom_meta_box_markup", "post", "side", "high", null); } add_action("add_meta_boxes", "add_custom_meta_box"); add_meta_box should be called inside add_meta_boxes hook.

How do I use meta box in WordPress?

It's very simple to install Meta Box. You need to access WordPress dashboard, go to Plugins and click on Add New button at the top of the page, then enter “Meta Box” into the search box. You continue to click Install and wait for the plugin to be downloaded. After that, the Activate button will appear.

How do I add a meta box to a custom post type?

To add a meta box to a number of post types screens – post , page and a book custom post type; create an array of the post types, iterate over the array and use add_meta_box() to add the meta box to them.


1 Answers

I had trouble with this previously and here is how I solved it.

First, creating the Checkbox.

<?php
function sl_meta_box_sidebar(){
    global $post;
    $custom = get_post_custom($post->ID);
    $sl_meta_box_sidebar = $custom["sl-meta-box-sidebar"][0]; 
?>

<input type="checkbox" name="sl-meta-box-sidebar" <?php if( $sl_meta_box_sidebar == true ) { ?>checked="checked"<?php } ?> />  Check the Box.
<?php } ?>

Next, saving.

<?php
add_action('save_post', 'save_details');

function save_details($post_ID = 0) {
    $post_ID = (int) $post_ID;
    $post_type = get_post_type( $post_ID );
    $post_status = get_post_status( $post_ID );

    if ($post_type) {
    update_post_meta($post_ID, "sl-meta-box-sidebar", $_POST["sl-meta-box-sidebar"]);
    }
   return $post_ID;
} ?>
like image 105
rmlumley Avatar answered Oct 14 '22 22:10

rmlumley