Introduction
Welcome to the Advanced Custom Fields JavaScript API. Here you will find documentation for our JavaScript library including functions, actions and filters and models.
Our library makes extensive use of jQuery and follows a similar style to Backbone.js. Before reading any further, make sure you are confident with JavaScript basics, jQuery events and WP hooks.
Similar to other JS libraries, we place all of our JS goodies in a global object called acf. This makes it super easy to interact with ACF functionality, take a look for yourself.
// get localized data
var postID = acf.get('post_id');
// add an action
acf.addAction('prepare', function(){
// ...
});
Accessing the ACF Global
The acf
global is registered by ACF when it enqueues the JS dependencies necessary for ACF to function. If you enqueue a script that uses ACF and get an acf is not defined
error, it’s likely because your script is enqueued before ACF has had a chance to load.
You can avoid this issue by making sure that ACF has loaded the acf-input
script. If you’re using wp_register_script() to load your javascript files, you can do this by adding the acf-input
handle into the $deps
array like so:
wp_register_script( 'your-script-handle', $url, array( 'acf-input' ) );
You can then check if the acf
global is available to your script with something like the following:
jQuery( document ).ready( function( $ ) {
if ( typeof acf !== 'undefined' ) {
console.log( 'ACF is defined', acf );
}
});
Functions
The acf object contains many helpful functions some of which are documented below. For a full list of available functions, please inspect the acf object in your console log.
get acf.get(name)
Returns localized data for a given name. Localized data is registered in PHP and passed to JS through an inline script in the footer. You can register PHP data for localization by using the acf_localize_data(array( 'foo' => 'bar' ));
function.
var postID = acf.get('post_id');
var acfVersion = acf.get('acf_version');
var foo = acf.get('bar');
set acf.set(name, value)
Sets a value for later use with acf.get()
. Returns the acf object for chaining.
var value = 'bar';
acf.set('foo', value);
has acf.has(name)
Returns true if data exists for the given name.
if( acf.has('foo') ) {
// do something
}
parseArgs acf.parseArgs(args, defaults)
Similar to the WP function wp_parse_args(), this is a generic utility for merging together an object of arguments and an object of default values.
// var maybeArgs = { ... }
var args = acf.parseArgs(maybeArgs, {
foo: 'bar',
html: '',
});
// console.log( args.foo );
__ acf.__(text)
Returns the translation of text. If there is no translation, the original text is returned. Translation data is registered in PHP and passed to JS through an inline script in the head. You can register translations in PHP by using the acf_localize_text()
function.
acf_localize_text(array(
'Select thing' => __('Select thing', 'my-textdomain')
));
var text = acf.__('Select thing');
addAction acf.addAction(action, callback, priority, context)
Similar to the WP function add_action(), this is used to listen for a specific action and register a callback function.
acf.addAction('new_field', function( field ){
field.$el.addClass('i-was-here');
});
addFilter acf.addFilter(filter, callback, priority, context)
Similar to the WP function add_filter(), this is used to listen for a specific filter and register a callback function to modify the first argument.
acf.addFilter('select2_args', function( options, $select ){
options.foo = 'bar';
return options;
});
doAction acf.doAction(action, [arg1, arg2, arg3, ...])
Similar to the WP function do_action(), this is used to trigger an action. Any callbacks registered for this action will be triggered.
acf.doAction('my_action', dataObject, someOtherVariable);
applyFilters acf.applyFilters(filter, [arg1, arg2, arg3, ...])
Similar to the WP function apply_filters(), this is used to apply a filter. Any callbacks registered for this filter will be called to modify the first argument.
var foo = acf.applyFilters('my_filter', 'bar');
findField acf.findField( key )
Returns a field jQuery object for a given field key.
var $field = acf.findField('field_123');
$field.addClass('my-class')
getField acf.getField( key )
Returns a field instance for a given field key or jQuery element.
var field = acf.getField('field_123');
field.$el.addClass('my-class')
findFields acf.findFields( args )
Returns a collection of jQuery objects for the given args.
// available args
var args = {
key: '', // The field key (field_123)
name: '', // The field name (my_field)
type: '', // The field type (image, text)
is: '', // jQuery selector (:visible)
parent: false, // jQuery element to search within
sibling: false, // jQuery element to search alongside
limit: false, // limit the number of jQuery elements returned
};
// example
var $fields = acf.findFields({
type: 'image'
});
getFields acf.getFields( args )
Returns an array of field instances for the given args (see acf.findFields for list of args) or a collection of jQuery elements.
var fields = acf.getFields({
type: 'image'
});
Actions
Actions are called at specific times during a page to allow for customisation. Below is a list of available JS actions somewhat in order of execution that you can hook into using the acf.addAction()
function.
✋ If using the “pre 5.7” function acf.add_action(), please be aware that any field instance parameter documented bellow will appear as a jQuery element for compatibility. This change is discussed in more detail later in the Compatibility section.
prepare
Triggered from an inline script in the footer allowing you to perform customisation to the page as early as possible (before the $(document).ready
event).
acf.addAction('prepare', function(){
$('#my-element').hide();
});
ready
Triggered during the $(document).ready()
event.
acf.addAction('ready', function(){
$('#my-element').hide();
});
load
Triggered during the $(window).load()
event.
acf.addAction('load', function(){
$('#my-element').hide();
});
resize
Triggered during the $(window).resize()
event.
acf.addAction('resize', function(){
$('#my-element').resizeWidth();
});
unload
Triggered during the $(window).unload()
event.
acf.addAction('unload', function(){
$('#my-element').remove();
});
append
Triggered when new HTML is added to the page such as within a media modal popup. The jQuery element being appended is passed as a parameter.
acf.addAction('append', function( $el ){
$el.find('.my-element').hide();
});
remove
Triggered when HTML is removed from the page. For example, when removing a repeater row. The jQuery element being removed is passed as a parameter.
acf.addAction('remove', function( $el ){
$el.find('.my-element').doThing();
});
new_field
Triggered when a field is first initialised (either during “prepare” or “append”). This action is recommended over other ‘field’ actions if you wish to customize a field. This field action can also be targeted using a specific type, name or key.
var myCallback = function( field ){
// add class to this field
field.$el.addClass('my-class');
// add click event to this field's button
field.on('click', 'button', function( e ){
e.preventDefault();
alert('Special event');
});
};
acf.addAction('new_field', myCallback);
acf.addAction('new_field/type=image', myCallback); // image fields
acf.addAction('new_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('new_field/key=field_123456', myCallback); // field with key "field_123456"
prepare_field
Triggered during the “prepare” action for each field. This field action can also be targeted using a specific type, name or key.
acf.addAction('prepare_field', myCallback); // all fields
acf.addAction('prepare_field/type=image', myCallback); // image fields
acf.addAction('prepare_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('prepare_field/key=field_123456', myCallback); // field with key "field_123456"
ready_field
Triggered during the “ready” action for each field. This field action can also be targeted using a specific type, name or key.
acf.addAction('ready_field', myCallback); // all fields
acf.addAction('ready_field/type=image', myCallback); // image fields
acf.addAction('ready_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('ready_field/key=field_123456', myCallback); // field with key "field_123456"
load_field
Triggered during the “load” action for each field. This field action can also be targeted using a specific type, name or key.
acf.addAction('load_field', myCallback); // all fields
acf.addAction('load_field/type=image', myCallback); // image fields
acf.addAction('load_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('load_field/key=field_123456', myCallback); // field with key "field_123456"
append_field
Triggered during the “append” action for each field. This field action can also be targeted using a specific type, name or key.
acf.addAction('append_field', myCallback); // all fields
acf.addAction('append_field/type=image', myCallback); // image fields
acf.addAction('append_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('append_field/key=field_123456', myCallback); // field with key "field_123456"
remove_field
Triggered when a field is removed. This field action can also be targeted using a specific type, name or key.
acf.addAction('remove_field', myCallback); // all fields
acf.addAction('remove_field/type=image', myCallback); // image fields
acf.addAction('remove_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('remove_field/key=field_123456', myCallback); // field with key "field_123456"
hide_field
Triggered when a field is hidden. This field action can also be targeted using a specific type, name or key.
acf.addAction('hide_field', myCallback); // all fields
acf.addAction('hide_field/type=image', myCallback); // image fields
acf.addAction('hide_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('hide_field/key=field_123456', myCallback); // field with key "field_123456"
show_field
Triggered when a hidden field is shown. This field action can also be targeted using a specific type, name or key.
acf.addAction('show_field', myCallback); // all fields
acf.addAction('show_field/type=image', myCallback); // image fields
acf.addAction('show_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('show_field/key=field_123456', myCallback); // field with key "field_123456"
disable_field
Triggered when a field is disabled (conditional logic). This field action can also be targeted using a specific type, name or key.
acf.addAction('disable_field', myCallback); // all fields
acf.addAction('disable_field/type=image', myCallback); // image fields
acf.addAction('disable_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('disable_field/key=field_123456', myCallback); // field with key "field_123456"
enable_field
Triggered when a disabled field is enabled (conditional logic). This field action can also be targeted using a specific type, name or key.
acf.addAction('enable_field', myCallback); // all fields
acf.addAction('enable_field/type=image', myCallback); // image fields
acf.addAction('enable_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('enable_field/key=field_123456', myCallback); // field with key "field_123456"
invalid_field
Triggered when a field value fails validation. This field action can also be targeted using a specific type, name or key.
acf.addAction('invalid_field', myCallback); // all fields
acf.addAction('invalid_field/type=image', myCallback); // image fields
acf.addAction('invalid_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('invalid_field/key=field_123456', myCallback); // field with key "field_123456"
valid_field
Triggered when an invalid field value passes validation. This field action can also be targeted using a specific type, name or key.
acf.addAction('valid_field', myCallback); // all fields
acf.addAction('valid_field/type=image', myCallback); // image fields
acf.addAction('valid_field/name=hero_image', myCallback); // fields named "hero_image"
acf.addAction('valid_field/key=field_123456', myCallback); // field with key "field_123456"
date_picker_init
Called when a date picker has been initialized. Added in v5.5.8
acf.addAction('date_picker_init', function( $input, args, field ){
// $input (jQuery) text input element
// args (object) args given to the datepicker function
// field (object) field instance
});
date_time_picker_init
Called when a date time picker has been initialized. Added in v5.5.8
acf.addAction('date_time_picker_init', function( $input, args, field ){
// $input (jQuery) text input element
// args (object) args given to the datepicker function
// field (object) field instance
});
time_picker_init
Called when a time picker has been initialized. Added in v5.5.8
acf.addAction('time_picker_init', function( $input, args, field ){
// $input (jQuery) text input element
// args (object) args given to the datepicker function
// field (object) field instance
});
select2_init
Called when a Select2 element has been initialized. Added in v5.5.8
acf.addAction('select2_init', function( $select, args, settings, field ){
// $select (jQuery) select element
// args (object) args given to the select2 function
// settings (object) settings given to the acf.select2 function
// field (object) field instance
});
wysiwyg_tinymce_init
Called when a WYSIWYG tinymce element has been initialized. Added in v5.5.8
acf.addAction('wysiwyg_tinymce_init', function( ed, id, mceInit, field ){
// ed (object) tinymce object returned by the init function
// id (string) identifier for the tinymce instance
// mceInit (object) args given to the tinymce function
// field (object) field instance
});
wysiwyg_quicktags_init
Called when a WYSIWYG quickktags element has been initialized. Each tinymce instance can also contain a ‘text’ edit mode that shows basic ‘quicktag’ buttons. Added in v5.5.8
acf.addAction('wysiwyg_quicktags_init', function( qtag, id, qtInit, field ){
// qtag (object) quick tag object returned by the init function
// id (string) identifier for the qtag instance
// qtInit (object) args given to the quick tag function
// field (object) field instance
});
google_map_init
Called when a Google Map element has been initialized. Added in v5.5.11
acf.addAction('google_map_init', function( map, marker, field ){
// map (object) google map object returned by the google.maps.Map() function
// marker (object) marker object returned by the google.maps.Marker() function
// field (object) field instance
});
Filters
Filters are called at specific times to allow for customisation. Below is a list of available JS filters that you can hook into using the acf.addFilter()
function.
✋ If using the “pre 5.7” function acf.add_filter(), please be aware that any field instance parameter documented bellow will appear as a jQuery element for compatibility. This change is discussed in more detail later in the Compatibility section.
validation_complete
This filter allows the validation JSON response to be customized. Called after AJAX validation is complete but before errors are shown or the form is submitted.
acf.add_filter('validation_complete', function( json, $form ){
// check errors
if( json.errors ) {
// do something
}
// return
return json;
});
wysiwyg_tinymce_settings
This filter allows the tinyMCE settings to be customized for each WYSIWYG field. Called before the tinyMCE instance is created.
acf.add_filter('wysiwyg_tinymce_settings', function( mceInit, id, field ){
// do something to mceInit
// return
return mceInit;
});
wysiwyg_quicktags_settings
This filter allows the quicktags settings to be customized for each WYSIWYG field. Called before the text instance is created.
acf.add_filter('wysiwyg_quicktags_settings', function( qtInit, id, field ){
// do something to qtInit
// return
return qtInit;
});
date_picker_args
This filter allows the date picker settings to be customized for each date picker field. Called before the date picker instance is created. A full list of settings can be found here: https://api.jqueryui.com/datepicker/
acf.add_filter('date_picker_args', function( args, field ){
// do something to args
// return
return args;
});
date_time_picker_args
This filter allows the date time picker settings to be customized for each date time picker field. Called before the date time picker instance is created. A full list of settings can be found here: http://trentrichardson.com/examples/timepicker/
acf.add_filter('date_time_picker_args', function( args, field ){
// do something to args
// return
return args;
});
time_picker_args
This filter allows the time picker settings to be customized for each time picker field. Called before the time picker instance is created. A full list of settings can be found here: http://trentrichardson.com/examples/timepicker/
acf.add_filter('time_picker_args', function( args, field ){
// do something to args
// return
return args;
});
google_map_args
This filter allows the google maps settings to be customized for each google maps field. Called before the map instance is created.
acf.add_filter('google_map_args', function( args, field ){
// do something to args
// return
return args;
});
google_map_marker_args
This filter allows the google maps marker settings to be customized for each google maps field. Called before the map instance is created.
acf.add_filter('google_map_marker_args', function( args, field ){
// do something to args
// return
return args;
});
google_map_result
This filter allows the google maps field value to be modified after an API request has been made and a result has been returned.
acf.add_filter('google_map_result', function( result, geocoderResult, map, field ){
// do something to result
// return
return result;
});
select2_args
This filter allows the select2 settings to be customized for each select field before the select2 instance is created.
acf.add_filter('select2_args', function( args, $select, settings, field, instance ){
// do something to args
// return
return args;
});
select2_escape_markup
This filter allows the result of default HTML escaping for select2 templates and selections to be modified. Available since ACF 6.2.8.
acf.add_filter('select2_escape_markup', function( escaped_value, original_value, $select, settings, field, instance ){
// do something to the original_value to override the default escaping, then return it.
// this value should still have some kind of escaping for security, but you may wish to allow specific HTML.
if (field.data( 'name' ) == "select2_with_html") {
return my_custom_escaping_method( original_value );
}
// return
return escaped_value;
});
select2_ajax_data
This filter allows the data sent in an ajax request to be customized for each select field.
acf.add_filter('select2_ajax_data', function( data, args, $input, field, instance ){
// do something to data
// return
return data;
});
select2_ajax_results
This filter allows the data returned from an ajax request to be customized for each select field.
acf.add_filter('select2_ajax_results', function( json, params, instance ){
// do something to json
// return
return json;
});
color_picker_args
This filter allows the color picker (wpColorPicker) settings to be customized for each color picker field. This filter is called before the wpColorPicker instance is created. Added in v 5.3.6
acf.add_filter('color_picker_args', function( args, field ){
// do something to args
args.palettes = ['#5ee8bf', '#2f353e', '#f55e4f']
// return
return args;
});
Models
Models are the heart of ACF functionality. The acf.Model function provides convenient scaffolding for creating new instances to store data, add event listeners, and perform logic. A model can be created as a “once off” instance, or extended into a “class” for repeated use (such as the acf.Field class discussed later).
The following is a contrived example, but it demonstrates defining a model with a custom method, setting an attribute, and firing an event keyed to changes in that specific attribute.
var sidebar = new acf.Model({
wait: 'ready',
data: {
color: '#ffffff'
},
events: {
'click .select-color': 'onClick'
},
initialize: function(){
this.$el = $('#sidebar');
}
onClick: function( e, $el ){
// get color from data attribute on '.select-color' element
this.set('color', $el.data('color'));
// render
this.render();
},
render: function(){
this.$el.css('background-color', this.get('color'));
}
});
// interact directly with the sidebar variable
var color = sidebar.get('color');
All models and those that extend the base model have access to the following properties and functions.
cid model.cid
A special property of models, the cid or “client id” is a unique identifier automatically assigned to all models when they’re first created.
var instance = new acf.Model();
var id = instance.cid; // acf-123
data model.data
The data object used by get(), set() and has() to store data on the instance.
var instance = new acf.Model({
data: {
color: '#ffffff',
active: false
}
});
events model.events
A list of “jQuery events” that will be bound to methods in the format {“event selector” : “callback”}. The callback is scoped to the instance and the jQuery element is passed through as a second parameter.
var instance = new acf.Model({
events: {
'change': 'onChange',
'change input[type="text"]': 'onChangeText',
},
onChange: function(e, $el){
e.preventDefault();
var val = $el.val();
// do something
},
onChangeText: function(e, $el){
// do something for just text inputs and then call the normal change callback
this.onChange(e, $el);
}
});
actions model.actions
A list of actions that will be bound to methods in the format {“name” : “callback”}.
var instance = new acf.Model({
actions: {
'append': 'onAppend',
},
onAppend: function($el){
// $el has been added to the DOM.
}
});
filters model.filters
A list of filters that will be bound to methods in the format {“name” : “callback”}.
var instance = new acf.Model({
filters: {
'things': 'filterThings',
},
filterThings: function( things ){
things.push('zar');
return things;
}
});
var things = acf.applyFilters('things', ['foo', 'bar']);
priority model.priority
The priority used for the above actions and filters. Defaults to 10.
var instance = new acf.Model({
actions: {
'ready': 'onReady',
},
priority: 99,
onReady: function(){
// runs after other 'ready' callbacks
}
});
wait model.wait
Delays initialization until a specific action such as ‘ready’ or ‘load’.
var instance = new acf.Model({
wait: 'ready',
initialize: function(){
// runs during the 'ready' action when all elements have been rendered
this.$el = $('#some-element');
}
});
initialize model.initialize()
The “constructor” function which is called when creating an instance of a model.
var instance = new acf.Model({
initialize: function(){
this.doSomething();
}
});
get model.get(name)
Returns a value from the instance data.
var foo = instance.get('foo');
set model.set(name, value)
Stores a value in the instance data.
var value = 'bar';
instance.set('foo', value);
has model.has(name)
Returns true if data exists for the given name.
if( instance.has('foo') ) {
// do something
}
on model.on(event, selector, callback) or model.on(event, callback)
Adds an event listener to the instance.
instance.on('change', 'input[type="text"]', function( e ){
// similar to jQuery, "this" is scoped to the DOM element.
// get input val
var val = $(this).val();
instance.doSomething( val );
});
$ model.$(selector)
Runs the jQuery.$ function scoped to model.$el
var $button = instance.$('.my-button');
$el model.$el
The jQuery element for this instance used for adding events.
instance.$el.addClass('new-class');
extend model.extend(args)
The acf.Model class can be extended to create your own class. Take the following example.
var Person = acf.Model.extend({
data: {
firstName: '',
lastName: ''
},
// the 'changed' and 'changed:name' events trigger when changing data
events: {
'changed': 'render'
},
setup: function( props ){
// store data
$.extend(this.data, props);
// create element
this.$el = $('<div class="person"></div>');
},
initialize: function(){
this.show();
this.render();
},
show: function(){
$('body').append( this.$el );
},
hide: function(){
this.$el.remove();
},
render: function(){
this.$el.html( this.get('firstName') + ' ' + this.get('lastName') );
}
});
var person1 = new Person({ firstName: 'John', lastName: 'Smith' });
var person2 = new Person({ firstName: 'Jane', lastName: 'West' });
person2.set('lastName', 'Smith');
acf.Field
We use models to bring our fields to life. Each field is given an instance of the acf.Field model allowing a uniform way to interact with fields.
The acf.Field model extends from the acf.Model model meaning that it inherits all the properties and functions mentioned above.
The following is a contrived example, but it demonstrates how to interact with a field instance.
// get the field instance
var field = acf.getField('field_123456');
// show error if no value
if( !field.val() ) {
field.showError('Please add a value');
}
// add an event
field.on('click', '.disable-button', function( e ){
field.disable();
});
// add class
field.$el.addClass('my-field');
type field.type
The field type name (“image”, “text”, etc).
val field.val([value])
Returns the field’s value or sets a new value if one is given.
if( !field.val() ) {
field.val('Default value');
}
$control field.$control()
Some fields (such as the image field) use a “control” element to wrap the “input” and pass data attributes. This function returns this “control” jQuery element.
field.$control().addClass('customized');
$input field.$input()
Most fields (such as the text field) use an “input” element to collect and send values. This function returns this “input” jQuery element.
field.$input().focus();
disable field.disable()
Disables the field’s input elements.
field.disable();
enable field.enable()
Enables the field’s input elements.
field.enable();
hide field.hide()
Hides the field element.
field.hide();
show field.show()
Shows the field element.
field.show();
remove field.remove()
Removes the field from the DOM and unregisters all assigned events, actions and filters.
field.remove();
parent field.parent()
Returns the field’s parent instance or false if no parent.
var parent = field.parent();
if( parent ) {
parent.doSomething();
}
showNotice field.showNotice( args )
Displays a text notice within the field.
field.showNotice({
text: "Please select at least one of these items",
type: '', // warning, error, success
dismiss: true, // allow notice to be dismissed
});
removeNotice field.removeNotice()
Removes the field’s current notice.
Events
The acf.Field model triggers custom events which can be listened to just like a jQuery change event. These events are similar to the Field Actions but allow you to listen directly to a specific field instance.
Name | Description |
---|---|
removeField |
Triggered when a field is removed. |
hideField |
Triggered when a field is hidden. |
showField |
Triggered when a hidden field is shown. |
disableField |
Triggered when a field is disabled. |
enableField |
Triggered when a disabled field is enabled. |
invalidField |
Triggered when a field value fails validation. |
validField |
Triggered when an invalid field value passes validation. |
sortstartField |
Triggered when a field is being moved in the DOM. |
sortstopField |
Triggered when a field has finished being moved in the DOM. |
The following example shows how to listen to a field event.
// get the field instance
var field = acf.getField('field_123456');
// do something on show
field.on('showField', function(){
field.doSomething();
});
extend field.extend( props )
The acf.Field model can be extended to create your own field type “class”. This makes developing custom field type easier than ever before.
Here is an example of the URL Field class taken from the ACF source code. Please note that the class is “registered” using the acf.registerFieldType( Field )
function which is needed for ACF to correctly select this “class” during initialization.
(function($){
var Field = acf.Field.extend({
type: 'url',
events: {
'keyup input[type="url"]': 'onkeyup'
},
$control: function(){
return this.$('.acf-input-wrap');
},
$input: function(){
return this.$('input[type="url"]');
},
initialize: function(){
this.render();
},
isValid: function(){
// vars
var val = this.val();
// url
if( val.indexOf('://') !== -1 ) {
return true;
}
// protocol relative url
if( val.indexOf('//') === 0 ) {
return true;
}
// return
return false;
},
render: function(){
// add class
if( this.isValid() ) {
this.$control().addClass('-valid');
} else {
this.$control().removeClass('-valid');
}
},
onkeyup: function( e, $el ){
this.render();
}
});
acf.registerFieldType( Field );
})(jQuery);
acf.Condition
The acf.Condition model is used to define the different types of conditional logic available for use between fields. Similar to acf.Field, this model can be extended to create new condition types.
type condition.type
The condition’s private ID used for storage/lookup. Must be unique like “hasValue”, “hasNoValue”, etc.
operator condition.operator
The condition’s public ID used in HTML attributes. Should best match a programatic operator like “==”, “!=”, etc.
label condition.label
The condition’s label visible in the dropdown when selecting a conditional rule.
fieldTypes condition.fieldTypes
An array of field types that this condition applies to. Example [‘text’, ‘textarea’].
match condition.match(rule, field)
This function is called to determine if the condition is true or false. Must return a boolean value. See the following example taken from the “Has any value” rule.
// taken from the "Has any value" rule
{
match: function( rule, field ){
// return true if field has any value
return (field.val() ? true : false);
}
}
choices condition.choices(fieldObject)
This function is called to return the available choices for this condition. The selected “field object” is passed through as a parameter which can be used to lookup settings (the selectEqualTo model looks up the field’s “choices” textarea setting). The function can return either an array of choices (which will result in a dropdown being created) or custom HTML.
// taken from the "EqualTo" rule
{
choices: function( fieldObject ){
return '<input type="text" />';
}
}
// taken from the "trueFalseEqualTo" rule
{
choices: function( fieldObject ){
return [
{
id: 1,
text: 'Checked'
}
];
}
}
extend condition.extend( props )
The acf.Condition model can be extended to create your own condition type “class”. This makes developing custom conditions super easy.
Here is an example of the lessThan class taken from the ACF source code. Please note that the class is “registered” using the acf.registerConditionType( Condition )
function which is needed for ACF to correctly select this “class” during initialization.
(function($){
var LessThan = GreaterThan.extend({
type: 'lessThan',
operator: '<',
label: __('Value is less than'),
match: function( rule, field ){
var val = field.val();
if( val instanceof Array ) {
val = val.length;
}
return isLessThan( val, rule.value );
},
choices: function( fieldObject ){
return '<input type="number" />';
}
});
acf.registerConditionType( LessThan );
})(jQuery);
registerConditionForFieldType acf.registerConditionForFieldType(conditionType, fieldType)
Connects an registered condition type to a registered field type. This can be used to add basic condition types to your own custom field type.
(function($){
var Field = acf.Field.extend({
type: 'my_custom_field',
// ...
});
acf.registerFieldType( Field );
acf.registerConditionForFieldType('hasValue', 'my_custom_field');
acf.registerConditionForFieldType('hasNoValue', 'my_custom_field');
})(jQuery);
Compatibility
The acf object extends a “compatibility layer” where we keep any deprecated or changed functions and properties. This allows our library to stay organised as well as provide compatibility with existing code. The biggest changes to our library that requires backwards compatibility are those to the “hook” functions acf.add_action()
and acf.add_filter()
.
Prior to version 5.7, all callbacks for Field Actions or Field Filters would receive a jQuery element parameter. This has changed in version 5.7 as these same actions now receive a field instance.
To provide backwards compatibility, we didn’t change the hook names, but we did change the function names. This allows us to apply a “compatibility layer” to the parameters depending on which function you use. To better illustrate, please look at the following backwards compatible functions.
add_action acf.add_action(action, callback, priority, context)
An alias of acf.AddAction()
with a twist. Any action that would normally receive a field instance will receive a jQuery element.
// old: acf.add_action
acf.add_action('ready_field', function( $field ){
$field.addClass('old-way');
});
// new: acf.addAction
acf.addAction('ready_field', function( field ){
field.$el.addClass('new-way');
});
add_filter acf.add_filter(filter, callback, priority, context)
An alias of acf.addFilter()
with a twist. Any filter that would normally receive a field instance will receive a jQuery element.
// old: acf.add_filter
acf.add_filter('color_picker_args', function( args, $field ){
// do something to the field
$field.addClass('old-way');
// return
return args;
});
// new: acf.addAction
acf.addFilter('color_picker_args', function( args, field ){
// do something to the field
field.$el.addClass('new-way');
// return
return args;
});
Changelog
- Rebuilt JS library in version 5.7
Further Reading
Believe it or not, this documentation only scrapes the surface of the ACF JavaScript API! If you are interested in learning more about a specific function, finding the full list of models or are in need of more code examples, please take a look at the acf-input.js
source code located in the plugin folder assets/js/acf-input.js.
Happy coding, The ACF team.