Save custom dropdown field.
-
Hey there!!
Well, I have a little problem with my custom meta box. I create a custom post which includes a custom meta field dropdown. The dropdown displays the title of the posts from another custom posts that I want to link with when save. But when I clic on publish the dropdown doesn´t save.
Here is my code.
Here I create my custom post:
function my_custom_post_category_product() { $labels = array( 'name' => _x( 'Categories Products', 'post type general name' ), 'singular_name' => _x( 'Categories Products', 'post type singular name' ), 'add_new' => _x( 'Add New' ), 'add_new_item' => __( 'Add New Categories Products' ), 'edit_item' => __( 'Edit Categories Products' ), 'new_item' => __( 'New Categories Products' ), 'all_items' => __( 'All Categories Products' ), 'view_item' => __( 'View Categories Products' ), 'search_items' => __( 'Search Categories Products' ), 'not_found_in_trash' => __( 'No Categories Products found in the Trash' ), 'not_found' => __( 'No Categories Products found' ), 'parent_item_colon' => '', 'menu_name' => 'Categoria Producto' ); $args = array( 'labels' => $labels, 'description' => 'Holds our categories specific data', 'public' => true, 'menu_position' => 100, 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ), 'has_archive' => true, 'taxonomies' => array('category'), ); register_post_type( 'category_product', $args ); } add_action( 'init', 'my_custom_post_category_product' ); function my_updated_messages_category_product( $messages ) { global $post, $post_ID; $messages['categories'] = array( 0 => '', 1 => sprintf( __('Categories Products updated. <a href="%s">View Categories Products</a>'), esc_url( get_permalink($post_ID) ) ), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Categories updated.'), 5 => isset($_GET['revision']) ? sprintf( __('Categories Products restored to revision from %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => sprintf( __('Categories Products published. <a href="%s">View Categories Products</a>'), esc_url( get_permalink($post_ID) ) ), 7 => __('Categories Products saved.'), 8 => sprintf( __('Categories Products submitted. <a target="_blank" href="%s">Preview Categories Products</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( __('Categories Products scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview Categories Products</a>'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 10 => sprintf( __('Categories Products draft updated. <a target="_blank" href="%s">Preview Categories Products</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), ); return $messages; } add_filter( 'post_updated_messages', 'my_updated_messages_category_product' );
And then the function to create the custom meta box and save the data:
add_action('add_meta_boxes', 'product_post_options_box',10,2); /* saved the data */ add_action( 'save_post', 'save_product_post_options_box' ); function product_post_options_box($post_type, $post) { if ('category_product' == $post_type) //only add to your post type add_meta_box('post_info', 'Product Information', 'product_post_info', 'category_product', 'side', 'high'); } function product_post_info() { global $post; /* List the posts*/ $posts = get_posts( array( 'post_type' => array( 'categories' ), 'posts_per_page' => -1 ) ); //get saved data $saved = get_post_meta($post->ID,'_categories',true); if (empty($saved)) $saved = array(); //var_dump($saved); echo '<select name="categories" id="categories" multiple>'. '<option value="" selected="selected">Select a post</option>'; foreach ($posts as $p) { $link = get_permalink( $p->ID); $selected = (in_array($link,$saved)) ? ' selected="selected"' : ''; echo '<option'.$selected.' value="'.$link.'">'.get_the_title( $p->ID ).'</option>'; } echo '</select>'; // Use nonce for verification wp_nonce_field( plugin_basename( __FILE__ ), 'categories_nonce' ); } function save_product_post_options_box($post_ID){ // verify if this is an auto save routine. // If it is our form has not been submitted, so we dont want to do anything if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // First we need to check if the current user is authorised to do this action. if ( ! current_user_can( 'edit_post', $post_ID ) ) return; // Secondly we need to check if the user intended to change this value. if ( ! isset( $_POST['categories_nonce'] ) || ! wp_verify_nonce( $_POST['categories_nonce'], plugin_basename( __FILE__ ) ) ) return; // Thirdly check the post type if ('categories' != get_post_type($post_ID)) return; $mydata = $_POST['categories']; // Do something with $mydata // either using update_post_meta( $post_ID, '_category_product', $mydata, true); }
At this point:
//get saved data $saved = get_post_meta($post->ID,'_categories',true); if (empty($saved)) $saved = array(); //var_dump($saved);
If I show $saved in order to see what it contains it shows the custom posts from WordPress. I have no idea where is the bug. Any idea?
Note: The dropdown must save multiple options (1 post or more)
Thanks a lot!
-
I solved this problem by changing de code:
// Add the Meta Box function add_custom_meta_box() { add_meta_box( 'custom_meta_box', // $id 'Product Requirements', // $title 'show_custom_meta_box', // $callback 'produktkrav', // $page 'normal', // $context 'high'); // $priority } add_action('add_meta_boxes', 'add_custom_meta_box'); // Field Array $prefix = 'custom_'; $custom_meta_fields = array( array( 'label'=> 'Filter criteria', 'desc' => 'Select the filter criteria for this product requirement.', 'id' => $prefix.'select', 'type' => 'select', 'options' => array ( 'one' => array ( 'label' => 'Miljo- og energikrav', 'value' => 'Miljo- og energikrav' ), 'two' => array ( 'label' => 'Tildelingskriterier', 'value' => 'Tildelingskriterier' ), 'three' => array ( 'label' => 'Leverandorens', 'value' => 'Leverandorens' ) ) ), array( 'label'=> 'Mandatory Requirement', 'desc' => 'Check if this product requirement is mandatory.', 'id' => $prefix.'checkbox', 'type' => 'checkbox' ), array( 'label' => 'Categories', 'desc' => 'Related categorie.', 'id' => $prefix.'post_id', 'type' => 'post_list', 'post_type' => array('category_product'), ) ); // The Callback function show_custom_meta_box() { global $custom_meta_fields, $post; // Use nonce for verification echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; // Begin the field table and loop echo '<table class="form-table">'; foreach ($custom_meta_fields as $field) { // get value of this field if it exists for this post $meta = get_post_meta($post->ID, $field['id'], true); // begin a table row with echo '<tr> <th><label for="'.$field['id'].'">'.$field['label'].'</label></th> <td>'; switch($field['type']) { // case items will go here // select case 'select': echo '<select name="'.$field['id'].'" id="'.$field['id'].'">'; foreach ($field['options'] as $option) { echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>'; } echo '</select><br /><span class="description">'.$field['desc'].'</span>'; break; // checkbox case 'checkbox': echo '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/> <label for="'.$field['id'].'">'.$field['desc'].'</label>'; break; // post_list case 'post_list': $items = get_posts( array ( 'post_type' => $field['post_type'], 'posts_per_page' => -1 )); echo '<select name="'.$field['id'].'" id="'.$field['id'].'"> <option value="">Select One</option>'; // Select One foreach($items as $item) { echo '<option value="'.$item->ID.'"',$meta == $item->ID ? ' selected="selected"' : '','> '.$item->post_title.'</option>'; } // end foreach echo '</select><br /><span class="description">'.$field['desc'].'</span>'; break; } //end switch echo '</td></tr>'; } // end foreach echo '</table>'; // end table } // Save the Data function save_custom_meta($post_id) { global $custom_meta_fields; // verify nonce if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) return $post_id; // check autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; // check permissions if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) return $post_id; } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } // loop through fields and save the data foreach ($custom_meta_fields as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } // end foreach } add_action('save_post', 'save_custom_meta');
But now, another question: How can I display more than one type of post and order by type-post inside the select
Solved
- The topic ‘Save custom dropdown field.’ is closed to new replies.