Cum adaugi (programatic) condiționale în ACF

ACF va introduce în noua versiune niște câmpuri foarte mișto, numite clone fields. Pe scurt, asta va permite definirea unor field groups astfel încât să le poți refolosi în alte field groups.

Doar că apar anumite probleme. De exemplu, nu poți avea un condițional dintr-un field group care să afecteze un câmp dintr-o clonă. Nu poți din UI.

Elliot mi-a dat o idee foarte bună: să mă leg de hook-ul acf/load_field. Prin urmare, am făcut fix asta:

function addAcfConditional($field, $target, $query)
{
  if ($field['key'] == $target) {
    $conditional_AND = is_array($query) ? $query : explode('&', $query);
    $rules = [];
    $pattern = '/==|=|!=/';

    foreach ($conditional_AND as $condition) {
      preg_match($pattern, $condition, $operator);
      $params = preg_split($pattern, $condition);

      $rules[] = ['field' => $params[0], 'operator' => ($operator[0] == '=' ? '==' : $operator[0]), 'value' => $params[1]];
    }

    if (is_array($field['conditional_logic'])) {
      $field['conditional_logic'][] = $rules;
    } else {
      $field['conditional_logic'] = [$rules];
    }
  }

  return $field;
}

Și se folosește așa:

add_filter('acf/load_field', function ($field) {
  $field = addAcfConditional($field, 'field_5797c837e4e2a', 'field_579c88a03020f=internal');
  $field = addAcfConditional($field, 'field_5797c837e4e2a', 'field_579c88a03020f==foo');
  $field = addAcfConditional($field, 'field_5797c837e4e2a', 'field_579c88a03020f!=bar');
  return $field;
});

După cum vezi, este foarte dependent de ID-urile fiecărui câmp, prin urmare ar fi bine să adaugi aceste condiționale atunci când ești sigur că lucrurile nu se mai schimbă.

Sigur, ai putea face o chestie mult mai complexă, astfel încât să poți folosi numele field-ului, în loc de ID. Dar consider că ar fi mult mai complexă decât ar trebui să fie :slight_smile:

Despre cum excludem anumite câmpuri am scris pe blog .

Sper că e voie cu link-uri :smiley:

1 Like