Почему in_category работает так же, как is_category в коде сайдбара?
<? if( in_category( 5 ) ){ ?> Тут сайдбар только для записей категории с ID 5 <? } else { ?> Тут сайдбар для всего остального сайта, включая саму рубрику с ID 5 <?php } ?> |
<? if( in_category( 5 ) ){ ?> Тут сайдбар только для записей категории с ID 5 <? } else { ?> Тут сайдбар для всего остального сайта, включая саму рубрику с ID 5 <?php } ?>
Но почему в рубрике с ID 5 выводится тот же сайдбар, который должен выводиться только для его записей? Почему in_category в данном случае работает как is_category - это так и должно быть?
Я не понимаю. Прошу подсказать, или объяснить, если это так и должно быть.
Дополнительно:
in_category() поверяет первую (нулевую) запись в выборке на принадлежность указанной рубрике. Логично, что при выводе рубрики id=5 первая запись в списке принадлежит этой рубрике.
Попробуйте добавить условие and is_single()
- Спасибо, теперь понял.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

in_category()проверяет категории текущей записи. На странице рубрики внутри основного цикла текущей записью становится каждый пост из этой рубрики, поэтому внутри sidebar, вызванного во время Loop,in_category(5)будет возвращатьtrueдля записей рубрики 5. Это не то же самое, чтоis_category(), просто вы вызываете проверку в контексте записи.Разница такая:
is_category(5)— мы на архивной странице рубрики ID 5;in_category(5)— текущая запись принадлежит рубрике ID 5.Если нужно показать блок только на одиночных записях из рубрики 5, добавьте проверку
is_single():<?php if (is_single() && in_category(5)) : ?> Тут сайдбар только для записей категории ID 5 <?php else : ?> Тут сайдбар для всего остального сайта <?php endif; ?>
Если нужно исключить сам архив рубрики, можно явно проверить:
if (! is_category(5) && in_category(5)) { // запись из категории 5, но не архив категории }
Но правильнее формулировать условие от типа страницы:
if (is_singular('post') && has_category(5, get_queried_object_id())) { get_sidebar('category-5'); } else { get_sidebar(); }
Для сайдбара важно, где именно он подключается. Если
get_sidebar()стоит внутри цикла архива, условные теги записи будут зависеть от текущего поста. Обычно сайдбар подключают вне Loop, а для условий используютis_single(),is_category(),is_archive()иget_queried_object().