Skip to content

Instantly share code, notes, and snippets.

@hameedullah
Created May 28, 2011 23:50
Show Gist options
  • Save hameedullah/997350 to your computer and use it in GitHub Desktop.
Save hameedullah/997350 to your computer and use it in GitHub Desktop.
Custom Taxonomy drop downs for parents and child
<?php
/*
Plugin Name: Custom Taxonomy DropDown
Author: Hameedullah Khan
Aurhot URI: http://hameedullah.com
*/
// change this to your taxonomy
$brand_taxonomy = 'category';
$taxonomy_name = 'Brands';
/* registering taxonomy */
/* disabled assuming you already have regsitered taxonomy */
/*
add_action('init', 'my_taxonomy');
function my_taxonomy() {
global $brand_taxonomy, $taxonomy_name;
register_taxonomy($brand_taxonomy,array('post'),array('labels'=>array('name'=>$taxonomy_name),'public'=>true,'hierarchical'=>true));
}*/
add_action('add_meta_boxes', 'my_custom_metabox');
function my_custom_metabox() {
add_meta_box('custom-taxonomy-dropdown','Brands','taxonomy_dropdowns_box','post','side','high');
}
function taxonomy_dropdowns_box( $post ) {
global $brand_taxonomy, $taxonomy_name;
wp_nonce_field('custom-dropdown', 'dropdown-nonce');
$terms = get_terms( $brand_taxonomy, 'hide_empty=0');
if ( is_a( $terms, 'WP_Error' ) ) {
$terms = array();
}
$object_terms = wp_get_object_terms( $post->ID, $brand_taxonomy, array('fields'=>'ids'));
if ( is_a( $object_terms, 'WP_Error' ) ) {
$object_terms = array();
}
// you can move the below java script to admin_head
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('#custombrandoptions').change(function() {
var custombrand = jQuery('#custombrandoptions').val();
if ( custombrand == '0') {
jQuery('#custommodeloptions').html('');
jQuery('#modelcontainer').css('display', 'none');
} else {
jQuery('#ctd-custom-taxonomy-terms-loading').css('display', 'inline');
jQuery('#modelcontainer').css('display', 'none');
var data = {
'action':'get_brand_models',
'custombrand':custombrand,
'dropdown-nonce': jQuery('#dropdown-nonce').val()
};
jQuery.post(ajaxurl, data, function(response){
jQuery('#custommodeloptions').html(response);
jQuery('#ctd-custom-taxonomy-terms-loading').css('display', 'none');
jQuery('#modelcontainer').css('display', 'inline');
});
}
});
});
</script>
<?php
echo "Brand:";
echo "<select id='custombrandoptions' name='custombrands[]'>";
echo "<option value='0'>None</option>";
foreach ( $terms as $term ) {
if ( $term->parent == 0) {
if ( in_array($term->term_id, $object_terms) ) {
$parent_id = $term->term_id;
echo "<option value='{$term->term_id}' selected='selected'>{$term->name}</option>";
} else {
echo "<option value='{$term->term_id}'>{$term->name}</option>";
}
}
}
echo "</select><br />";
echo "<div id='ctd-custom-taxonomy-terms-loading' style='display:none;'>Loading...</div>";
echo "<div id='modelcontainer'";
if ( !isset( $parent_id)) echo " style='display: none;'";
echo ">";
echo "Models:";
echo "<select id='custommodeloptions' name='custombrands[]'>";
if ( isset( $parent_id)) {
$models = get_terms( $brand_taxonomy, 'hide_empty=0&child_of='.$parent_id);
foreach ( $models as $model ) {
if ( in_array($model->term_id, $object_terms) ) {
echo "<option value='{$model->term_id}' selected='selected'>{$model->name}</option>";
} else {
echo "<option value='{$model->term_id}'>{$model->name}</option>";
}
}
}
echo "</select>";
echo "</div>";
}
add_action('save_post','save_my_custom_taxonomy');
function save_my_custom_taxonomy( $post_id ) {
global $brand_taxonomy, $taxonomy_name;
if ( define('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return;
if ( !wp_verify_nonce($_POST['dropdown-nonce'], 'custom-dropdown'))
return;
$brands = array_map('intval', $_POST['custombrands']);
wp_set_object_terms($post_id, $brands, $brand_taxonomy);
}
add_action('wp_ajax_get_brand_models', 'get_brand_models');
function get_brand_models() {
global $brand_taxonomy, $taxonomy_name;
check_ajax_referer('custom-dropdown', 'dropdown-nonce');
if (isset($_POST['custombrand'])) {
$models = get_terms( $brand_taxonomy, 'hide_empty=0&child_of='. $_POST['custombrand']);
echo "<option value='0'>Select one</option>";
foreach ($models as $model) {
echo "<option value='{$model->term_id}'>{$model->name}</option>";
}
}
die();
}
?>
@foxsk8
Copy link

foxsk8 commented Oct 26, 2011

js and html has droped, and drop fuction has change on standart wordpress core drop downs and update save, update fuctions. This mod also put meta box in database without serialize data.

@nackle2k10
Copy link

How to use this code in the front end?

@Thunderlab
Copy link

Can you show how to make it working with 3 dropdowns? (3 taxonomy levels)

@unpapelito
Copy link

Hello! It is i need! Thanks! But do you know how i can add a third level? 3 dropdowns?

@albertrubis17
Copy link

Hi hameedullah, is this the code of a drop-down list that get only checked taxonomy of a post in the wp-admin and displayed by query in a page(created by category).

@palcas
Copy link

palcas commented Mar 7, 2013

mamouneyya could you show how you managed to work this with three levels taxonomy?

@jeffersonrbr
Copy link

you really really helped me!!!
tks a lot man!!!!

@ricklambrechts
Copy link

Thank you!
This is still really useful!

@spartie17
Copy link

spartie17 commented Aug 13, 2018

This works great! @hameedullah or @mamouneyya could either of you help me turn this into a three-level taxonomy dropdown? My primary use case is for Country, State, City. Any help would be appreciated, thank you so much!

@answerquest
Copy link

Does this go in functions.php ?

@piere90
Copy link

piere90 commented Sep 19, 2019

mamouneyya potresti mostrare come sei riuscito a farlo con una tassonomia a tre livelli?

Hello! It is i need! Thanks! But do you know how i can add a third level? 3 dropdowns?

Enter in My profile for this!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment