Хлебные крошки с отображением родительских и дочерних страниц
Мы пытаемся создать функцию для хлебных крошек, которая будет показывать не только путь к текущей странице, но и к другим страницам с тем же родительским элементом.
Например, на example.com/parent1/child3 хлебные крошки должны отображать Главная > Parent1 > Child1 > Child2 > Child3 > Child4, а не просто Главная > Parent1 > Child3.
Мы используем модифицированную версию скрипта хлебных крошек с http://dimox.net/wordpress-breadcrumbs-without-a-plugin/:
function dimox_breadcrumbs( $args = array() ) {
$defaults = array(
'delimiter' => '»',
'home' => 'Главная',
'before' => '<span class="current">',
'after' => '</span>',
'before_wrapper' => '<div id="crumbs">',
'after_wrapper' => '</div>',
'before_link' => '<li>',
'after_link' => '</li>'
);
$opts = wp_parse_args( $args, $defaults );
$delimiter = $opts['delimiter'];
$home = $opts['home']; // текст для ссылки "Главная"
$showCurrent = 0; // 1 - показывать заголовок текущей записи/страницы, 0 - не показывать
$before = $opts['before']; // тег перед текущей крошкой
$after = $opts['after']; // тег после текущей крошки
$b_link = $opts['before_link'];
$a_link = $opts['after_link'];
$title = '';
$sub_title = '';
if ( 1 || (!is_home() && !is_front_page()) || is_paged() ) {
echo $opts['before_wrapper'];
$out = '<ul>';
global $post;
$homeLink = get_bloginfo('url');
$out .= $b_link . '<a href="' . $homeLink . '">' . $home . '</a>' . $a_link . $delimiter;
if ( is_category() ) {
global $wp_query;
$cat_obj = $wp_query->get_queried_object();
$thisCat = $cat_obj->term_id;
$thisCat = get_category($thisCat);
$parentCat = get_category($thisCat->parent);
if ($thisCat->parent != 0) {
$out .= $b_link . (get_category_parents($parentCat, TRUE, $delimiter)) . $a_link;
}
$title = __( 'Архив по категории "%"', LANGUAGE_ZONE );
$sub_title = single_cat_title('', false);
$title = str_replace( '%', $sub_title, $title );
}elseif ( is_day() ) {
$out .= $b_link . '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a>' . $a_link . $delimiter;
$out .= $b_link . '<a href="' . get_month_link(get_the_time('Y'),get_the_time('m')) . '">' . get_the_time('F') . '</a>' . $a_link . $delimiter;
$title = $sub_title = get_the_time('d');
}elseif ( is_month() ) {
$out .= $b_link . '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a>' . $a_link . $delimiter;
$title = $sub_title = get_the_time('F');
}elseif ( is_year() ) {
$title = $sub_title = get_the_time('Y');
}elseif ( is_search() ) {
$title = __( 'Результаты поиска для "%"', LANGUAGE_ZONE );
$sub_title = get_search_query();
$title = str_replace( '%', $sub_title, $title );
}elseif ( is_single() && !is_attachment() ) {
if ( get_post_type() != 'post' ) {
$post_type = get_post_type_object(get_post_type());
$slug = $post_type->rewrite;
// echo $b_link . $post_type->labels->singular_name . $a_link . $delimiter;
// echo $b_link . '<a href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a>' . $a_link . $delimiter;
$title = $sub_title = get_the_title();
}else {
// блог и другие записи
$menu_data = dt_current_menu_item();
// $cat = get_the_category(); $cat = $cat[0];
// echo $b_link . get_category_parents($cat, TRUE, ' ' . $delimiter . ' ') . $a_link;
$out .= $b_link . '<a href=' . esc_url($menu_data['link']) . '>' . $menu_data['title'] . '</a>' . $a_link;
$title = get_the_title();
$sub_title = $menu_data['title'];
}
}elseif ( !is_single() && !is_page() && get_post_type() != 'post' && !is_404() ) {
$post_type = get_post_type_object(get_post_type());
$title = $sub_title = $post_type->labels->singular_name;
}elseif ( is_attachment() ) {
$parent = get_post($post->post_parent);
// $cat = get_the_category($parent->ID); $cat = $cat[0];
// $out .= get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
$out .= $b_link . '<a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a>' . $a_link . $delimiter;
$title = $sub_title = get_the_title();
}elseif ( is_page() && !$post->post_parent ) {
$title = $sub_title = get_the_title();
}elseif ( is_page() && $post->post_parent ) {
$parent_id = $post->post_parent;
$breadcrumbs = array();
while ($parent_id) {
$page = get_page($parent_id);
$breadcrumbs[] = $b_link . '<a href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a>' . $a_link;
$parent_id = $page->post_parent;
}
$breadcrumbs = array_reverse($breadcrumbs);
foreach ($breadcrumbs as $crumb) $out .= $crumb . $delimiter;
$title = $sub_title = get_the_title();
}elseif ( is_tag() ) {
$title = __( 'Записи с тегом "%"', LANGUAGE_ZONE );
$sub_title = single_tag_title('', false);
$title = str_replace( '%', $sub_title, $title );
}elseif ( is_author() ) {
global $author;
$userdata = get_userdata($author);
$title = __( 'Статьи автора %', LANGUAGE_ZONE );
$sub_title = $userdata->display_name;
$title = str_replace( '%', $sub_title, $title );
}elseif ( is_404() ) {
$title = $sub_title = __( 'Ошибка 404', LANGUAGE_ZONE );
}elseif( is_home() ) {
$title = $sub_title = __( 'Блог', LANGUAGE_ZONE );
}
if( strlen($title) > 50 ) {
$title = substr( $title, 0, 50 );
$title .= '...';
}
$out .= $before . $title . $after;
if ( get_query_var('paged') ) {
if( is_category() ||
is_day() ||
is_month() ||
is_year() ||
is_search() ||
is_tag() ||
is_author() )
{
$out .= ' (';
}
$out .= ' ' . __('Страница', LANGUAGE_ZONE) . ' ' . get_query_var('paged');
if( is_category() ||
is_day() ||
is_month() ||
is_year() ||
is_search() ||
is_tag() ||
is_author() )
{
$out .= ')';
}
}
$out .= '</ul>';
if( $opts['show_trail'] ) {
echo $out;
}
echo '<h1>' . dt_first_letter_filter( $sub_title ) . '</h1>';
echo $opts['after_wrapper'];
}
} // end dimox_breadcrumbs
Есть идеи? Мы будем очень благодарны за помощь.
Не знаю, как это интегрировать в вашу хлебные крошки... которые по своей природе иерархичны.
Но этот код должен дать вам список страниц, у которых тот же родитель, что и у текущей страницы (т.е. её "братья и сестры"), правда, в совсем не стилизованном виде.
global $post;
$args = array('child_of' => $post->post_parent, 'exclude'=> $post->ID);
if ($post->post_parent) $pages = get_pages($args);
if ($pages) foreach ($pages as $page):
echo $page->post_title .'<br/>';
endforeach;
Если вы выведете текущую страницу, а затем перечислите её "братьев и сестёр", то, думаю, вы сможете программно воссоздать то, что вам нужно.
редактирование 1: настроим данные поста, чтобы можно было использовать get_permalink(), get_the_title() внутри "цикла" и т.д., вместо методов объекта. get_permalink() получает URL текущего элемента в цикле.
global $post;
$args = array('child_of' => $post->post_parent, 'exclude'=> $post->ID);
if ($post->post_parent) $pages = get_pages($args);
if ($pages) :
// сохраняем переменную $temp
$temp = $post;
$siblings = '<ul>';
foreach ($pages as $post): setup_postdata($post);
$siblings .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
endforeach;
// восстанавливаем переменную $post
$post = $temp;
$siblings .= '</ul>';
echo $siblings;
endif;
Аргументы другие, но http://codex.wordpress.org/Function_Reference/get_posts#Reset_after_Postlists_with_offset это цикл foreach, с которым я обычно работаю. Он также предназначен для get_posts, но get_pages работает аналогично, за исключением того, что возвращает только страницы.

Огромное спасибо, Хельга! Это прекрасно сработало, чтобы показать другие страницы... а как сделать их ссылками? Извините, я новичок в PHP. Очень ценю вашу помощь!

СПАСИБО!!! Это переместило страницы-сестры на одну строку, но почему-то они всё ещё не ведут на свои соответствующие страницы...

"страницы-сестры на одну строку"? Я вывел их в виде ненумерованного списка, чтобы вы могли стилизовать их как угодно. У меня ссылки работают отлично. Только что проверил ещё раз. Вы что-то меняли? Этот код не предназначен для вставки прямо в функцию breadcrumbs, поэтому возможно... я просто не тестировал его таким образом.

Да, извините. Мне нужно было кое-что подправить в CSS. Теперь всё работает отлично. Спасибо за вашу помощь! Я очень это ценю!
