Как получить термин для текущего кастом поста без таксономии?

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

Мне нужно получить термин для текущего кастом поста динамически на сингл странице (например, для хлебных крошек)
Я использовал get_the_terms($post->ID, 'curr_post_tax')
Или как получить curr_post_tax текущего кастом поста
Или, может быть, вы знаете другие методы

Home>Catalog>Term>CurrProd

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

Чем не устраивает get_the_terms()?

  • Артем Золин, тем что для него нужно указывать таксономию. А я хочу, чтобы такс подставлялся автоматом в зависимости от поста.
  • greedy_wizard, не уверен, что так можно.
  • Ответы:

    function get_custom_post_term() {     global $wpdb;     $post_id = get_the_ID(); // Получаем ID текущего поста     $term = $wpdb->get_var( $wpdb->prepare(         "SELECT t.name         FROM {$wpdb->prefix}term_taxonomy AS tt         INNER JOIN {$wpdb->prefix}term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id         INNER JOIN {$wpdb->prefix}terms AS t ON t.term_id = tt.term_id         WHERE tt.taxonomy = 'curr_post_tax' AND tr.object_id = %d",         $post_id     ) );     return $term; }

    function get_custom_post_term() { global $wpdb; $post_id = get_the_ID(); // Получаем ID текущего поста $term = $wpdb->get_var( $wpdb->prepare( "SELECT t.name FROM {$wpdb->prefix}term_taxonomy AS tt INNER JOIN {$wpdb->prefix}term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN {$wpdb->prefix}terms AS t ON t.term_id = tt.term_id WHERE tt.taxonomy = 'curr_post_tax' AND tr.object_id = %d", $post_id ) ); return $term; }

    Вы можете вызвать эту функцию в вашей сингл-странице и использовать результат для создания хлебных крошек

    $current_term = get_custom_post_term(); echo '<div>Home>Catalog>Term>'.$current_term.'</div>';

    $current_term = get_custom_post_term(); echo '<div>Home>Catalog>Term>'.$current_term.'</div>';

    Нужно решить такую задачу?

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

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Термин без таксономии получить нельзя: термин всегда принадлежит конкретной таксономии. Но можно не зашивать имя таксономии вручную, а получить список таксономий, привязанных к текущему post type, и уже по ним найти термины текущей записи. Это нормальнее, чем писать прямой SQL в таблицы WordPress.

    $post_id = get_the_ID();
    $post_type = get_post_type($post_id);
    $taxonomies = get_object_taxonomies($post_type, 'names');
    $current_term = null;
     
    foreach ($taxonomies as $taxonomy) {
        $terms = get_the_terms($post_id, $taxonomy);
     
        if (! empty($terms) && ! is_wp_error($terms)) {
            $current_term = $terms[0];
            break;
        }
    }
     
    if ($current_term) {
        echo esc_html($current_term->name);
    }

    $post_id = get_the_ID(); $post_type = get_post_type($post_id); $taxonomies = get_object_taxonomies($post_type, 'names'); $current_term = null; foreach ($taxonomies as $taxonomy) { $terms = get_the_terms($post_id, $taxonomy); if (! empty($terms) && ! is_wp_error($terms)) { $current_term = $terms[0]; break; } } if ($current_term) { echo esc_html($current_term->name); }

    Но для хлебных крошек лучше не брать «первый попавшийся» термин, если у типа записи несколько таксономий. Например, у товара могут быть категории, метки, бренды и коллекции. Автоматический выбор даст непредсказуемые крошки. Практичный вариант — задать приоритет таксономий массивом: сначала основная категория каталога, затем запасные варианты. Если термина нет, показывайте архив post type или родительскую страницу каталога.

    SQL-запрос к term_relationships обычно не нужен: он обходит API, хуже читается, не учитывает кэш WordPress и усложняет поддержку. Используйте get_object_taxonomies(), get_the_terms(), get_term_link(). Если у записи на самом деле нет таксономии, а значение хранится в ACF или другом custom field, тогда это не термин, а post meta, и получать его нужно через get_post_meta() или ACF get_field().

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

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

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

    комментарий

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

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