Почему `if else` не работает?

У меня это на моем header.php .

Он проверяет, находится ли страница на главной странице / главной странице, находится в категории / дети / имеет категорию «gamenews», или находится в категории / дети / имеет категорию «hobbynews».

В принципе, если он находится на главной странице / главной странице, он ничего не выводит.

С другой стороны, если он включен в gamenews, он выводит что-то. Если он находится на hobbynews, он выводит другое. Ниже вы можете увидеть подробности. Я использую там специальную функцию ( is_category_or_sub ).

  <?php if ( is_home() || is_front_page() ) { ?> <?php } elseif ( is_category_or_sub('gamenews') || has_category('gamenews') ) { ?> <ul id="sections"> <?php $category = get_category_by_slug( 'gamenews' ); wp_list_categories(array( 'child_of' => $category->term_id, 'title_li' => '', 'hide_empty' => 0, 'orderby' => 'count', 'walker' => new WPSE67791_Walker_Category )); ?> </ul><!-- #sections --> <?php } elseif ( is_category_or_sub('hobbynews') || has_category('hobbynews') ) { ?> <ul id="sections"> <?php $category = get_category_by_slug( 'hobbynews' ); wp_list_categories(array( 'child_of' => $category->term_id, 'title_li' => '', 'hide_empty' => 0, 'orderby' => 'count', 'walker' => new WPSE67791_Walker_Category )); ?> </ul><!-- #sections --> <?php } ?> 

Теперь первая проверка (is_home / is_frontpage) работает нормально. То же самое делает второй (тот, что на «gamenews»).

Однако последний («hobbynews») не работает.

Каждый раз, когда я посещаю страницу, у которой есть это требование (есть категория / дети / имеет категорию «hobbynews»), она отображает материал, который должен быть включен в gamenews. Тот, который я хочу отображать на hobbynews, не появляется.

Почему это происходит? Я пытался переупорядочить, пытался использовать вложенные if и т. Д. Но он все еще не работает и действительно запутывает …


РЕДАКТИРОВАТЬ:

Это мой is_category_or_sub , расположенный на functions.php :

 function is_category_or_sub( $cat_slug = get_category_by_slug ) { foreach (get_the_category() as $cat) { if ($cat_slug || cat_is_ancestor_of($cat_slug->term_id, $cat)) return true; } return false; } 

Предполагая, что вы используете функцию is_category_or_sub (), как указано на http://valendesigns.com/wordpress/is-category-or-subcategory-wp-function/

Эта функция принимает идентификатор категории в качестве аргумента, а не slug. Строка «gamenews» здесь, когда тип-casted до целого числа становится 0, который является предком для каждой другой категории. Можете ли вы попробовать изменить код функции для этого –

 // If is category or subcategory of $cat if (!function_exists('is_category_or_sub')) { function is_category_or_sub($cat = 0) { if(is_numeric($cat)) { $cat_id = $cat; } elseif(is_string($cat)) { $cat = get_term_by('slug', $cat, 'category'); $cat_id = $cat->term_id; } else { return false; // neither id nor slug } foreach (get_the_category() as $cat) { if ($cat_id == $cat->cat_ID || cat_is_ancestor_of($cat_id, $cat)) return true; } return false; } } 

Эта функция теперь поддерживает как id, так и slug