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