web-dev-qa-db-fra.com

Création d'un menu déroulant Types de messages personnalisés dans une méta-boîte

Est-il possible de renseigner une méta-boîte avec une liste déroulante de types de publication personnalisés? Je prévois d’essayer de créer un modèle pour un client qui lui permettra de créer une nouvelle page dans le tableau de bord, puis de sélectionner un type de publication personnalisé dans la boîte méta CPT pour choisir les publications à afficher sur ladite page.

Mise à jour: Voici ce que j'ai eu pour le moment. La boîte aux lettres ne renvoie pas la valeur après la sauvegarde. Toute aide serait appréciée.

    add_action( 'add_meta_boxes', 'cd_meta_box_add' );
   function cd_meta_box_add()
   {
add_meta_box( 'my-meta-box-id', 'My First Meta Box', 'cd_meta_box_cb', 'page', 'normal', 'high' );
   }

   function cd_meta_box_cb( $post )
   {
$values = get_post_custom( $post->ID );
$selected = isset( $values['my_meta_box_select'] ) ? esc_attr(               $values['my_meta_box_select'][0] ) : '';
wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>

<p>
    <label for="my_meta_box_select">Post type: </label>
    <select name="my_meta_box_select" id="my_meta_box_select">
        <?php $post_types=get_post_types('', 'objects'); foreach ($post_types as $post_type): ?>
        <option value="<?php echo esc_attr($post_type->name); selected ?>"><?php echo esc_html($post_type->label); selected ?></option>
        <?php endforeach; ?>
    </select>
</p>    

<p>  
    <label for="my_meta_box_select">Color</label>  
    <select name="my_meta_box_select" id="my_meta_box_select">  
        <option value="red" <?php selected( $selected, 'red' ); ?>>Red</option>  
        <option value="blue" <?php selected( $selected, 'blue' ); ?>>Blue</option>  
    </select>  
</p>     

<?php   
   }


   add_action( 'save_post', 'cd_meta_box_save' );
   function cd_meta_box_save( $post_id )
   {
// Bail if we're doing an auto save
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

// if our nonce isn't there, or we can't verify it, bail
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce(        $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;

// if our current user can't edit this post, bail
if( !current_user_can( 'edit_post' ) ) return;

// now we can actually save the data
$allowed = array( 
    'a' => array( // on allow a tags
        'href' => array() // and those anchords can only have href        attribute
    )
);

// Probably a good idea to make sure your data is set

if( isset( $_POST['my_meta_box_select'] ) )
    update_post_meta( $post_id, 'my_meta_box_select', esc_attr( $_POST['my_meta_box_select'] ) );

   }
3
mtuttle

Bien sur, c'est possible.

Ci-dessous, le code qui affichera les types de publication enregistrés:

function my_meta_box_add() {
    add_meta_box( 'my-meta-box-id', 'MY meta', 'my_meta_box', 'page', 'normal', 'high' );
} add_action( 'add_meta_boxes', 'my_meta_box_add' );


function my_meta_box( $post ) {
    ?>
    <p>
        <label for="my_meta_box_post_type">Post type: </label>
        <select name='my_meta_box_post_type' id='my_meta_box_post_type'>
            <?php $post_types=get_post_types('', 'objects'); foreach ($post_types as $post_type): ?>
            <option value="<?php echo esc_attr($post_type->name); ?>"><?php echo esc_html($post_type->name); ?></option>
            <?php endforeach; ?>
        </select>
    </p>
    <?php   
}

Bien sûr, vous devez prendre soin de sauvegarder cette valeur, de vérifier les nonces, etc.

4
Krzysiek Dróżdż