Как сделать цепочку навигации (breadcrump) в WordPress

Немного отойду от экспедиции и поделюсь очередной полезняшкой для WordPress.

Цепочка навигации (она же breadcrump) — это полный путь от начальной страницы до текущей, состоящий из отрезков пути, каждый из которых является разделом сайта.

wordpress_breadcrump_geocom
Пример цепочки навигации с custom taxonomies.

Штука очень полезная, но многие сайтоделы пренебрегают ей. Для WordPress есть некоторые плагины. В целом, их функционала вполне достаточно. Но бывают случаи, когда архитектура сайта на WordPress усложнена персонализированными типами постов и таксономиями.

Те, кто работают и/или пробовали использовать custom taxonomies наверняка столкнулись с проблемой шаблонов и «красивых» ссылок (niceurls). В Lightppd так вообще нереально их нереально настроить. В некоторых своих проектах я использовал шаблоны статичных страниц для избавления вышеупомянутой проблемы. И вот один из последних заказчиков попросил внедрить в его сайт навигационную штуку аКа breadcrump.

Делюсь полным кодом функции, которую я написал специально под проект заказчика.

function the_breadcrumb() {
	global $post;

	$link_EOS = '<a href="';
	$link_CON = '">';
	$link_EOF = '</a>';
	$sep = ' » ';

	if (!is_home()) {
		# если не на главной, то начинаем показывать цепочку с ссылки на главную страницу сайта
		echo $link_EOS . get_option('home') .	$link_CON . "Главная" . $link_EOF . $sep;
		if (is_category() || is_single()) {
			# категория
			the_category('title_li=');
			if (is_single()) {
				# single post / custom post type
				# get_page_link(8) - генерирует ссылку на шаблон продуктов (custom post type) под ID 8
				echo $link_EOS . get_page_link(8) . $link_CON . "Продукты" . $link_EOF . $sep;
				the_title(); # текущая страница без ссылки
			}
		} elseif (is_page()) {
			if ( $post->post_parent != 0) {
				# обычные статичные страницы
				echo $link_EOS . get_page_link($post->post_parent) . $link_CON . get_the_title($post->post_parent) . $link_EOF . $sep;
			}
			echo the_title(); # текущая страница
		} elseif (isset($_GET['action'])) {
			# специальный случай, когда не используются шаблоны WordPress,
			# но используется функционал движка в отдельных файлах вне шаблона
			# доступ к таким файлам обеспечивается ссылкой вроде
			# get_bloginfo('url) . /shoppingcart/index.php?action=xxxxx
			switch ($_GET['action']) {
				case "rent":
					$title = ucfirst("аренда оборудования");
					break;
				case "sell":
					$title = ucfirst("продажа оборудования");
					break;
				case "feedback":
					$title = ucfirst("обратная связь");
					break;
				default:
					$title = "";
			}
			echo $title;

		} elseif (is_tax()) {
			# персонализированные таксономии
			$curr_tax = get_taxonomy(get_query_var('taxonomy'));
			$curr_term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy')); 

			if (!empty($curr_term)) {
				# специальный случай, когда таксономия подключается в аутлайне сайта через шаблон страницы
				# каждой таксономии соотвествует ID определенной страницы
				switch ($curr_tax->name) {
					case "topografia":
						$pageid_fortax = "10";
						break;
					case "escanerlaser":
						$pageid_fortax = "11";
						break;
					case "controlmaquinaria":
						$pageid_fortax = "12";
						break;
					case "mapping":
						$pageid_fortax = "13";
						break;
					case "arriendo":
						$pageid_fortax = "14";
						break;
				}
				# генерируем полную ссылку цепочки
				$newtitle = $link_EOS . get_page_link($pageid_fortax) . $link_CON . $curr_tax->label . $link_EOF . $sep . $curr_term->name;
			} else {
				# если мы в начале таксономии
				$newtitle = $curr_tax->label;
			}
			echo $newtitle;
		}
	}
}

Я постарался документировать код везде, где могут возникнуть какие-то непонятки. В принципе все очень просто. В этой функции есть также поддержка того случая, когда вы используете функции WordPress в файлах, находящихся вне шаблона сайта и имеющих свои отдельные предназначение и структуру.

Код добавляете в functions.php и вызываете простым echo там, где нужно.

Из других полезняшек для WP вам может также понадобиться:

На эту запись ссылаются:

Ваш комментарий

XHTML: вы можете воспользоваться следующими тагами: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>