ACF – Извлечение пользовательской таксономии из поля связи

Вопрос или проблема

У меня есть пользовательский тип записи, называемый 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, и таксономии, связанные с прогнозами, будут отображены корректно. Это поможет улучшить восприятие данных на вашем сайте и сделать его более функциональным.

Итог

Это решение является универсальным и может быть адаптировано под различные структуры данных в зависимости от ваших нужд. Предлагаемые исправления и улучшения касаются как пользовательского опыта, так и безопасности, что крайне важно в современных веб-приложениях.

Оцените материал
Добавить комментарий

Капча загружается...