Вопрос или проблема
У меня есть пользовательский тип записи, называемый prognosis
, с 3 пользовательскими таксономиями: Страна, Соревнование и Спорт, я также добавил несколько пользовательских полей ACF. У меня есть другой пользовательский тип записи, называемый analysis
, с полем связи ACF prognosis
, подключенным к пользовательскому типу записи prognosis
.
Я хочу иметь возможность отображать определенные таксономии, с которыми пользовательский тип записи prognosis
связан, через поле связи, которое я выбрал в пользовательском типе записи analysis
. Я пытался отлаживать поле связи prognosis
, но не вижу никаких таксономий, прикрепленных к нему.
Мне удалось решить свою проблему, пройдя в цикле через функцию get_the_terms(). В моем случае я также создал шорткод.
function display_taxonomy() {
$prognoses = get_field('prognosis');
ob_start();
if( $prognoses ):
foreach( $prognoses as $prognosis ):
$terms = get_the_terms( $prognosis->ID , 'my_custom_taxonomy' );
foreach ( $terms as $term ):
echo $term->name;
endforeach;
endforeach;
endif;
return ob_get_clean();
}
add_shortcode( 'my_custom_taxonomy_shortcode', 'display_taxonomy' );
.
Ответ или решение
Для решения задачи, связанной с извлечением пользовательских таксономий из поля связи в Advanced Custom Fields (ACF), вам необходимо организационное понимание структуры ваших пользовательских типов записей и таксономий. Давайте разберемся подробнее в вашем конкретном случае.
1. Структура данных
Вы создали два пользовательских типа записей:
- prognosis: Содержит три пользовательских таксономии — Country, Competition и Sport.
- analysis: Содержит поле связи prognosis, которое подключается к типу записей prognosis.
2. Проблема
Необходимо отобразить таксономии, связанные с выбранным полем связи в записи анализа. Вы не смогли увидеть присоединённые таксономии при первом обращении к полю связи, что является распространенной проблемой при работе с ACF и таксономиями.
3. Решение
Вы нашли выход, используя функцию get_the_terms()
. Это полный и правильный подход. Давайте подробнее рассмотрим реализацию через шорткод для вывода таксономий.
4. Код шорткода
Ваш код шорткода выглядит корректно, однако я дам несколько пояснений и предложу небольшие улучшения:
function display_taxonomy() {
$prognoses = get_field('prognosis'); // Получаем поле связи с прогнозами
ob_start(); // Начинаем буферизацию вывода
if( $prognoses ): // Проверяем, есть ли связанные прогнозы
foreach( $prognoses as $prognosis ): // Проходим по каждому прогнозу
// Здесь можно указать конкретную таксономию, например 'country', 'competition' или 'sport'
$terms = get_the_terms( $prognosis->ID , 'my_custom_taxonomy' );
if ( !empty($terms) && !is_wp_error($terms) ) { // Проверяем наличие терминов и на наличие ошибок
foreach ($terms as $term):
echo esc_html($term->name) . '<br>'; // Выводим имена таксономий с безопасностью
endforeach;
}
endforeach;
else:
echo 'Нет доступных прогнозов.'; // Отображаем сообщение, если нет прогнозов
endif;
return ob_get_clean(); // Возвращаем буферизированный вывод
}
add_shortcode( 'my_custom_taxonomy_shortcode', 'display_taxonomy' ); // Регистрация шорткода
5. Оптимизация и безопасность
- Проверка на ошибки: Важно использовать проверки на наличие ошибок (
!is_wp_error($terms)
), чтобы избежать возможных проблем, если ACF вернет ошибку. - Безопасность вывода: Используйте
esc_html()
при выводе имен таксономий, чтобы избежать XSS-уязвимостей. - Улучшение пользовательского опыта: Добавьте сообщение о том, что не найдено таксономий или прогнозов, если они отсутствуют.
6. Вывод
После реализации вышеописанного шорткода, вы сможете вставить [my_custom_taxonomy_shortcode]
в любую запись типа analysis, и таксономии, связанные с прогнозами, будут отображены корректно. Это поможет улучшить восприятие данных на вашем сайте и сделать его более функциональным.
Итог
Это решение является универсальным и может быть адаптировано под различные структуры данных в зависимости от ваших нужд. Предлагаемые исправления и улучшения касаются как пользовательского опыта, так и безопасности, что крайне важно в современных веб-приложениях.