Как можно настроить генерацию имен полей, что бы не повторялись?
Для сайта нужно создавать много полей в 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
- а может я не правильно использую поля?
может по метаданным их выводить?
хотя что то, что другое геморрой
хочется проще, но увы
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В ACF лучше не надеяться на автоматическую генерацию имён полей, если у Вас много похожих блоков. Label может повторяться, а name должен быть стабильным и понятным, потому что по нему потом обращаются шаблоны, импорты, REST API и фильтры.
Нормальная практика — ввести короткий префикс для группы или блока. Например:
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, а не десятки вручную созданных похожих полей.