Отображение имени и ссылки подкатегории вместо имени родительской категории

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

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

    <?php $category_separator = "";
foreach((get_the_category()) as $childcat) {
     $parentcat = $childcat->category_parent;
     if( $parentcat != 0 ) echo '<span class="' . get_cat_name($parentcat) .'"><a href="' . get_category_link($parentcat) . '">' .get_cat_name($parentcat) .'</a></span>';
     else echo '' . $category_separator . '<span class="'. $childcat->cat_name .'"><a href="' . get_category_link($childcat) .'">' . $childcat->cat_name . '</a></span>';
    $category_separator = "https://wordpress.stackexchange.com/";
}
?>

Н kecil изменение:

<?php $category_separator = "";
foreach((get_the_category()) as $childcat) {
     $parentcat = $childcat->term_id;
     if( $parentcat != 0 ) echo '<span class="' . get_cat_name($parentcat) .'"><a href="' . get_category_link($parentcat) . '">' .get_cat_name($parentcat) .'</a></span>';
     else echo '' . $category_separator . '<span class="'. $childcat->cat_name .'"><a href="' . get_category_link($childcat) .'">' . $childcat->cat_name . '</a></span>';
    $category_separator = "https://wordpress.stackexchange.com/";
}
?>

На самом деле вы получали id родительской категории

 $parentcat = $childcat->category_parent;

Вместо этого вам нужно получить фактический id подсекции

$parentcat = $childcat->term_id;

Показ только дочерней категории

global $post;    
    $terms = wp_get_post_terms( $post->ID, 'product_cat' );
            foreach ( $terms as $term ) 
            {
                if($term->parent!=0)
                {
                    $pcategory = get_term( $term->parent, 'product_cat' );
                    $categories[] = $pcategory->slug;
                }
        }

В условии else вы используете $childcat->cat_name для получения имени подсекции, но cat_name не является допустимым свойством. Вам следует использовать name вместо этого.
Вы используете get_category_link($childcat) для получения ссылки на подсекцию, но get_category_link() ожидает ID категории, а не объект. Вам следует использовать $childcat->term_id для получения ID категории

$category_separator = "";
foreach((get_the_category()) as $childcat) {
    $parentcat = $childcat->category_parent;
    if ($parentcat != 0) {
        echo '<span class="' . get_cat_name($childcat->term_id) .'"><a href="' . get_category_link($childcat->term_id) . '">' . get_cat_name($childcat->term_id) .'</a></span>';
    } else {
        echo '' . $category_separator . '<span class="'. $childcat->name .'"><a href="' . get_category_link($childcat->term_id) .'">' . $childcat->name . '</a></span>';
    }
    $category_separator = " / ";
}

Ответ или решение

Данный вопрос касается отображения имён подкатегорий и их ссылок вместо родительских категорий в коде, используемом для вывода категорий в WordPress. Основная цель заключается в том, чтобы правильно идентифицировать подкатегории и выводить их в формате, удобном для пользователя.

1. Анализ состояния задачи

Ваш текущий код неправильно определяет подкатегории. Как уже было упомянуто в вашем коде, переменная $parentcat инициализируется значением $childcat->category_parent, что приводит к выводу родительской категории в случаях, когда связано с подкатегорией. Фактически, эта переменная должна ссылаться на ID подкатегории. Вам нужно изменить логику, чтобы выводить подкатегории при наличии таковых.

2. Рекомендации по улучшению кода

Предлагаем изменить ваш код, следуя рекомендациям:

<?php 
$category_separator = "";
foreach (get_the_category() as $childcat) {
    // Проверяем, есть ли у категории родительская категория
    if ($childcat->category_parent != 0) {
        // Выводим подкатегорию, если родительская категория существует
        echo '<span class="' . get_cat_name($childcat->term_id) . '"><a href="' . get_category_link($childcat->term_id) . '">' . get_cat_name($childcat->term_id) . '</a></span>';
    } else {
        // Если родительской категории нет, выводим саму категорию
        echo '' . $category_separator . '<span class="' . $childcat->name . '"><a href="' . get_category_link($childcat->term_id) . '">' . $childcat->name . '</a></span>';
    }
    // Установка разделителя
    $category_separator = " / ";
}
?>

3. Объяснение изменений

  • Проверка родителей: Мы сохраняем проверку на родительскую категорию, которая теперь нуждается в использовании правильного ID подкатегории.
  • Использование term_id: В вашем коде замените $childcat->category_parent на $childcat->term_id, чтобы правильно идентифицировать ID текущей категории, а затем использовать его в функции get_category_link().
  • Исправление доступа к свойствам: Замените cat_name на name в выводе подкатегорий. Это исправление важно, так как cat_name может не всегда возвращать корректный результат в зависимости от версии WordPress или контекста.

4. Заключение

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

Эти доработки обеспечат, что ваш контент будет более доступен и понятен для пользователей, что, в свою очередь, может положительно повлиять на SEO и общую привлекательность сайта.

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

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