Как можно настроить генерацию имен полей, что бы не повторялись?

Ссылка скопирована
1 ответ

Для сайта нужно создавать много полей в acf
Ярлык вписываю, генерируется имя поля, далее приходится править имя
т.к очень много полей с повторяющими названиями ярлыков, тем самым имена полей генерируются автоматом и повторяются
с помощью чего можно сделать какую то проверку? что бы если имя поля повторяется, что бы присваивало дополнительно какие то знаки или цифры в названии
как допустим при создании записи или страницы

вообще без разницы что в его названии будет, главное что бы не было дублей

Дополнительно:

с помощью чего можно сделать какую то проверку? что бы если имя поля повторяется, что бы присваивало дополнительно какие то знаки или цифры в названии
как допустим при создании записи или страницы

С помощью скрипта?

  • Михаил Р., ну это понятно
    где откопать подобное? в гуглопоиске ничего не нашел

    а вотр
    acf/save_post

    function generate_unique_field_name($field_name, $field_group_key) {     global $wpdb;      $escaped_field_name = $wpdb->esc_like($field_name) . '%';      $existing_field_names = $wpdb->get_col(         $wpdb->prepare(             "SELECT DISTINCT meta_key FROM $wpdb->postmeta WHERE meta_key LIKE %s AND post_id IN (                 SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'field_group_key' AND meta_value = %s             )",             $escaped_field_name,             $field_group_key         )     );      $i = 1;     $new_field_name = $field_name;      while (in_array($new_field_name, $existing_field_names)) {         $new_field_name = $field_name . '_' . $i;         $i++;     }      return $new_field_name; }  function update_field_names($post_id) {     // Получаем данные о группе полей, связанной с постом     $field_groups = acf_get_field_groups(array(         'post_id' => $post_id,     ));      if (empty($field_groups)) {         return;     }      foreach ($field_groups as $field_group) {         $fields = acf_get_fields($field_group);          foreach ($fields as $field) {             if ($field['key']) {                 $field_name = $field['name'];                 $field_key = $field['key'];                  // Генерируем уникальное имя поля                 $new_field_name = generate_unique_field_name($field_name, $field_group['key']);                  // Обновляем имя поля                 update_field('field_'. $field_key, 'field_' . $new_field_name);             }         }     } }  add_action('acf/save_post', 'update_field_names', 20);

    function generate_unique_field_name($field_name, $field_group_key) { global $wpdb; $escaped_field_name = $wpdb->esc_like($field_name) . '%'; $existing_field_names = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_key FROM $wpdb->postmeta WHERE meta_key LIKE %s AND post_id IN ( SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'field_group_key' AND meta_value = %s )", $escaped_field_name, $field_group_key ) ); $i = 1; $new_field_name = $field_name; while (in_array($new_field_name, $existing_field_names)) { $new_field_name = $field_name . '_' . $i; $i++; } return $new_field_name; } function update_field_names($post_id) { // Получаем данные о группе полей, связанной с постом $field_groups = acf_get_field_groups(array( 'post_id' => $post_id, )); if (empty($field_groups)) { return; } foreach ($field_groups as $field_group) { $fields = acf_get_fields($field_group); foreach ($fields as $field) { if ($field['key']) { $field_name = $field['name']; $field_key = $field['key']; // Генерируем уникальное имя поля $new_field_name = generate_unique_field_name($field_name, $field_group['key']); // Обновляем имя поля update_field('field_'. $field_key, 'field_' . $new_field_name); } } } } add_action('acf/save_post', 'update_field_names', 20);

    не работает

  • Ответы:

    Есть функция wp_unique_post_slug(), которая не дает публиковать записи с двумя одинаковыми слагами. Можно использовать ее или по аналогии написать такую же для полей wp_postmeta

    • а может я не правильно использую поля?
      может по метаданным их выводить?
      хотя что то, что другое геморрой
      хочется проще, но увы
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    В ACF лучше не надеяться на автоматическую генерацию имён полей, если у Вас много похожих блоков. Label может повторяться, а name должен быть стабильным и понятным, потому что по нему потом обращаются шаблоны, импорты, REST API и фильтры.

    Нормальная практика — ввести короткий префикс для группы или блока. Например:

    hero_title
    hero_text
    hero_button_url
    faq_question
    faq_answer
    pricing_min
    pricing_optimal

    hero_title hero_text hero_button_url faq_question faq_answer pricing_min pricing_optimal

    Если поля повторяются в разных группах, это не всегда проблема: у ACF каждое поле имеет уникальный field key вида field_.... Но если одинаковые field name используются на одной записи и в одной области данных, значения могут путаться.

    Для больших проектов используйте ACF Local JSON. Тогда изменения полей лежат в файлах, их можно отслеживать в Git, смотреть diff и не бояться, что кто-то случайно создал дубликаты в админке.

    Автоматически дописывать суффиксы к полям можно через кастомный JS в админке ACF, но я бы делал это только как внутренний инструмент. Слишком легко получить имена вроде title_23, которые потом невозможно поддерживать. Лучше заранее продумать структуру: группа, префикс, назначение поля. Для повторяемых сущностей используйте Repeater/Flexible Content, а не десятки вручную созданных похожих полей.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно