In woocommerce, I have 2 selects fields:
- The first one is “Car Brands”,
- And the second one is “Car Models” of these
Car Brands
.
What I would like to do is to get dynamically “Car Models” for the selected “Car Brand”
The “Car Brands” come from WooCommerce product attributes taxonomies. For each “car brand”, the related “car models” are the terms of this product attribute taxonomy.
Here is the code for “Car Brands” (the first select field):
$attributes = wc_get_attribute_taxonomies();
if($attributes) {
echo '<select id="car-brands"><option value="noselection">Car Brand</option>';
foreach ( $attributes as $attribute ) {
echo '<option value="' . $attribute->attribute_name . '">' . $attribute->attribute_label . '</option>';
}
echo '</select>';
}
And a generated html sample code:
<select id="car-brands">
<option value="noselection">Car Brand</option>
<option value="toyota">TOYOTA</option>
<option value="lexus">LEXUS</option>
</select>
Then the code for “Car models” (the second select field):
$selected_attribute_name = 'toyota';
$taxonomy = 'pa_' . $selected_attribute_name;
$term_names = get_terms( array( 'taxonomy' => $taxonomy, 'fields' => 'names' ) );
echo '<select id="car-models"><option value="noselection">Car Model</option>';
echo '<option>' . implode( '</option><option>', $term_names ) . '</option>';
echo '</select>';
And a generated html sample code:
<select id="car-models">
<option value="noselection">Car Model</option>
<option value="toyota">AVENSIS</option>
<option value="lexus">CAMRY</option>
</select>
As you can see I’m getting the specific car models for “toyota” brand, because I have hard coded “toyota” as “Car brand”:
$selected_attribute_name = 'toyota';
So what I would like is to have $selected_attribute_name
as a dynamic variable, so when user select the car brand “LEXUS” or “TOYOTA”, second select field loads dynamically the related terms (options).
I found a lot of related threads, but I haven’t be able to understand how can I make it work on my case.
How I can have dynamic “car models” select field options based on selected car brand?
EDIT
All my php is in a action hook function like so:
function _themename_woocommerce_custom_filter() {
$attributes = wc_get_attribute_taxonomies();
if($attributes) {
echo '<select id="car-brands"><option value="noselection">Car Brand</option>';
foreach ( $attributes as $attribute ) {
echo '<option value="' . $attribute->attribute_name . '">' . $attribute->attribute_label . '</option>';
}
echo '</select>';
}
$selected_attribute_name = '';
$taxonomy = 'pa_' . $selected_attribute_name;
$term_names = get_terms( array( 'taxonomy' => $taxonomy, 'fields' => 'names' ) );
echo '<select id="car-models"><option value="noselection">Car Model</option>';
echo '<option>' . implode( '</option><option>', $term_names ) . '</option>';
echo '</select>';
}
add_action( 'woocommerce_before_shop_loop', '_themename_woocommerce_custom_filter', 3 );
2
Answers
Here take a look at a working ajax example.
Javascript Part:
PHP Part:
The following uses Ajax to get the corresponding terms from the selected “car brand” (product attribute taxonomy) to generate dynamically the “car model” select field options (terms of the selected product attribute taxonomy):
Code goes in functions.php file of your active child theme (or active theme). Tested and works.