Хлебные крошки с отображением родительских и дочерних страниц

7 мар. 2012 г., 16:12:38
Просмотры: 18K
Голосов: 3

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

Например, на 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 .= '&nbsp;' . __('Страница', 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

Есть идеи? Мы будем очень благодарны за помощь.

3
Комментарии

когда я добавляю это в свою тему (после того, как закомментирую dt_first_letter_function(), которой у меня нет)... я получаю родитель > дочерний > внучатый > вы здесь. в чем именно проблема?

helgatheviking helgatheviking
7 мар. 2012 г. 16:48:00

Я хочу, чтобы отображались другие страницы того же уровня. То есть вместо просто отображения пути/где вы были, оно бы показывало другие дочерние страницы с тем же родителем. Если Parent1 имеет 4 дочерние страницы, оно бы показывало все 4 дочерние страницы с CSS-стилизацией для выделения текущей (дочерней) страницы. Другими словами, оно бы показывало Главная > Parent1 > Child1 > Child2 > Child3 (Текущая страница) > Child4. Пример такого поведения с категориями можно найти здесь: ссылка. Как думаете, есть ли способ сделать это без необходимости создавать пользовательское меню на каждой странице?

Nick Nick
7 мар. 2012 г. 17:13:37

nick, извини, я не понял, что ты хотел, так как предположил, что child1 и child подразумевают иерархию родитель > дочерний > внучатый, а не отношения на одном уровне. я опубликовал решение, которое должно получить страницы того же уровня для любой конкретной страницы

helgatheviking helgatheviking
7 мар. 2012 г. 17:45:54
Все ответы на вопрос 1
5

Не знаю, как это интегрировать в вашу хлебные крошки... которые по своей природе иерархичны.

Но этот код должен дать вам список страниц, у которых тот же родитель, что и у текущей страницы (т.е. её "братья и сестры"), правда, в совсем не стилизованном виде.

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 работает аналогично, за исключением того, что возвращает только страницы.

7 мар. 2012 г. 17:44:28
Комментарии

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

Nick Nick
7 мар. 2012 г. 18:25:22

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

Nick Nick
8 мар. 2012 г. 02:06:31

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

helgatheviking helgatheviking
8 мар. 2012 г. 02:48:07

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

Nick Nick
8 мар. 2012 г. 13:01:02

Пожалуйста. Если мой ответ решил ваш вопрос, не могли бы вы отметить его как правильный (зелёная галочка)?

helgatheviking helgatheviking
8 мар. 2012 г. 16:21:12