Был у меня такой запрос от заказчика, чтобы контент был различный, в зависимости от того, где пользователь находится. Суть такова: на главной отображаются ссылки на новости и Статьи(соответственно рубрики «Новости» и «Статьи»), а так же список рубрик(конкретно – марки автомобилей, например «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(); ?>

Новости выводятся так же, просто нужно слово «Статьи» поменять на «Новости». Вот таким образом и решилась задачка.

Один комментарий

  1. Базанов


    Спасибо за поддержку.


Оставить комментарий