web-dev-qa-db-fra.com

impossible d'enregistrer les méta-publications sur un seul champ avec plusieurs sélections

J'ai configuré deux boîtes de sélection dans un même champ méta en plaçant deux tableaux dans le tableau "options" de mon rappel. Le code HTML produit bien, mais la méta n'est pas enregistrée dans la base de données ...

Voici une image de la configuration de la boîte à méta (pour une raison quelconque qui me fait penser que cela pourrait être utile):

... aaaaaaaaaaaaaaaaaa et voici mon code:

add_action( 'add_meta_boxes', 'event_infobox_add' );                                                        
add_action( 'save_post', 'event_infobox_save' );
function event_infobox_add() {
add_meta_box( 
'event_infobox', // $id 
'Event Date, Time, and Venue Info', // $title 
'event_infobox_call', // $callback
'events', // $page
'normal', // $context 
'high' // $priority   
);
}

// Time options for dropdowns in the HTML
$times = array(  'hour00' => '12AM' ,'hour01' => '1AM' ,'hour02' => '2AM' ,'hour03' => '3AM' ,'hour04' => '4AM' ,'hour05' => '5AM' ,'hour06' => '6AM' ,'hour07' => '7AM' ,'hour08' => '8AM' ,'hour09' => '9AM' ,'hour10' => '10AM' ,'hour11' => '11AM' ,'hour12' => '12PM' ,'hour13' => '1PM' ,'hour14' => '2PM' ,'hour15' => '3PM' ,'hour16' => '4PM' ,'hour17' => '5PM' ,'hour18' => '6PM' ,'hour19' => '7PM' ,'hour20' => '8PM' ,'hour21' => '9PM' ,'hour22' => '10PM' ,'hour23' => '11PM' );

// Meta Box fields HTML
$event_infobox_fields = array(
array(
     'label' => 'Event Time Frame'
    ,'desc' => 'Enter time frame of the event here'
    ,'id' => 'event_timeframe'  //values stored with this key
    ,'class' => ''
    ,'type' => 'select'
    ,'options' => array(
        'timestart' => $times,
        'timeend' => $times
    )
)
);

function event_infobox_call( $post ) {
global $event_infobox_fields, $post;  
// Use nonce for verification  
wp_nonce_field( plugin_basename( __FILE__ ), 'event_infobox_nonce' );
echo '<input type="hidden" name="event_infobox_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';  

// Loop it up
echo '<table class="form-table">';

foreach ($event_infobox_fields as $field) {  
    $meta = get_post_meta($post->ID, $field['id'], true); 
    echo '<tr>
    <th>
        <label for="'.$field['id'].'">'.$field['label'].'</label>
        <span class="meta-description">'.$field['desc'].'</span>
    </th>
    <td>';
    switch($field['type']) {

        case 'select':

        // Event Timeframe Select Dropdowns
        if ( $field['id'] == 'event_timeframe') {
            foreach ($field['options'] as $key => $value ){
                echo $meta;
                $keyhead = str_replace('time','',$key);
                echo '<span>'.$keyhead.'</span>
                            <select style="width:200px; display:block;" name="'.$key.'" id="'.$key.'">';
                $total = count($field['options'][$key])-1;
                for ($i=0; $i<=$total; $i++){
                    if($i<10) {
                        $i="0$i";
                    }
                    echo '<option style="width:200px; display:block;" value="'.$field['options'][$key]['hour'.$i].'"', $meta == $field['options'][$key]['hour'.$i] ? 'selected="selected"' : '','>'.$field['options'][$key]['hour'.$i].'</option>';
                }
                echo '</select>';
            }
        }

        ////////////

        break;  

    } //end switch  
echo '</td></tr>';  
} // end foreach

echo '</table>'; // end table  
}

// $ave $ave $ave
function event_infobox_save( $post_id ) { 
global $event_infobox_fields;  

// verify nonce  
if (!wp_verify_nonce($_POST['event_infobox_box_nonce'], basename(__FILE__)))  
        return $post_id;  
// check autosave  
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)  
        return $post_id;  
// check permissions  
if ('page' == $_POST['post_type']) {  
        if (!current_user_can('edit_page', $post_id))  
                return $post_id;  
        } elseif (!current_user_can('edit_post', $post_id)) {  
                return $post_id;  
}    
// loop through fields and save the data  
foreach ($event_infobox_fields as $field) {  
    $old = get_post_meta($post_id, $field['id'], true);
    $new = $_POST[$field['id']]; 

    if ($new && $new != $old) {  
            update_post_meta($post_id, $field['id'], $new); 
    }

    elseif ('' == $new && $old) {  
            delete_post_meta($post_id, $field['id'], $old);  
    }  
} // end foreach  
}
2
mroncetwice

Dans votre code de sauvegarde, la valeur de $field['id'] est event_timeframe, qui n'existe pas dans $_POST; vos options ne seront donc jamais enregistrées.

Vous devez creuser dans votre tableau options pour accéder à timestart et timeend:

// loop through fields and save the data  
    foreach ( $event_infobox_fields as $field ) {
        foreach ( $field['options'] as $option_key => $option_value ) {
            $old = get_post_meta( $post_id, $option_key, true );
            $new = $_POST[$option_key];
            if ( $new && $new != $old ) {
                update_post_meta( $post_id, $option_key, $new );
            } elseif ( '' == $new && $old ) {
                delete_post_meta( $post_id, $option_key, $old );
            }
        } // end foreach  
    }

N'oubliez pas que vous devrez également mettre à jour la méta utilisée dans votre code déroulant afin de les pré-renseigner.

2
vancoder