2011-09-23 7 views
10

Sto provando ad aggiungere una casella di controllo nella mia meta box personalizzata in WordPress e ho riscontrato un problema con il salvataggio - ogni volta che spunta la casella di controllo e aggiorno il post/pagina, viene nuovamente deselezionata.Come salvare una casella meta in WordPress?

Ecco il codice che sto utilizzando:

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. 
} 

questo crea la casella di controllo nella barra laterale della schermata "Modifica pagina", come dovrebbe, nessun problema. Non sono sicuro di cosa dovrei inserire nel valore della casella di controllo, con i campi di testo che ovviamente restituisce tutto ciò che è stato salvato come meta-informazione ... Ho provato solo a usare "checked", perché sarebbe la mia prima ipotesi (quindi controlla semplicemente per il valore quando si utilizzano questi metadati), ma non ha salvato neanche la casella di controllo.

Ecco la funzione che salva tutti i meta-dati, che presumo cause di questo problema:

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); 

Funziona perfettamente per i campi di testo, ma la casella di controllo solo non salverà. Non sono sicuro se la funzione di salvataggio è errata o mi manca qualcosa sul valore della casella di controllo.

Qualsiasi aiuto apprezzato!

risposta

14

Ho avuto problemi con questo in precedenza ed ecco come ho risolto.

Innanzitutto, creare la casella di controllo.

<?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 } ?> 

Avanti, salvataggio.

<?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; 
} ?> 
Problemi correlati