Creating custom field with drop down on new post page

I Am trying to create a default custom field drop down with pre populated values from the DB to be shown while creating a new Post or editing a existing post.

I am aware about how to add a single custom field and have added few as follows

Read More
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', 'xyz@mail.com', true);
}
}

This is working fine for me and i am able to see custom field with default value but i am not sure how to add a drop down in place of single text field, i tried something like this but seems like its not working.

 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 ;
}

Due to my lack of knowledge i am not sure where i am doing wrong or what needs to be done to accomplish this task

Related posts

Leave a Reply

3 comments

  1. Instead of defining the default values for custom fields, you should do like Milo says.
    You should have something like this in your functions.php.
    I tried to follow what you need, but didn’t test it.

    <?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 );
    }
    ?>
    

    If you think this is too much complicated you can use a metaboxes plugin, find one in WordPress Plugin directory that has already dropdowns.

  2. Once I had worked on a similar requirement, this is a raw code for that, hope this will help.

    <?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'] ) );
    }
    ?>