WooCommerce - Показать родительскую таксономию со ссылкой из дочерней таксономии

Я использую 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>';
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы просто хотите отобразить родительский список налогов в виде навигационной крошки, вы можете просто использовать 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_objectparent

э.и.

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 (последний) был именно тем, что мне было нужно.

Alex Banks 18.01.2023 09:51

Другие вопросы по теме