Почему in_category работает так же, как is_category в коде сайдбара?

Ссылка скопирована
PHP
1 ответ
<? 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 работает так же, как is_category в коде сайдбара?

in_category() поверяет первую (нулевую) запись в выборке на принадлежность указанной рубрике. Логично, что при выводе рубрики id=5 первая запись в списке принадлежит этой рубрике.
Попробуйте добавить условие and is_single()

  • Спасибо, теперь понял.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

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; ?>

<?php if (is_single() && in_category(5)) : ?> Тут сайдбар только для записей категории ID 5 <?php else : ?> Тут сайдбар для всего остального сайта <?php endif; ?>

Если нужно исключить сам архив рубрики, можно явно проверить:

if (! is_category(5) && in_category(5)) {
    // запись из категории 5, но не архив категории
}

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();
}

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().

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно