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