Проверка принадлежности поста к конкретной категории или любой вложенной в эту категорию под-категории
Страницы: 1
[ Закрыто ] Проверка принадлежности поста к конкретной категории или любой вложенной в эту категорию под-категории, Не работает условие (((
Здравствуйте уважаемые, опишу все поэтапно:
Общая информация. Стоит передо мной следующая задача, есть категория на сайте (ее id – 6), в которой примерно один раз на месяц будет создаваться подкатегория. Внешний вид всех подкатегорий данной категории одинаковый, но отличается от вида других категорий сайта. По началу, когда не планировалось создание многих подкатегорий проблем не было, создал файл шаблона категории – category-6.php и все работает. Теперь же, если идти таким способом, то для каждой новой подкатегории необходимо создавать файл шаблона category-ID.php, данный метод не универсален.
Решение. В сети нашел функцию, которая проверяет принадлежность поста к конкретной категории или любой вложенной в эту категорию под-категории, вот ее код, который добавил в functions.php:
Код
function post_is_in_descendant_category( $cats, $_post = null ) {    foreach ( (array) $cats as $cat ) {       // get_term_children() accepts integer ID only       $descendants = get_term_children( (int) $cat, 'category');       if ( $descendants && in_category( $descendants, $_post ) )          return true;    }    return false; }
 
Первичный код файла category.php:
Код
<?php
/**
 * The template for displaying Category Archive pages.
 *
 * @since admired 1.0
 */

get_header(); ?>

      <section id="primary">
         <div id="content" role="main">

         <?php if ( have_posts() ) : ?>

            <header class="page-header">
               <h1 class="page-title"><?php
                  printf( __( 'Розділ: %s', 'admired' ), '<span>' . single_cat_title( '', false ) . '</span>' );
               ?></h1>

               <?php
                  $category_description = category_description();
                  if ( ! empty( $category_description ) )
                     echo apply_filters( 'category_archive_meta', '<div class="category-archive-meta">' . $category_description . '</div>' );
               ?>
            </header>

            <?php admired_content_nav( 'nav-above' ); ?>

            <?php /* Start the Loop */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

               <?php
                  /* Include the Post-Format-specific template for the content.
                   -----------------------------------------------------------*/
                  get_template_part( 'loop', get_post_format() );
               ?>

            <?php endwhile; ?>

            <?php admired_pagination(); ?>

         <?php else : ?>

            <article id="post-0" class="post no-results not-found">
               <header class="entry-header">
                  <h1 class="entry-title"><?php _e( 'Публікацій не знайдено', 'admired' ); ?></h1>
               </header><!-- .entry-header -->

               <div class="entry-content">
                  <p><?php _e( 'Вибачте, але в даному розділі не знайдено жодної публікації. Можливо пошук допоможе знайти потрібні публікації.', 'admired' ); ?></p>
                  <?php get_search_form(); ?>
               </div><!-- .entry-content -->
            </article><!-- #post-0 -->

         <?php endif; ?>

         </div><!-- #content -->
      </section><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?> 
Модифицированный код файла category.php с выше указанной проверкой:


Код
<?php
/**
 * The template for displaying Category Archive pages.
 *
 * @since admired 1.0
 */
?>

<?php if ( in_category( 6 ) || post_is_in_descendant_category( 6 ) ) : ?>
<?php get_template_part('category', 6); ?>
<?php esle : ?>

<?php get_header(); ?>

      <section id="primary">
         <div id="content" role="main">

         <?php if ( have_posts() ) : ?>

            <header class="page-header">
               <h1 class="page-title"><?php
                  printf( __( 'Розділ: %s', 'admired' ), '<span>' . single_cat_title( '', false ) . '</span>' );
               ?></h1>

               <?php
                  $category_description = category_description();
                  if ( ! empty( $category_description ) )
                     echo apply_filters( 'category_archive_meta', '<div class="category-archive-meta">' . $category_description . '</div>' );
               ?>
            </header>

            <?php admired_content_nav( 'nav-above' ); ?>

            <?php /* Start the Loop */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

               <?php
                  /* Include the Post-Format-specific template for the content.
                   -----------------------------------------------------------*/
                  get_template_part( 'loop', get_post_format() );
               ?>

            <?php endwhile; ?>

            <?php admired_pagination(); ?>

         <?php else : ?>

            <article id="post-0" class="post no-results not-found">
               <header class="entry-header">
                  <h1 class="entry-title"><?php _e( 'Публікацій не знайдено', 'admired' ); ?></h1>
               </header><!-- .entry-header -->

               <div class="entry-content">
                  <p><?php _e( 'Вибачте, але в даному розділі не знайдено жодної публікації. Можливо пошук допоможе знайти потрібні публікації.', 'admired' ); ?></p>
                  <?php get_search_form(); ?>
               </div><!-- .entry-content -->
            </article><!-- #post-0 -->

         <?php endif; ?>

         </div><!-- #content -->
      </section><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

<?php endif; ?> 


Проблема. Категория с id – 6 отображается нормально, ее подкатегории тоже, на всех остальных категориях – белый фон. Режим отладки ничего толкового не говорит, он сообщает об ошибке в файле wp-includes/ functions.php. Как я понимаю, ошибку допускаю я, на этапе проверки принадлежность поста к конкретной категории. Вчера пол дня с этим возился и без толку, помогите кто может, буду благодарен. Спасибо
Будьте внимательныФункция
Код
in_category() 
Работает ВНУТРИ single и проверяет принадлежность поста к указанной категории

Для того чтобы проверять ID текущей категории используется функция

Код
is_category()
 
Решение:
 1. Создаете шаблон category-slug.php Slug - имя базовой категории
Например,  category-month.php будет выводить запросы к site.com/category/month , а также всем вложенным site.com/category/month/1 , site.com/category/month/2 и тд
2. в этом шаблоне пишете тот код который будет выводить эту категорию и все дочерние категории этой категории

В случае, если необходимо чтобы в главной и дочерних отображались разные данные делаете проверку в шаблоне category-slug.php 

Код
<?php  
 if(is_category(6)){код главной категории}    
 elseif(!is_category(6)) {код дочерней категории}  
?>
Изменено: Денис Мешков - 16 Марта 2016 12:55
Денис Мешков, мне нужно в category-6.php и всех ее подкатегориях одинаковый шаблон, а на всем остальном сайте использовать шаблон category.php , значит надо сделать так:[FONT=Tahoma, Arial, Helvetica, sans-serif]1. [/FONT]category.php не трогаю, тоесть проверку оттуда убираю.
2. В category-6.php добавляю следующее:



Код
<?php  
 if ( is_category( 6 ) || post_is_in_descendant_category( 6 ) ) {код уникальной категории}    
 elseif (!is_category(6)) {get_template_part('category');} //визов шаблона категории для остального сайта  
?> 


правильно?
Изменено: Chmil - 16 Марта 2016 12:59
Забыл добавить функцию которая по "иному"  принципу распределяет шаблоны к категориям
1.

Добавляем в functions.php


Код
 function new_subcategory_hierarchy() { 
    $category = get_queried_object();

    $parent_id = $category->category_parent;

    $templates = array();

    if ( $parent_id == 0 ) {
        // Use default values from get_category_template()
        $templates[] = "category-{$category->slug}.php";
        $templates[] = "category-{$category->term_id}.php";
        $templates[] = 'category.php';     
    } else {
        // Create replacement $templates array
        $parent = get_category( $parent_id );

        // Current first
        $templates[] = "category-{$category->slug}.php";
        $templates[] = "category-{$category->term_id}.php";

        // Parent second
        $templates[] = "category-{$parent->slug}.php";
        $templates[] = "category-{$parent->term_id}.php";
        $templates[] = 'category.php'; 
    }
    return locate_template( $templates );
}

add_filter( 'category_template', 'new_subcategory_hierarchy' );


2.

Создаем шаблон - category-{slug of cat_id 6}.php

3.

Внутрь созданного шаблона копируем нативный код из category.php

4.

Контентную часть заворачиваем условие:


Код
<?php  
if(is_category(6)){код главной категории}    
elseif(!is_category(6)) {код дочерней категории}  
?> 
В результате:
Все категории, которые являются дочерними категории с iD=6, а также категория с ID=6 будут обрабатываться из файла category-{slug of cat_id 6}.php
Изменено: Денис Мешков - 16 Марта 2016 13:12
спасибо, сейчас немного с работой разберусь и попробую, как я понял функция post_is_in_descendant_category­ более не нужна?
Chmil, если вы добавите представленный выше код в function то не нужна
Денис Мешков, прошу прощения за мою тупость, но еще один вопрос - код главной категории - ето код не модифицырованого шаблона категории или уже с нужнымы мне изменениями?smile:confused:
Chmil, какой код ставить дело уже ваше -) я представил схему по которой из конкретного шаблона будут обрабатываться главная категория и ее дочки. Ставьте тот код, которым ходите выводить эти страницы
ЗЫ: Поставьте не модифицированный код, и его уже правьте. ИМХО
Изменено: Денис Мешков - 16 Марта 2016 13:41
Не работает, вот какой у меня category-6.php получился
Код
<?php
/**
 * The template for displaying Category Archive pages.
 *
 * @since admired 1.0
 */

get_header(); ?>

      <section id="primary">
         <div id="content" role="main">

         <?php if ( have_posts() ) : ?>

         <?php  
            if (is_category(6)) { ?>
            
            <header class="page-header">
               <div class="zagl"><h1>Рішення сесій Крихівецької сільської ради</h1></div>
<div class="category-archive-meta">&nbsp;</div>
            </header>
            
            <?php admired_content_nav( 'nav-above' ); ?>
<div class="pagefr">
            <?php /* Start the Loop */ ?>
            <?php
                  $category_description = category_description();
                  if ( ! empty( $category_description ) )
                     echo apply_filters( 'category_archive_meta', '<div class="category-archive-meta">' . $category_description . '</div>' );
               ?>
            
            <?php while ( have_posts() ) : the_post(); ?>


<div class="pagefrl"><img src="http://krykhivtsi.if.ua/wp-content/themes/admired/images/icon-for-doc.png" width="25" height="25"></div>
<h3 class="titlefr"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<?php the_excerpt( __( 'Читати далі &rarr;', 'admired' ) ); ?>


            <?php endwhile; ?>
</div>
            <?php admired_pagination(); ?> 
            
            <?php } ?> 
            
            <?php elseif (!is_category(6)) { ?> 
         
            <header class="page-header">
               <h1 class="page-title"><?php
                  printf( __( 'Розділ: %s', 'admired' ), '<span>' . single_cat_title( '', false ) . '</span>' );
               ?></h1>

               <?php
                  $category_description = category_description();
                  if ( ! empty( $category_description ) )
                     echo apply_filters( 'category_archive_meta', '<div class="category-archive-meta">' . $category_description . '</div>' );
               ?>
            </header>

            <?php admired_content_nav( 'nav-above' ); ?>

            <?php /* Start the Loop */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

               <?php
                  /* Include the Post-Format-specific template for the content.
                   -----------------------------------------------------------*/
                  get_template_part( 'loop', get_post_format() );
               ?>

            <?php endwhile; ?>

            <?php admired_pagination(); ?>
            
            <?php } ?>

         <?php else : ?>

            <article id="post-0" class="post no-results not-found">
               <header class="entry-header">
                  <h1 class="entry-title"><?php _e( 'Публікацій не знайдено', 'admired' ); ?></h1>
               </header><!-- .entry-header -->

               <div class="entry-content">
                  <p><?php _e( 'Вибачте, але в даному розділі не знайдено жодної публікації. Можливо пошук допоможе знайти потрібні публікації.', 'admired' ); ?></p>
                  <?php get_search_form(); ?>
               </div><!-- .entry-content -->
            </article><!-- #post-0 -->

         <?php endif; ?>

         </div><!-- #content -->
      </section><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>
 
Chmil, 

вот так перепиши
Код
<?php if(is_category(6)): ?>
main
<?php elseif(!is_category(6)): ?>
child
<?php endif;?>
 
Изменено: Денис Мешков - 16 Марта 2016 20:49
Огромное спасибо Денису Мешкову, решил проблему + проконсультировал в инных вопросах, очень мне помог, тему можно закрывать:)
Цитата
Chmil пишет:
тему можно закрывать

Chmil, спасибо, что отписались в теме и скинули в ЛС.
Тему закрыл.

* обращение к пользователям - > если Ваша тема потеряла свою актуальность, то, пожалуйста, отпишитесь об этом в теме и скиньте ссылку на тему мне в ЛС.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
Новые темыОбъявленияСвободное общение
22:40 РСЯ и тормоза сайта: Яндекс начал штрафовать за плохой PageSpeed? 
22:34 01.02. Апдейт 31.01 // Chrome готовит "чёрную метку" для ИИ? 
19:16 Как безопасно купить Гугл почту? 
13:45 Какой движок выбрать для форума? 
13:43 Нашел скрины выплат с Сапы за 2010 год. Пошел плакать 
09:26 Трафик пробил дно? Худший январь за 10 лет и внезапный рост продаж с Bing 
19:27 Плагин ответа 
20:21 CryptoGraph — Анонимный обмен криптовалют без KYC и AML 
12:09 Trustpilot Reviews | Подниму рейтинг вашей компании 
12:07 Купить отзывы на Яндекс и Гугл картах, на Авито, на Отзовике и IRecommend 
12:06 №1 Рассылка / Инвайтинг [TELEGRAM] | Приватный метод 
11:59 Продвижение сайта: [SEO-трафик][Вывод в ТОП][Крауд-маркетинг + SEO] 
11:58 Продвижение YouTube видео в топ поиска | Любой тип контента | Гарантия результата 
11:58 Современный скрипт обменника электронных валют 
22:31 [AI] Бот за $600к советовал есть сыр с крысами. Нью-Йорк его (наконец-то) снес 
22:30 Точные прогнозы на футбол 
13:38 Осталось 3-5 месяцев до блокировки YouTube в России, — заявил Клименко 
07:11 Список обновленных тем пуст... 
01:02 Ставки на супер тренды в спорте 
17:02 Gartner обещал смерть SEO к 2026 году. Открываем метрику и проверяем 
08:25 Отвратительное поведение