Conditionally Show an ACF Field based on a Field in another Field Group

ACF is coming out with more powerful conditional logic, which is awesome! I don’t know yet ALL of what it will include — but in the meantime, have you ever wanted to conditionally show an ACF field in the admin based on another field in a different field group?

I have wanted to. In fact, I just finished doing that for a client. So naturally, I thought why not write up a little tutorial about it?

Here’s our example scenario:

We want show a field on the Add/Edit User Profile screen based on which User Roles are selected in Theme Options. I’m using an ACF add-on to create a Role Field, but other than that, all you need is ACF and your handy dandy code editor.

First we’re going to create our respective fields:

Here we’ve got an Options field group with a User Role field (this screenshot is from a real website we’ve worked on).

In this field group, we’ve got an example field and we’ve assigned it to the Add/Edit User screen.

Make sure the field keys are visible (Screen Options > Field Keys), and now grab the Field Key of the field on the Add/Edit User Screen.

We’re going to be using the load_field filter to affect the visibility of the example field. We’ll hook in a function that checks the role of the user who’s Add/Edit screen we’re viewing, and then cross-reference that with the other field where we’ve selected user roles.

add_filter('acf/load_field/key=field_5a6104c98687a', 'example_field_visbility');
 function example_field_visbility ($field) {
     // this global variable is available to us on the add/edit user screen
     global $user_id;
 // we're going to use the user_id to grab the User object group which will have their role(s) listed in it     $user = get_user_by( 'ID', $user_id); $user_role = $user->roles; // now we're going to grab our Theme Options field that has all the roles and grab the roles array for it $roles_with_files = get_field('roles_with_files', 'option'); $roles_allowed = $roles_with_files['roles']; // if the user role is in the $roles_allowed array, allow the field to be returned (aka shown),  // otherwise, don't return the field, which means it won't appear if ( (in_array( $user_role[0], (array) $roles_allowed )) ) {     return $field; }

Wasn’t that easy?

Get helpful tutorials like this on WordPress development every week in your inbox.

No spam, I promise.