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

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

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

3 Answers
3

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.

Leave a Comment