Home › Forums › General Issues › dependent dropdown select field › Reply To: dependent dropdown select field
I know this is a fairly old topic, but I have been working on a project that has required me to create a select field that’s populated based on another select field and I did not want the user to need to save the post in the middle.
I’m only going to cover the JavaScript that needs to be added to ACF to get this to work and I’m not going to go into all of the WP PHP side of building an AJAX action, this can be found and there’s plenty of information on it already.
Basically, you create the first field as a select field and use documentation already available for dynamically loading the choices of the select field.
I’m going to be honest, I’m not 100$ certain of everything in this, some of it is simply copied from the ACF code.
jQuery(document).ready(function($){
if (typeof acf == 'undefined') { return; }
// extend ACF and add our own functios
var bluntParasrch = acf.ajax.extend({
// add events that will trigger our function to be called
events: {
// 'trigger #field_id': 'function_name'
// the field id = '#acf-{$field_key}
// this is the field key of the field we want to use to
// get values for the second select field
'change #acf-field_56e1cf2e7ad26': 'field_56e1cf2e7ad26_change',
'ready #acf-field_56e1cf2e7ad26': 'field_56e1cf2e7ad26_change',
},
// add the function that will be triggered
_para_tax_change: function(e){
// bail early if no ajax
if( !acf.get('ajax') ) return;
// abort XHR if it's already running
if( this.request ) {
this.request.abort();
}
// vars
var self = this,
data = this.o;
// add action url
// the action is the action you will call and that you'd add using
// add_action('wp_ajax_... or wp_ajax_nopriv_...
// in this case the action would take the value we send it, a term ID
// and get children of that term
data.action = 'get_sub_terms';
// this is the value of the select field of the parent term
// to get chidren of, this value will be in $_POST['value']
data.value = e.$el.val();
// if no value then abort
if (!data.value) {
return;
}
data.exists = [];
this.request = $.ajax({
url: acf.get('ajaxurl'), // ajax url, acf already sets this
data: acf.prepare_for_ajax(data), // another included acf function
type: 'post', // posted values, look at $_POST in your php ajax action function
dataType: 'json', // how we want the date returned
success: function( json ){
// get the field we want to populate
var $select = $('.acf-field-56e2b71dde0c5 select');
// this stores the currenlty selected value in that field
// so that we can mark it as selected, this is important when loading
// and exsiting post
var $selected = $select.val();
// clear all of the exsiting options from the field
$select.empty();
// rebuild the child select field
$select.append('<option data-i="" selected="selected" value="">- Select -</option>');
var count = json.length;
for (i=0; i<count; i++) {
//alert(json[i]['value']+':'+json[i]['label']);
//var $option = $select.createElement('option');
//$option.value = json[i]['value'];
//$option.text = json[i]['label'];
var $item = '<option value="'+json[i]['value']+'"'
if ($selected == json[i]['value']) {
$item += ' selected="selected"';
}
$item += '>'+json[i]['label']+'</option>';
$select.append($item);
}
}
}); // end ajax
},
});
// trigger the ready action to load the field
// this is important for existing posts
$('#acf-field_56e1cf2e7ad26').trigger('ready');
});
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.