htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

ACF custom location rule

A

J’ai récemment été confronté à un cas un peu particulier, je devais ajouter une metabox via ACF uniquement si le modèle de la page parente était spécifique. Après quelques recherches j’ai finalement pu ajouter ma règle dans la création des champs ACF. Petit exemple:

La doc d’ACF sur le sujet est assez bien faite et j’ai aussi trouvé un autre article qui donne quelques astuces utiles. Bref, commençons!

Déclarer la nouvelle location

Rien de bien méchant ici, on utilise le filtre fourni par ACF et on ajoute la règle. J’ai choisie de la nommer « page_ancestor_model ».

function w2p_acfrule_type_page_ancestor( $choices ) {
  $choices['Page']['page_ancestor_model'] = 'Modèle de page parente';
  return $choices;
}
add_filter( 'acf/location/rule_types', 'w2p_acfrule_type_page_ancestor' );

Assigner des valeurs à la règle

Ici on va utiliser un filtre dynamique d’ACF: « ‘acf/location/rule_values/ ».
Comme j’ai choisi « page_ancestor_model » comme nom de ma règle, il faut l’ajouter au filtre; ce qui nous donne: « acf/location/rule_values/page_ancestor_model ».
Vous pourriez avoir besoin de prendre exemple sur les règles déjà existantes pour assigner les valeurs qui correspondent à votre cas. Allez jeter un oeil sur le code source d’ACF pour voir comment c’est fait.
Dans notre cas, il faut lister les templates des pages et ajouter le template par défaut. Voici ce que ça donne:

function w2p_acfrule_values_page_ancestor_model( $choices ) {
  $default['default'] = 'Modèle de base';
  $list = wp_get_theme()->get_page_templates();
  $choices = array_merge($default, $list);
  return $choices;
}
add_filter( 'acf/location/rule_values/page_ancestor_model', 'w2p_acfrule_values_page_ancestor_model' );

Faire la comparaison lors de l’affichage

Il ne nous reste plus qu’a faire la règle. En gros c est comparer les valeurs et renvoyer une boolean. Nous avons à nouveau un filtre dynamique « acf/location/rule_match/ » que l’on vient compléter.
Ensuite « get_post_meta($parent, ‘_wp_page_template’, true); » retourne un valeur vide quand le template par défaut est utilisé. j’ai donc corrigé pour que cela colle en ligne 10.
Voici:

function w2p_acfrule_match_page_ancestor( $match, $rule, $options ) {
	if ( ! $options['post_id'] || 'page' !== get_post_type( $options['post_id'] ) ){
    return false;
  }
	$ancestors = get_ancestors( $options['post_id'], 'page' );
  if($ancestors){
    $root = count($ancestors) - 1;
    $parent = $ancestors[$root];
    $tplname = get_post_meta($parent, '_wp_page_template', true);
    if(empty($tplname)){ $tplname = 'default'; }
    if($rule['operator'] == "=="){
      $match = ( $rule['value'] === $tplname );
    }elseif($rule['operator'] == "!="){
      $match = ( $rule['value'] !== $tplname );
    }
  }
	return $match;
}
add_filter( 'acf/location/rule_match/page_ancestor_model', 'w2p_acfrule_match_page_ancestor', 10, 3 );

Et voilà, c’est fini.
Vous pourriez aussi ajouter des opérateurs de comparaison mais je n’en ai pas eu besoin jusqu’à présent. Si vous en avez besoin regardez du coté de ce filtre: « acf/location/rule_operators ».

htmlcss.fr Des tutos ou tutoriels Wordpress, html, php ou javascript.

François Riant

Je m’appelle François Riant. Je travail dans les métiers du web depuis 2006. Mon expérience m’a amené à changer plusieurs fois de technologie.

Aujourd’hui je cherche à partager mon expérience et j’y trouve du de plaisir. Je travail actuellement chez W2P Digital.
Je ne prends donc pas de mission en freelance.

Si vous avez une remarque ou une question; vous pouvez me joindre sur francois.riant@gmail.com