web-dev-qa-db-fra.com

Enregistrer l'élément sélectionné dans le menu déroulant dans une boîte méta en tant que valeur de métadonnée pour un type de publication personnalisé

Je suis en train de me battre la cervelle depuis des jours et mon Google-fu me fait défaut.

J'ai créé une méta-boîte personnalisée avec un menu déroulant qui répertorie tous les termes d'une taxonomie personnalisée. Ce que je ne peux pas comprendre, c'est comment enregistrer l'option sélectionnée dans le menu déroulant lorsque l'article est enregistré. Je suis un peu novice dans PHP et bien que j'aie trouvé de nombreux tutoriels et autres questions sur la manière de procéder, je suis toujours déconcerté quand ils abordent la partie relative à la sauvegarde des données.

Voici mon code pour créer le metabox:

<?php
function MC_Catalog_create() {
    add_meta_box( 'MC_Catalog_meta', 'Course Information', 'MC_Catalog_course_info','mc_course_post', 'normal', 'high' );
}

function MC_Catalog_course_info( $post ) {

$MC_Catalog_course_area = get_post_meta( $post->ID, '_MC_Catalog_course_area', true );
$MC_Catalog_course_num = get_post_meta( $post->ID, '_MC_Catalog_course_num', true );
$MC_Catalog_course_name = get_post_meta( $post->ID, '_MC_Catalog_course_name', true );
$MC_Catalog_course_desc = get_post_meta( $post->ID, '_MC_Catalog_course_desc', true );

?>
<table class="form-table" style="width:auto;">
    <tr>
        <td valign="top">Course Area:</td>
        <td valign="top">
        <select name="MC_Catalog_course_area">
           <?php 
           $myterms = get_terms('course_areas', $args);
                $args = array('orderby'=>'name','order'=>'ASC','hide_empty'=>false);
            foreach($myterms as $term){
                echo "<option value='$term->term_id'" . selected( $term->term_id, $MC_Catalog_course_area, false) .">" . esc_html( $term->name ) . "</option>";
            }
            ?>
        </select>
        </td>
    </tr>
    <tr>
        <td valign="top">Course Number:</td>
        <td valign="top"><input name="MC_Catalog_course_num" type="text" value="<?php echo esc_attr( $MC_Catalog_course_num ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Title:</td>
        <td valign="top"><input type="text" name="MC_Catalog_course_name" value="<?php echo esc_attr( $MC_Catalog_course_name ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Description:</td>
        <td valign="top"><textarea name="MC_Catalog_course_desc" rows="8" cols="100"><?php echo esc_attr( $MC_Catalog_course_desc ); ?></textarea></td>
    </tr>
</table>
<?php } ?>

Et voici mon code pour enregistrer les métadonnées:

//hook to save the meta box data
add_action( 'save_post', 'MC_Catalog_save_meta' );

function MC_Catalog_save_meta( $post_id ) {

    //verify the meta data is set
    if ( isset( $_POST['MC_Catalog_course_num'] ) ) {

        //save the meta data
        update_post_meta( $post_id, '_MC_Catalog_course_area', strip_tags( $_POST['MC_Catalog_course_area'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_num', strip_tags( $_POST['MC_Catalog_course_num'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_name', strip_tags( $_POST['MC_Catalog_course_name'] ) );
    update_post_meta( $post_id, '_MC_Catalog_course_desc', strip_tags( $_POST['MC_Catalog_course_desc'] ) );
    }
}
?>
1
Burgon

$myterms = get_terms($taxonomies, $args); renvoie un tableau d'objets terme. Utilisez $term->term_id comme valeur option

"<option value='$term->term_id'>". esc_html( $term_name ) . "</option>"

… Et stockez cet identifiant, pas le nom. Les noms peuvent changer, les ID restent les mêmes - à moins que quelqu'un supprime un terme et en crée un nouveau portant le même nom.

Pour sélectionner l'option appropriée, utilisez selected():

"<option value='$term->term_id'" . selected( $term->term_id, $MC_Catalog_course_area, FALSE ) .">"

Vous pouvez ensuite valider la valeur avec absint().

Votre gestionnaire save_post a besoin de contrôles supplémentaires .

1
fuxia