Вопрос или проблема
Как я могу убедиться, что данные, сохраненные полем Relationship в Advanced Custom Fields, когда они находятся на странице Options для определенного типа записи, хранятся отдельно?
Подробности ниже:
У меня есть группа полей ACF под названием “Features”, содержащая поле Relationship.
Она предназначена для предварительной настройки некоторых избранных публикаций для нескольких пользовательских типов записей – “Reports” и “Articles”.
Для этих типов записей в том же коде, который регистрирует каждый тип записи, я создал подстраницу Options следующим образом…
// Поддержка демонстрации Features для этого типа записи через ACF
if( function_exists('acf_add_options_page') ) {
// добавляем подстраницу
acf_add_options_sub_page(array(
'page_title' => 'Articles Features',
'menu_title' => 'Articles Features',
'menu_slug' => 'articles-features',
'capability' => 'edit_posts',
'parent_slug' => 'edit.php?post_type=article',
'position' => false,
'icon_url' => false
));
}
То же самое для “Reports”.
Затем я применяю группу полей “Features” к обеим подстраницам Options – “Articles Features” и “Reports Features”.
Проблема в том, что данные одинаковы.
То есть шесть записей Relationship, установленных для “Reports Features”, также отображаются на подстранице Options для “Articles Features”. Изменение одного поля Relationship перезаписывает другое.
Как я могу обеспечить, чтобы эти две вещи были раздельны, чтобы я мог сохранять функции отдельно для каждого типа записи, не создавая группу полей заново?
Метод, который нужно использовать, таков…
В объявлении acf_add_options_sub_page
добавьте 'post_id' => 'article'
в качестве параметра. (post_id)
Вот как данные поля, введенные на странице Options, соответствующей моему типу записи, будут сохранены.
На этапе отображения используйте $featured_posts = get_field('featured_posts', 'article');
Оба ‘article’ и ‘report’ используются.
В моем случае, на этапе отображения, я использую $queried_object->name
, чтобы динамически определить либо ‘article’, либо ‘report’ типы записей.
Благодарность hube2
Ответ или решение
Чтобы гарантировать, что данные, сохраненные в поле связи Relationship в Advanced Custom Fields (ACF), на странице параметров Options для типа записи Post, остаются уникальными для каждой опции, вы можете использовать параметр ‘post_id’. Этот метод позволяет сохранять данные отдельно для каждого типа записи, не создавая новую группу полей.
Теория:
Когда вы создаете подстраницы Options pages при помощи функции acf_add_options_sub_page
, данные поля сохраняются по умолчанию в одной и той же глобальной области, если не указать иначе. Это приводит к тому, что при изменении данных на одной странице изменения отражаются и на другой. Избежать этого позволяет использование уникального идентификатора ‘post_id’, который определяет, где именно в базе данных должны сохраняться данные.
Пример:
Ваша задача — создать отдельные подстраницы "Articles Features" и "Reports Features" для разных типов постов. Каждая из этих подстраниц использует одну и ту же группу полей "Features". Однако без дополнительных настроек данные будут перезаписываться, так как используются одни и те же поля.
Итак, чтобы разделить данные, в параметры функции acf_add_options_sub_page
добавьте 'post_id' => 'article'
и 'post_id' => 'report'
соответственно для каждой подстраницы. Это гарантирует, что данные из Relationship полей будут сохраняться отдельно для каждой опции и не будут перезаписывать друг друга.
Применение:
// Добавляем страницу опций для Articles
acf_add_options_sub_page(array(
'page_title' => 'Articles Features',
'menu_title' => 'Articles Features',
'menu_slug' => 'articles-features',
'capability' => 'edit_posts',
'parent_slug' => 'edit.php?post_type=article',
'post_id' => 'article' // Уникальный идентификатор для сохранения
));
// Аналогично для Reports
acf_add_options_sub_page(array(
'page_title' => 'Reports Features',
'menu_title' => 'Reports Features',
'menu_slug' => 'reports-features',
'capability' => 'edit_posts',
'parent_slug' => 'edit.php?post_type=report',
'post_id' => 'report' // Уникальный идентификатор для сохранения
));
Для получения данных на фронтенде используйте функцию get_field
с соответствующим идентификатором ‘post_id’:
$featured_posts = get_field('featured_posts', 'article'); // Для статей
$featured_posts = get_field('featured_posts', 'report'); // Для отчетов
Этот подход обеспечивает независимость данных и позволяет вам управлять характеристиками для каждого типа записи отдельно.