Я использую WooCommerce и пользовательские шаблоны для категорий. Я пытаюсь вывести родительскую категорию текущей таксономии, которую просматривает клиент, чтобы действовать как кнопка «назад» или ссылка «перейти вверх по категории».
На выходе необходимо создать шорткод, чтобы его можно было разместить в пользовательском конструкторе шаблонов. Или меня добавили в XYZ Snippets, которые создадут шорткод для функции.
Я попытался создать фрагмент, но ничего не выводится на интерфейс.
Пожалуйста помоги!
Пример дерева категорий (с выделенным родителем):
function product_category_parent_shortcode() {
$cat = get_queried_object();
$cats = get_terms( [
'taxonomy' => $cat->taxonomy,
'child_of' => $cat->parent,
] );
if ( ! empty( $cats ) ) {
echo '<ul>';
foreach ( $cats as $cat ) {
$url = esc_url( get_category_link( $cat ) );
// change the 'before' and/or 'after' or whatever necessary
echo "<li>before <a href='$url'>$cat->name</a> after</li>";
}
echo '</ul>';
}
}
add_shortcode('product_category_parent', 'product_category_parent_shortcode');
Я также пробовал следующий фрагмент, но результаты не согласуются. Ссылка на категорию, которую он выводит, иногда работает, но иногда нет, что заставляет меня думать, что код ищет не в том месте. Код предназначен для поиска по отдельным товарным терминам, а не по категории по мере необходимости.
// Get parent product categories on single product pages
$terms = wp_get_post_terms( get_the_id(), 'product_cat', array( 'include_children' => false ) );
// Get the first main product category (not a child one)
$term = reset($terms);
$term_link = get_term_link( $term->term_id, 'product_cat' ); // The link
echo '<h2 class = "link"><a href = "'.$term_link.'">Return</a></h2>';
Если вы просто хотите отобразить родительский список налогов в виде навигационной крошки, вы можете просто использовать get_term_parents_list
э.и.
add_shortcode('cat-list-breadcrumb', function() {
if ( !is_tax() && !is_category() && !is_tag() )
return 'Dont call me here peasant!';
$obj = get_queried_object();
$options = [
'separator' => ' / ',
'inclusive' => false
];
return get_term_parents_list( $obj->term_id, $obj->taxonomy , $options ). ' '. $obj->name;
});
если вам нужно создать свой собственный формат html, то используйте get_ancestors
add_shortcode('cat-list', function() {
if ( !is_tax() && !is_category() && !is_tag() )
return;
$obj = get_queried_object();
$output = '<ul>';
$parents = get_ancestors( $obj->term_id, $obj->taxonomy );
foreach ( array_reverse( $parents ) as $termId ) {
$parent = get_term( $termId, $obj->taxonomy );
$out .= '<li><a href = "' . esc_url( get_term_link( $parent->term_id, $obj->taxonomy ) ) . '">' . $parent->name . '</a></li>';
}
$out .= '<li>'.$obj->name . '</li>';
return $out.'</ul>';
});
если вы хотите отображать только родительский уровень 1-го уровня, но не уровень 2-го уровня, просто используйте get_term для значения get_queried_object
parent
э.и.
add_shortcode('cat-parent', function() {
if ( !is_tax() && !is_category() && !is_tag() )
return;
$obj = get_queried_object();
if ( !$obj->parent )
return;
$parent = get_term( $obj->parent, $obj->taxonomy );
return '<a href = "' . esc_url( get_term_link( $parent->term_id, $obj->taxonomy ) ) . '">' . $parent->name . '</a>';
});
Отличный ответ. Мне понравились все варианты, но вариант 3 (последний) был именно тем, что мне было нужно.