Forcer les options d’affichage des champs ACF dans WordPress

Advanced Custom Fields propose, pour chacun de ses champs, des options d’affichage, autant pour la valeur sur le front, que pour le champs lui-même dans le back-office.

Par exemple, un champ de type image peut être affiché sous trois formes : ID du média, URL de l’image, ou tableau PHP des données du fichier.

Voici un extrait de code pour forcer ces options, valable si l’on utilise ACF Pro.

 

Front-office :

Lorsqu’on développe un thème, on peut vouloir forcer l’un de ces paramètres, pour qu’il renvoie par exemple toujours le tableau des données du fichier dans le cas d’un champ image.

Pour cela, on s’appuie sur le hook acf/format_value/type=image (où image peut être remplacé par tous les types de champ ACF) :

add_filter('acf/format_value/type=image', 'kodex_acf_filter_image', 1, 3);
function kodex_acf_filter_image($value, $post_id, $field){
	remove_filter('acf/format_value/type=image', 'kodex_acf_filter_image', 1);
	$field['return_format'] = 'array';
	$newvalue = acf_format_value($value, $post_id, $field);
	return $newvalue;
}

Notez que la ligne remove_filter est indispensable pour éviter une boucle infinie.

Cet exemple for l’affichage pour un type de champs, mais vous pouvez également cibler un champs en particulier avec ces hooks :

acf/format_value/name={$field['_name']}
acf/format_value/key={$field['key']}

 

Back-office :

De la même manière, on peut influencer l’affichage du champ lui-même dans le back-office.

Par exemple, si nous souhaitons qu’aucun champ ACF de type WYSIWYG ne propose l’insertion de médias, nous nous baserons sur le hook acf/prepare_field/type=wysiwyg, comme ceci :

add_filter('acf/prepare_field/type=wysiwyg', 'kodex_acf_filter_wysiwyg', 1);
function kodex_acf_filter_wysiwyg($field){
	remove_filter('acf/prepare_field/type=wysiwyg', 'kodex_acf_filter_wysiwyg', 1);
	$field['media_upload'] = 0;
	return $field;
}

Ici aussi nous pouvons cibler un élément en particulier avec :

acf/prepare_field/name={$field['name']}
acf/prepare_field/key={$field['key']}