web-dev-qa-db-fra.com

Comment stocker plusieurs valeurs dans 1 meta_key avec entrée radio?

Comment enregistrer plusieurs valeurs dans un meta_key via une entrée radio puis afficher les deux valeurs sur la page? Une valeur serait une chaîne de texte et l'autre un lien qui irait avec ce texte. Ces valeurs ne changeraient pas et seraient renseignées par les données de la boîte radio.

Voici le code pour mes boîtes à méta. Je veux que la boîte radio event_venue ait une valeur supplémentaire qui serait le lien vers la page de la salle. De cette façon, il me suffirait de cliquer sur le bouton radio du lieu. Le nom et le lien vers la page s'afficheraient automatiquement.

 $meta_box['event'] = array(
    'id' => 'event-meta-details',
    'title' => 'Event Information',
    'context' => 'normal',
    'priority' => 'high',
    'fields' => array(
        array(
            'name' => 'Start Date',
            'desc' => '(Enter yyyy/mm/dd)',
            'id' => 'start_date',
            'type' => 'text',
            'default' => ''
        ),
        array(
            'name' => 'End Date',
            'desc' => '(Enter yyyy/mm/dd)',
            'id' => 'end_date',
            'type' => 'text',
            'default' => ''
        ),
        array(
            'name' => 'Opening',
            'desc' => 'YYYY-MM-DD 00:00 24 hour clock',
            'id' => 'opening_time',
            'type' => 'text',
            'default' => ''
        ),
           array(
            'name' => 'Closing',
            'desc' => 'YYYY-MM-DD 00:00 24 hour clock',
            'id' => 'closing_time',
            'type' => 'text',
            'default' => ''
        ),
        array(
            'name' => 'Artist Talk - Lecture',
            'desc' => 'YYYY-MM-DD 00:00 24 hour clock',
            'id' => 'artist_talk_time',
            'type' => 'text',
            'default' => ''
        ),
        array(
        'name' => 'Venue',
        'desc' => 'Venue of Event',
        'id' => $prefix . 'event_venue',
        'type' => 'radio',
        'options' => array(
            array('name' => 'William Busta Gallery', 'value' => 'William Busta Gallery'),
            array('name' => 'Spaces', 'value' => 'Spaces'),
            array('name' => 'Enter Text Below', 'value' => 'other')
        )
    ),
        array(
            'name' => 'Custom Venue',
            'desc' => 'Enter Venue Name if Enter Text Below is Checked',
            'id' => 'custom_event_venue',
            'type' => 'text',
            'default' => ''
        ),
        array(
                'name' => 'Featured / Reccomended',
            'desc' => 'Recommended Event',
            'id' => 'featured_event',
            'type' => 'checkbox',
            'default' => ''
          )

    )
);

En ce moment, je montre la valeur de la salle comme ceci.

if (get_post_meta(get_the_ID(),'event_venue', true) != 'other') { 
    echo get_post_meta(get_the_ID(),'event_venue', true);
    }
if (get_post_meta(get_the_ID(),'event_venue', true) == 'other') {
    echo get_post_meta(get_the_ID(),'custom_event_venue', true);
    }

C'est le code qui enregistre les données.

// Save data from meta box
function plib_save_data($post_id) {
    global $meta_box,  $post;

    //Verify nonce
    if (!wp_verify_nonce($_POST['plib_meta_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;
    }

    foreach ($meta_box[$post->post_type]['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);
        }
    }
}

add_action('save_post', 'plib_save_data');

Merci d'avance pour tout conseil. Je suis très confus.

1
John Bentwin

John,

Je ne sais pas comment vous avez configuré le bouton radio, mais WordPress gère facilement plusieurs valeurs dans une seule méta_key. Vous devez simplement placer les valeurs dans un tableau avant de l'envoyer à update_post_meta. Par exemple:

$array = array( 'foo' => 'foo_value', 'bar' => 'bar_value' );
update_post_meta( $id, 'my_meta_key', $array );

WordPress sérialise automatiquement ce tableau en entrant et le désérialise en sortant.

Ma recommandation personnelle serait de sauvegarder les deux données sous forme de métadonnées distinctes. En sérialisant le tableau et en l'envoyant à la base de données, vous perdez la possibilité de rechercher une information individuelle.

Enfin, vous devez vous assurer de nettoyer/valider vos données lors de l’enregistrement dans la base de données et de les échapper lors de l’affichage. Le Codex a publié un article de Nice sur la procédure à suivre: http://codex.wordpress.org/Data_Validation

1
tollmanz