Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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', '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

share|improve this question
    
In what way is it not working? –  s_ha_dum Dec 23 '12 at 15:20
    
@s_ha_dum: drop down is not getting displayed –  Umesh Awasthi Dec 23 '12 at 18:01
add comment

3 Answers

Add your dropdown to the post edit screen in a meta box via add_meta_box, then on the save_post action you can check and save the selected option as post meta.

share|improve this answer
add comment

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.

share|improve this answer
add comment

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'] ) );
}
?>
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.