Breadcrumbs care afișează paginile Părinte și Copil

7 mar. 2012, 16:12:38
Vizualizări: 18K
Voturi: 3

Încercăm să creăm o funcție pentru breadcrumbs care să afișeze nu doar calea către pagina curentă, ci și către alte pagini cu același părinte.

De exemplu, pe example.com/parent1/child3, breadcrumbs ar trebui să arate Home > Parent1 > Child1 > Child2 > Child3 > Child4 în loc de simplul Home > Parent1 > Child3.

Folosim o versiune modificată a scriptului de breadcrumbs de la http://dimox.net/wordpress-breadcrumbs-without-a-plugin/:

function dimox_breadcrumbs( $args = array() ) {
$defaults = array(
    'delimiter'         => '»',
    'home'              => 'Acasă',
    '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']; // text pentru link-ul 'Acasă'
$showCurrent = 0; // 1 - afișează titlul postului/paginii curente în breadcrumbs, 0 - nu afișa
$before = $opts['before']; // tag înainte de elementul curent
$after = $opts['after']; // tag după elementul curent
$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 = __( 'Arhivă după categoria "%"', 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 = __( 'Rezultate căutare pentru "%"', 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 {
// blog și alte elemente
            $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 = __( 'Postări etichetate "%"', LANGUAGE_ZONE );
        $sub_title = single_tag_title('', false);
        $title = str_replace( '%', $sub_title, $title );

    }elseif ( is_author() ) {
        global $author;
        $userdata = get_userdata($author);
        $title = __( 'Articole postate de %', LANGUAGE_ZONE );
        $sub_title = $userdata->display_name;
        $title = str_replace( '%', $sub_title, $title );

    }elseif ( is_404() ) {
        $title = $sub_title = __( 'Eroare 404', LANGUAGE_ZONE );

    }elseif( is_home() ) {
        $title = $sub_title = __( 'Blog', 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;' . __('Pagina', 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'];

}
} // sfârșit dimox_breadcrumbs

Ce idei aveți? Apreciem orice sugestie.

3
Comentarii

când introduc asta în tema mea (după ce comentez funcția dt_first_letter_function() pe care nu o am)... obțin părinte > copil > nepot > sunteți aici. care este problema exact?

helgatheviking helgatheviking
7 mar. 2012 16:48:00

Mi-aș dori să afișeze alte pagini de același nivel. Deci, în loc să arate doar calea/unde ați fost, ar afișa alte pagini copil cu același părinte. Dacă Părinte1 are 4 Pagini Copil, ar afișa toate cele 4 pagini copil cu stilizare CSS pentru a evidenția pagina curentă (copil). Cu alte cuvinte, ar arăta Acasă > Părinte1 > Copil1 > Copil2 > Copil3 (Pagina Curentă) > Copil4. Un exemplu de acest lucru folosind categorii poate fi găsit aici: link. Crezi că există vreo modalitate de a face asta fără a fi nevoie să creez un meniu personalizat pe fiecare pagină?

Nick Nick
7 mar. 2012 17:13:37

nick, îmi pare rău că nu am înțeles ce doreai, am presupus că copil1 și copil implicau o ierarhie de tipul părinte > copil > nepot în loc de o relație de fraternitate. am postat o soluție care ar trebui să obțină paginile de același nivel (frați) pentru orice pagină anume

helgatheviking helgatheviking
7 mar. 2012 17:45:54
Toate răspunsurile la întrebare 1
5

Nu știu sigur cum să integrezi asta în breadcrumbs-ul tău... care, prin definiție, cred că sunt ierarhice.

Dar acest cod ar trebui să îți ofere o listă cu paginile care au același părinte ca pagina curentă (adică frații ei), deși într-un mod complet nestilizat.

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;

Dacă listezi pagina curentă și apoi afișezi frații ei, poți recrea programatic ceea ce cauți, cred.

edit 1: Am configurat postdata pentru a putea folosi get_permalink(), get_the_title() în interiorul unei "bucle" etc. în loc de metode ale obiectului. get_permalink() obține URL-ul elementului curent din buclă

global $post;

$args = array('child_of' => $post->post_parent, 'exclude'=> $post->ID);
if ($post->post_parent) $pages = get_pages($args);

if ($pages) :

//stocăm variabila $temp
$temp = $post;

$siblings = '<ul>';

foreach ($pages as $post): setup_postdata($post); 

    $siblings .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
endforeach;

//restabilim variabila $post
$post = $temp;

$siblings .= '</ul>';

echo $siblings;

endif;

Argumentele sunt diferite, dar http://codex.wordpress.org/Function_Reference/get_posts#Reset_after_Postlists_with_offset este bucla foreach pe care o folosesc de obicei. Este pentru get_posts, dar get_pages funcționează la fel, cu excepția faptului că returnează doar pagini.

7 mar. 2012 17:44:28
Comentarii

Mulțumesc mult, helga! A funcționat perfect pentru a afișa celelalte pagini... cum le-aș putea face să se lege? Îmi cer scuze, sunt începător în PHP. Apreciez foarte mult ajutorul tău!

Nick Nick
7 mar. 2012 18:25:22

MULȚUMESC!!! Le-a mutat pe paginile surori pe aceeași linie, dar din nu știu ce motiv încă nu se leagă de paginile lor respective...

Nick Nick
8 mar. 2012 02:06:31

"paginile surori pe aceeași linie"? Le-am făcut să fie afișate într-o listă neordonată ca să le poți formata cum dorești. Legăturile funcționează bine pentru mine. Tocmai am testat din nou. Ai modificat ceva? Nu e chiar menit să fie lipit în funcția de breadcrumbs, deci probabil ar putea... doar că nu am testat așa.

helgatheviking helgatheviking
8 mar. 2012 02:48:07

Da, scuze. Am avut nevoie să ajustez ceva în CSS. Acum funcționează perfect. Mulțumesc pentru ajutor! Apreciez foarte mult!

Nick Nick
8 mar. 2012 13:01:02

cu plăcere. dacă răspunsul meu ți-a rezolvat întrebarea, poți să îl marchezi ca răspuns? (bifa verde)

helgatheviking helgatheviking
8 mar. 2012 16:21:12