Был у меня такой запрос от заказчика, чтобы контент был различный, в зависимости от того, где пользователь находится. Суть такова: на главной отображаются ссылки на новости и Статьи(соответственно рубрики «Новости» и «Статьи»), а так же список рубрик(конкретно – марки автомобилей, например «Ford»), при нажатии на которые ссылки, которые вели на общие новости и статьи, теперь должны вести на подрубрики новости и статьи из выбранной рубрики автомобиля, но есть одна особенность: новости и статьи – это подрубрики моделей авто, которые соответственно подрубрики марки (выглядит как Ford->Focus->Новости и Ford->Focus->Статьи или Ford->Mondeo->Новости и Ford->Mondeo->Статьи). Помимо этого в сайдбарах так же выводятся по 2 новости и статьи, и они соответственно должны меняться, когда заходишь в рубрику с маркой авто. Весьма интересная задачка, на мой взгляд, делаем :).
Выбирать что же показывать мы должны исходить из ситуации, а ситуации следующие:
- 1) главная страница (отображаем из рубрик «Новости» и «Статьи»)
- 2) рубрики «Новости» и «Статьи» и посты в них (отображаем из рубрик «Новости» и «Статьи»)
- 3) страницы (отображаем из рубрик «Новости» и «Статьи»)
- 4) рубрики машин и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
- 5) подрубрики «Новости» и «Статьи» рубрик автомобилей и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
Строим последовательно алгоритм, который и проверяет где мы находимся. Определяем ID текущей рубрики, если находимся непосредственно в рубрике, то всё просто – берём ID по названию рубрики, если же находимся в посте, то берём последовательную иерархию рубрик (по сути «хлебные крошки») и берём саму главную рубрику.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?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"] :)), чтобы была возможность использовать это значение во всех файлах темы.
Теперь выводим наши ссылки соответствующим образом:
1 2 3 4 5 6 |
<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. Суть отсева прост: берём все подрубрики нашей марки и отсеиваем по значению имени равного «Новости» или «Статьи».Выглядит это так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?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(); ?> |
Новости выводятся так же, просто нужно слово «Статьи» поменять на «Новости». Вот таким образом и решилась задачка.
Спасибо за поддержку.