web-dev-qa-db-fra.com

Création d'un champ personnalisé avec liste déroulante sur une nouvelle page de publication

J'essaie de créer un menu déroulant personnalisé par défaut avec des valeurs pré-remplies à partir de la base de données à afficher lors de la création d'une nouvelle publication ou de la modification d'une publication existante.

Je sais comment ajouter un seul champ personnalisé et en ai ajouté quelques-uns comme suit

add_action('wp_insert_post', 'set_default_custom_fields'); 
function set_default_custom_fields($post_id) {
if ( $_GET['post_type'] != 'page' ) {
add_post_meta($post_id, 'email', '[email protected]', true);
}
}

Cela fonctionne très bien pour moi et je suis en mesure de voir un champ personnalisé avec une valeur par défaut, mais je ne sais pas comment ajouter un menu déroulant à la place d'un champ de texte unique.

 add_action('wp_insert_post', 'set_default_custom_fields'); 
  function set_default_custom_fields($post_id) {
    if ( $_GET['post_type'] != 'page' ) {
<select name="voodoo_dropdown" id="voodoo_dropdown">
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'USA' ); ?>>USA</option>
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Canada' ); ?>>Canada</option>
        <option<?php selected( add_post_meta($post->ID, 'voodoo_dropdown', true), 'Mexico' ); ?>>Mexico</option>
        </select>
}
return ;
}

En raison de mon manque de connaissances, je ne sais pas trop où je vais mal ou ce qu'il faut faire pour accomplir cette tâche.

4
Umesh Awasthi

Au lieu de définir les valeurs par défaut pour les champs personnalisés, vous devriez procéder comme le dit Milo. Vous devriez avoir quelque chose comme ça dans votre functions.php. J'ai essayé de suivre ce dont vous avez besoin, mais je ne l'ai pas testé.

<?php

// action to add meta boxes
add_action( 'add_meta_boxes', 'voodoo_dropdown_metabox' );
// action on saving post
add_action( 'save_post', 'voodoo_dropdown_save' );

// function that creates the new metabox that will show on post
function voodoo_dropdown_metabox() {
    add_meta_box( 
        'voodoo_dropdown',  // unique id
        __( 'Voodoo Dropdown', 'mytheme_textdomain' ),  // metabox title
        'voodoo_dropdown_display',  // callback to show the dropdown
        'post'   // post type
    );
}

// voodoo dropdown display
function voodoo_dropdown_display( $post ) {

  // Use nonce for verification
  wp_nonce_field( basename( __FILE__ ), 'voodoo_dropdown_nonce' );

  // get current value
  $dropdown_value = get_post_meta( get_the_ID(), 'voodoo_dropdown', true );
  ?>
    <select name="voodoo_dropdown" id="voodoo_dropdown">
        <option value="USA" <?php if($dropdown_value == 'USA') echo 'selected'; ?>>USA</option>
        <option value="Canada" <?php if($dropdown_value == 'Canada') echo 'selected'; ?>>Canada</option>
        <option value="Mexico" <?php if($dropdown_value == 'Mexico') echo 'selected'; ?>>MEXICO</option>
    </select>
  <?php
}

// dropdown saving
function voodoo_dropdown_save( $post_id ) {

    // if doing autosave don't do nothing
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
      return;

  // verify nonce
  if ( !wp_verify_nonce( $_POST['voodoo_dropdown_nonce'], basename( __FILE__ ) ) )
      return;


  // Check permissions
  if ( 'page' == $_POST['post_type'] ) 
  {
    if ( !current_user_can( 'edit_page', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( 'edit_post', $post_id ) )
        return;
  }

  // save the new value of the dropdown
  $new_value = $_POST['voodoo_dropdown'];
  update_post_meta( $post_id, 'voodoo_dropdown', $new_value );
}
?>

Si vous pensez que c'est trop compliqué, vous pouvez utiliser un plugin metaboxes, trouvez-en un dans le répertoire du plugin Wordpress contenant déjà des listes déroulantes.

4
dbeja

Ajoutez votre liste déroulante à l’écran de post-édition dans une boîte à méta via add_meta_box , puis dans l’action save_post, vous pouvez vérifier et enregistrer l’option sélectionnée en tant que méta-post.

2
Milo

Une fois que j'ai travaillé sur une exigence similaire, ceci est un code brut pour cela, espérons que cela vous aidera.

<?php
add_action( 'add_meta_boxes', 'yss_custom_post_cat_add' );
function yss_custom_post_cat_add() {
 add_meta_box( 'my-meta-box-id', 'My Custom Post Category', 'yss_custom_post_cat', 'post', 'normal', 'high' );
}

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

   <p>
    <label for="custom_post_cat_select">Select your custom Post Category</label>
    <br>
    <select name="custom_post_cat_select" id="custom_post_cat_select">
     <option value="picture" <?php selected( $selected, 'none' ); ?>>(none)</option>
     <option value="picture" <?php selected( $selected, 'picture' ); ?>>Picture</option>
     <option value="video" <?php selected( $selected, 'video' ); ?>>Video</option>
     <option value="sports" <?php selected( $selected, 'sports' ); ?>>Sports</option>
     <option value="guesswho" <?php selected( $selected, 'guesswho' ); ?>>Guess Who</option>
     <option value="decisionpoll" <?php selected( $selected, 'decisionpoll' ); ?>>Decision Poll</option>
     <option value="audio" <?php selected( $selected, 'audio' ); ?>>Audio</option>
    </select>
   </p>
<?php
}

add_action( 'save_post', 'yss_custom_post_cat_save' );
function yss_custom_post_cat_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['custom_post_cat_select'] ) )
  update_post_meta( $post_id, 'custom_post_cat_select', esc_attr( $_POST['custom_post_cat_select'] ) );
}
?>
2
Yogendra