Был у меня такой запрос от заказчика, чтобы контент был различный, в зависимости от того, где пользователь находится. Суть такова: на главной отображаются ссылки на новости и Статьи(соответственно рубрики «Новости» и «Статьи»), а так же список рубрик(конкретно – марки автомобилей, например «Ford»), при нажатии на которые ссылки, которые вели на общие новости и статьи, теперь должны вести на подрубрики новости и статьи из выбранной рубрики автомобиля, но есть одна особенность: новости и статьи – это подрубрики моделей авто, которые соответственно подрубрики марки (выглядит как Ford->Focus->Новости и Ford->Focus->Статьи или Ford->Mondeo->Новости и Ford->Mondeo->Статьи). Помимо этого в сайдбарах так же выводятся по 2 новости и статьи, и они соответственно должны меняться, когда заходишь в рубрику с маркой авто. Весьма интересная задачка, на мой взгляд, делаем :).
Выбирать что же показывать мы должны исходить из ситуации, а ситуации следующие:
- 1) главная страница (отображаем из рубрик «Новости» и «Статьи»)
- 2) рубрики «Новости» и «Статьи» и посты в них (отображаем из рубрик «Новости» и «Статьи»)
- 3) страницы (отображаем из рубрик «Новости» и «Статьи»)
- 4) рубрики машин и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
- 5) подрубрики «Новости» и «Статьи» рубрик автомобилей и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
Строим последовательно алгоритм, который и проверяет где мы находимся. Определяем ID текущей рубрики, если находимся непосредственно в рубрике, то всё просто – берём ID по названию рубрики, если же находимся в посте, то берём последовательную иерархию рубрик (по сути «хлебные крошки») и берём саму главную рубрику.
<?php
if(is_front_page()){$id1=1;}else
{
$idtemp = get_category_by_slug(single_cat_title('', false))->term_id;
if($idtemp==1 or $idtemp==59){$id1=1;}else
{
$category = get_the_category();
$idtemp1=$category[0]->category_parent;
if($idtemp1==0){$id1=$category[0]->term_id;}else
{
if(is_category()){
$id1=$idtemp;
}else{
$parents=pos(explode('>', get_category_parents($idtemp1, false, '>')));
$id1=get_category_by_slug($parents)->term_id;
}
}
}
}
$GLOBALS["figna"]=$id1;
$cat_url=get_category_link($id1);
?>
Проверка is_front_page() используется в том случае, если главная – отдельная страница, если же у вас идёт просто вывод постов, то используйте is_home(). После выполнения алгоритма id рубрики сохранится в $id1, а её урл в $cat_url. Так же мы сохранили id в глобальном массиве ($GLOBALS[«figna»] :)), чтобы была возможность использовать это значение во всех файлах темы.
Теперь выводим наши ссылки соответствующим образом:
<li><a href="<?php if($id1==1 or $id1==59)
{?>http://site.ru/category/novosti-dnya<?php
}else{echo $cat_url.'?act=news';} ?>">Новости</a></li>
<li><a href="<?php if($id1==1 or $id1==59)
{?>http://site.ru/category/stati<?php
}else{echo $cat_url.'?act=posts';} ?>">Статьи</a></li>
ID 1 и 59 – это номера рубрик «Новости» и «Статьи», вместо них подставте свои. Как видите к ссылке рубрики я дополнительно прикрепил параметр act, который принимает 2 значения news и posts, т.е. в зависимости от этого параметра мы будем выводить посты или новости.
Всё это я прописывал в header.php, следующим для правок идёт archive.php, здесь уже будем разбирать, что же нам надо выводить.
Первым делом отлавливаем параметр act. если его нету, то выводим как обычно. Если параметр есть, то в зависимости от его значения делаем отсев с помощью query_posts. Суть отсева прост: берём все подрубрики нашей марки и отсеиваем по значению имени равного «Новости» или «Статьи».Выглядит это так:
<?php $act=$_GET['act']; ?>
<?php $id1 = get_category_by_slug(single_cat_title('', false))->term_id; ?>
<?php if($act=='news')
{
$categoriki=get_categories('hide_empty=0&child_of='.$id1);
$vibor='';
$perv=true;
foreach ($categoriki as $cat)
{
if($cat->cat_name=='Новости')
{
if($perv){$vibor.=$cat->term_id; $perv=false;}
else{$vibor.=','.$cat->term_id;}
}
}
query_posts('cat='.$vibor);
echo single_cat_title();
}
?>
<?php if($act=='posts')
{
$categoriki=get_categories('hide_empty=0&child_of='.$id1);
$vibor='';
$perv=true;
foreach ($categoriki as $cat)
{
if($cat->cat_name=='Статьи')
{
if($perv){$vibor.=$cat->term_id; $perv=false;}
else{$vibor.=','.$cat->term_id;}
}
}
query_posts('cat='.$vibor);
echo single_cat_title();
}
?>
Вставляем это перед основным циклом вывода записей.
Теперь осталось только в сайдбарах тот же отсев сделать, алгоритм практический идентичен, только добавляем ограничение на количество постов showposts=2.
<?php
$id1 = $GLOBALS["figna"];
if(!$id1){$id1=1;}
?>
<?php $categoriki=get_categories('hide_empty=0&child_of='.$id1);
$vibor='';
$perv=true;?>
<?php foreach ($categoriki as $cat) {
if($cat->cat_name=='Статьи'){
if($perv){$vibor.=$cat->term_id; $perv=false;}else
{$vibor.=','.$cat->term_id;}
}
}?>
<?php if($id1==1 or $id1==59) {?>
<?php query_posts('showposts=2&cat=1');?>
<?php }else{ ?>
<?php query_posts('showposts=2&cat='.$vibor);}?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div id="chast">
<a href="<?php the_permalink(); ?>"> <?php the_content(''); ?> </a>
<a href="<?php the_permalink(); ?>"><p><?php the_title(); ?></p></a>
</div>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
<?php wp_reset_query(); ?>
Новости выводятся так же, просто нужно слово «Статьи» поменять на «Новости». Вот таким образом и решилась задачка.
Спасибо за поддержку.