Как получить термин для текущего кастом поста без таксономии?
Мне нужно получить термин для текущего кастом поста динамически на сингл странице (например, для хлебных крошек)
Я использовал get_the_terms($post->ID, 'curr_post_tax')
Или как получить curr_post_tax текущего кастом поста
Или, может быть, вы знаете другие методы
Home>Catalog>Term>CurrProd
Дополнительно
Чем не устраивает get_the_terms()?
Ответы:
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>';
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Термин без таксономии получить нельзя: термин всегда принадлежит конкретной таксономии. Но можно не зашивать имя таксономии вручную, а получить список таксономий, привязанных к текущему 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 type или родительскую страницу каталога.
SQL-запрос к
term_relationshipsобычно не нужен: он обходит API, хуже читается, не учитывает кэш WordPress и усложняет поддержку. Используйтеget_object_taxonomies(),get_the_terms(),get_term_link(). Если у записи на самом деле нет таксономии, а значение хранится в ACF или другом custom field, тогда это не термин, а post meta, и получать его нужно черезget_post_meta()или ACFget_field().