Breadcrumbs cu custom post type fără plugin

6 oct. 2015, 12:57:05
Vizualizări: 32K
Voturi: 1

Am folosit până acum următoarea funcție pentru breadcrumbs pe fiecare site, dar site-ul de astăzi are 3 tipuri de postări personalizate (custom post types) și clientul dorește ca breadcrumbs să funcționeze, de exemplu în loc de "home / wines / naire blanco" obținem doar "home / / naire blanco".

function the_breadcrumb() {
        echo '<ol class="breadcrumb" itemprop="breadcrumb">';
    if (!is_home()) {
        echo '<li><a href="';
        echo get_option('home');
        echo '">';
        echo 'Acasă';
        echo '</a></li>';
        if (is_category() || is_single() || is_post_type()) {
            echo '<li>';
            the_category(' </li><li> ');
            echo get_post_type(' </li><li> ');
            if (is_single()) {
                echo '</li><li>';
                the_title();
                echo '</li>';
            }
        } elseif (is_page()) {
            if($post->post_parent){
                $anc = get_post_ancestors( $post->ID );

                foreach ( $anc as $ancestor ) {
                    $output = $output . '<li><a href="'.get_permalink($ancestor).'" title="'.get_the_title($ancestor).'">'.get_the_title($ancestor).'</a></li> ';
                }
                echo $output;
                echo '<strong title="'.$title.'"> '.$title.'</strong>';
            } else {
                echo '<li><a class="active" href="';
                echo the_permalink();
                echo '">';
        echo the_title();
        echo '</a></li>';
            }
        }
    }
    elseif (is_tag()) {single_tag_title();}
    elseif (is_day()) {echo"<li>Arhivă pentru "; the_time('F jS, Y'); echo'</li>';}
    elseif (is_month()) {echo"<li>Arhivă pentru "; the_time('F, Y'); echo'</li>';}
    elseif (is_year()) {echo"<li>Arhivă pentru "; the_time('Y'); echo'</li>';}
    elseif (is_author()) {echo"<li>Arhivă Autor"; echo'</li>';}
    elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {echo "<li>Arhive Blog"; echo'</li>';}
    elseif (is_search()) {echo"<li>Rezultate Căutare"; echo'</li>';}
    echo '</ol>';
}

După cum puteți vedea în cod, am încercat să adaug || is_post_type() după is_category() || is_single() cu un echo get_post_type() dar acest lucru nu a funcționat.

Aș aprecia puțină îndrumare, vă rog.

Mulțumesc

0
Toate răspunsurile la întrebare 3
1
11

Problema majoră cu majoritatea funcțiilor de breadcrumb este că se bazează pe obiectul $post pe toate paginile. Nu numai că globalul $post este total nesigur (vezi postul meu aici), dar s-ar putea să nu conțină nici măcar datele de care avem nevoie, chiar dacă globalul $post nu este compromis.

Globalul $post pe paginile de arhivă (care includ categorie, etichetă, dată, termen de taxonomie, autor și arhive de tipuri personalizate de postări) conține prima postare din buclă înainte de buclă. Nu este întotdeauna adevărat că prima postare este din arhiva selectată (pagina de arhivă pe care vă aflați), ceea ce înseamnă că informațiile pe care le căutați ar putea fi incorecte, chiar dacă globalul $post nu este compromis. Condițiile în care prima postare ar putea să nu fie din arhiva selectată sunt postările care sunt injectate prin sticky personalizate și filtrul the_posts.

Am rescris recent una dintre funcțiile mele foarte vechi de breadcrumb care utilizează obiectul $GLOBALS['wp_the_query'] și obiectul interogat salvat în globalul $GLOBALS['wp_the_query']. În acest fel, avem un breadcrumb 99,999% sigur care nu se bazează pe globalul $post sau pe orice date compromise.

Iată funcția: (Necesită PHP 5.4+. De asemenea, nu ezitați să o modificați după cum este necesar)

function get_hansel_and_gretel_breadcrumbs()
{
    // Setează variabile pentru utilizare ulterioară
    $here_text        = __( 'Te afli aici!' );
    $home_link        = home_url('/');
    $home_text        = __( 'Acasă' );
    $link_before      = '<span typeof="v:Breadcrumb">';
    $link_after       = '</span>';
    $link_attr        = ' rel="v:url" property="v:title"';
    $link             = $link_before . '<a' . $link_attr . ' href="%1$s">%2$s</a>' . $link_after;
    $delimiter        = ' &raquo; ';              // Delimitator între bucăți
    $before           = '<span class="current">'; // Tag înaintea bucății curente
    $after            = '</span>';                // Tag după bucata curentă
    $page_addon       = '';                       // Adaugă numărul paginii dacă interogarea este paginată
    $breadcrumb_trail = '';
    $category_links   = '';

    /** 
     * Setează propria noastră variabilă $wp_the_query. Nu utilizați versiunea globală din cauza 
     * nesiguranței
     */
    $wp_the_query   = $GLOBALS['wp_the_query'];
    $queried_object = $wp_the_query->get_queried_object();

    // Gestionează cererile de postări unice care includ pagini unice, postări și atașamente
    if ( is_singular() ) 
    {
        /** 
         * Setează propria noastră variabilă $post. Nu utilizați versiunea globală din cauza 
         * nesiguranței. Vom seta variabila $post_object la $GLOBALS['wp_the_query']
         */
        $post_object = sanitize_post( $queried_object );

        // Setează variabilele 
        $title          = apply_filters( 'the_title', $post_object->post_title );
        $parent         = $post_object->post_parent;
        $post_type      = $post_object->post_type;
        $post_id        = $post_object->ID;
        $post_link      = $before . $title . $after;
        $parent_string  = '';
        $post_type_link = '';

        if ( 'post' === $post_type ) 
        {
            // Obține categoriile postării
            $categories = get_the_category( $post_id );
            if ( $categories ) {
                // Să luăm prima categorie
                $category  = $categories[0];

                $category_links = get_category_parents( $category, true, $delimiter );
                $category_links = str_replace( '<a',   $link_before . '<a' . $link_attr, $category_links );
                $category_links = str_replace( '</a>', '</a>' . $link_after,             $category_links );
            }
        }

        if ( !in_array( $post_type, ['post', 'page', 'attachment'] ) )
        {
            $post_type_object = get_post_type_object( $post_type );
            $archive_link     = esc_url( get_post_type_archive_link( $post_type ) );

            $post_type_link   = sprintf( $link, $archive_link, $post_type_object->labels->singular_name );
        }

        // Obține părinții postării dacă $parent !== 0
        if ( 0 !== $parent ) 
        {
            $parent_links = [];
            while ( $parent ) {
                $post_parent = get_post( $parent );

                $parent_links[] = sprintf( $link, esc_url( get_permalink( $post_parent->ID ) ), get_the_title( $post_parent->ID ) );

                $parent = $post_parent->post_parent;
            }

            $parent_links = array_reverse( $parent_links );

            $parent_string = implode( $delimiter, $parent_links );
        }

        // Construiește traseul breadcrumb
        if ( $parent_string ) {
            $breadcrumb_trail = $parent_string . $delimiter . $post_link;
        } else {
            $breadcrumb_trail = $post_link;
        }

        if ( $post_type_link )
            $breadcrumb_trail = $post_type_link . $delimiter . $breadcrumb_trail;

        if ( $category_links )
            $breadcrumb_trail = $category_links . $breadcrumb_trail;
    }

    // Gestionează arhivele care includ arhive de categorie, etichetă, taxonomie, dată, tipuri personalizate de postări și arhive de autor
    if( is_archive() )
    {
        if (    is_category()
             || is_tag()
             || is_tax()
        ) {
            // Setează variabilele pentru această secțiune
            $term_object        = get_term( $queried_object );
            $taxonomy           = $term_object->taxonomy;
            $term_id            = $term_object->term_id;
            $term_name          = $term_object->name;
            $term_parent        = $term_object->parent;
            $taxonomy_object    = get_taxonomy( $taxonomy );
            $current_term_link  = $before . $taxonomy_object->labels->singular_name . ': ' . $term_name . $after;
            $parent_term_string = '';

            if ( 0 !== $term_parent )
            {
                // Obține toți strămoșii termenului curent
                $parent_term_links = [];
                while ( $term_parent ) {
                    $term = get_term( $term_parent, $taxonomy );

                    $parent_term_links[] = sprintf( $link, esc_url( get_term_link( $term ) ), $term->name );

                    $term_parent = $term->parent;
                }

                $parent_term_links  = array_reverse( $parent_term_links );
                $parent_term_string = implode( $delimiter, $parent_term_links );
            }

            if ( $parent_term_string ) {
                $breadcrumb_trail = $parent_term_string . $delimiter . $current_term_link;
            } else {
                $breadcrumb_trail = $current_term_link;
            }

        } elseif ( is_author() ) {

            $breadcrumb_trail = __( 'Arhivă autor pentru ') .  $before . $queried_object->data->display_name . $after;

        } elseif ( is_date() ) {
            // Setează variabile implicite
            $year     = $wp_the_query->query_vars['year'];
            $monthnum = $wp_the_query->query_vars['monthnum'];
            $day      = $wp_the_query->query_vars['day'];

            // Obține numele lunii dacă $monthnum are o valoare
            if ( $monthnum ) {
                $date_time  = DateTime::createFromFormat( '!m', $monthnum );
                $month_name = $date_time->format( 'F' );
            }

            if ( is_year() ) {

                $breadcrumb_trail = $before . $year . $after;

            } elseif( is_month() ) {

                $year_link        = sprintf( $link, esc_url( get_year_link( $year ) ), $year );

                $breadcrumb_trail = $year_link . $delimiter . $before . $month_name . $after;

            } elseif( is_day() ) {

                $year_link        = sprintf( $link, esc_url( get_year_link( $year ) ),             $year       );
                $month_link       = sprintf( $link, esc_url( get_month_link( $year, $monthnum ) ), $month_name );

                $breadcrumb_trail = $year_link . $delimiter . $month_link . $delimiter . $before . $day . $after;
            }

        } elseif ( is_post_type_archive() ) {

            $post_type        = $wp_the_query->query_vars['post_type'];
            $post_type_object = get_post_type_object( $post_type );

            $breadcrumb_trail = $before . $post_type_object->labels->singular_name . $after;

        }
    }   

    // Gestionează pagina de căutare
    if ( is_search() ) {
        $breadcrumb_trail = __( 'Căutare pentru: ' ) . $before . get_search_query() . $after;
    }

    // Gestionează erorile 404
    if ( is_404() ) {
        $breadcrumb_trail = $before . __( 'Eroare 404' ) . $after;
    }

    // Gestionează paginile paginate
    if ( is_paged() ) {
        $current_page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : get_query_var( 'page' );
        $page_addon   = $before . sprintf( __( ' ( Pagina %s )' ), number_format_i18n( $current_page ) ) . $after;
    }

    $breadcrumb_output_link  = '';
    $breadcrumb_output_link .= '<div class="breadcrumb">';
    if (    is_home()
         || is_front_page()
    ) {
        // Nu afișa breadcrumbs pe pagina unu de acasă și pagină front
        if ( is_paged() ) {
            $breadcrumb_output_link .= $here_text . $delimiter;
            $breadcrumb_output_link .= '<a href="' . $home_link . '">' . $home_text . '</a>';
            $breadcrumb_output_link .= $page_addon;
        }
    } else {
        $breadcrumb_output_link .= $here_text . $delimiter;
        $breadcrumb_output_link .= '<a href="' . $home_link . '" rel="v:url" property="v:title">' . $home_text . '</a>';
        $breadcrumb_output_link .= $delimiter;
        $breadcrumb_output_link .= $breadcrumb_trail;
        $breadcrumb_output_link .= $page_addon;
    }
    $breadcrumb_output_link .= '</div><!-- .breadcrumbs -->';

    return $breadcrumb_output_link;
}

O puteți apela simplu astfel

echo get_hansel_and_gretel_breadcrumbs();

unde este nevoie

Această funcție de breadcrumb se ocupă și de tipurile personalizate de postări

23 mar. 2016 11:38:29
Comentarii

Codul tău funcționează excelent, dar Google va înceta în curând suportul pentru markup-ul data-vocabulary (https://webmasters.googleblog.com/2020/01/data-vocabulary.html) iar codul va genera erori în Search Console. L-am modificat pentru a-l face compatibil cu schema.org (https://schema.org/BreadcrumbList). Sunt aproape gata, dar nu pot implementa valoarea pentru atributul itemprop="position". Sunt nou în comunitatea StackExchange și nu știu încă cum să lipesc cod, așa că am folosit gist pentru a arăta codul meu: https://gist.github.com/Marinski/4cefcbb7ded15582c4adfa0dc1c53946. Ai vreo sugestie despre cum să fac asta? Mulțumesc.

Marinski Marinski
21 mai 2020 22:45:26
1

Excelent! Funcționează codul din răspunsul acceptat (al lui Pieter Goosen).

Notă: Am adăugat doar o mică sarcină în plus. Realizați o verificare de validare a acelei funcții înainte de a o apela, astfel:

<?php 
   if(function_exists('get_hansel_and_gretel_breadcrumbs')): 
      echo get_hansel_and_gretel_breadcrumbs();
   endif;
?>

În plus, am salvat acea funcție într-un fișier numit breadcrumbs.php în folderul rădăcină al proiectului și l-am inclus în fișierul functions.php folosind include_once('breadcrumbs.php'); pentru a fi mai organizat.

8 mai 2017 12:12:02
Comentarii

de asemenea, puteți înconjura funcția în sine cu if (!function_exists('get_hansel_and_gretel_breadcrumbs')) în cazul în care alte plugin-uri sau teme folosesc aceeași funcție/nume.

MikeiLL MikeiLL
5 sept. 2017 22:45:25
1
function get_hansel_and_gretel_breadcrumbs()
{
    // Setăm variabilele pentru utilizare ulterioară
    $here_text        = __( 'Sunteți aici!' );
    $home_link        = home_url('/');
    $home_text        = __( 'Acasă' );
    $link_before      = '<span typeof="v:Breadcrumb">';
    $link_after       = '</span>';
    $link_attr        = ' rel="v:url" property="v:title"';
    $link             = $link_before . '<a' . $link_attr . ' href="%1$s">%2$s</a>' . $link_after;
    $delimiter        = ' &raquo; ';              // Delimitator între fragmente
    $before           = '<span class="current">'; // Etichetă înainte de fragmentul curent
    $after            = '</span>';                // Etichetă după fragmentul curent
    $page_addon       = '';                       // Adaugă numărul paginii dacă interogarea este paginată
    $breadcrumb_trail = '';
    $category_links   = '';

    /** 
     * Setăm propria noastră variabilă $wp_the_query. Nu utilizați variabila globală datorită 
     * problemelor de fiabilitate
     */
    $wp_the_query   = $GLOBALS['wp_the_query'];
    $queried_object = $wp_the_query->get_queried_object();

    // Gestionează cererile pentru postări unice care includ pagini unice, postări și atașamente
    if ( is_singular() ) 
    {
        /** 
         * Setăm propria noastră variabilă $post. Nu utilizați variabila globală datorită 
         * problemelor de fiabilitate. Vom seta variabila $post_object la $GLOBALS['wp_the_query']
         */
        $post_object = sanitize_post( $queried_object );

        // Setăm variabilele 
        $title          = apply_filters( 'the_title', $post_object->post_title );
        $parent         = $post_object->post_parent;
        $post_type      = $post_object->post_type;
        $post_id        = $post_object->ID;
        $post_link      = $before . $title . $after;
        $parent_string  = '';
        $post_type_link = '';

        if ( 'post' === $post_type ) 
        {
            // Obține categoriile postării
            $categories = get_the_category( $post_id );
            if ( $categories ) {
                // Luăm prima categorie
                $category  = $categories[0];

                $category_links = get_category_parents( $category, true, $delimiter );
                $category_links = str_replace( '<a',   $link_before . '<a' . $link_attr, $category_links );
                $category_links = str_replace( '</a>', '</a>' . $link_after,             $category_links );
            }
        }

        if ( !in_array( $post_type, ['post', 'page', 'attachment'] ) )
        {
            $post_type_object = get_post_type_object( $post_type );
            $archive_link     = esc_url( get_post_type_archive_link( $post_type ) );

            $post_type_link   = sprintf( $link, $archive_link, $post_type_object->labels->singular_name );
        }

        // Obține părinții postării dacă $parent !== 0
        if ( 0 !== $parent ) 
        {
            $parent_links = [];
            while ( $parent ) {
                $post_parent = get_post( $parent );

                $parent_links[] = sprintf( $link, esc_url( get_permalink( $post_parent->ID ) ), get_the_title( $post_parent->ID ) );

                $parent = $post_parent->post_parent;
            }

            $parent_links = array_reverse( $parent_links );

            $parent_string = implode( $delimiter, $parent_links );
        }

        // Construim traseul breadcrumb
        if ( $parent_string ) {
            $breadcrumb_trail = $parent_string . $delimiter . $post_link;
        } else {
            $breadcrumb_trail = $post_link;
        }

        if ( $post_type_link )
            $breadcrumb_trail = $post_type_link . $delimiter . $breadcrumb_trail;

        if ( $category_links )
            $breadcrumb_trail = $category_links . $breadcrumb_trail;
    }

    // Gestionează arhivele care includ arhive de categorii, etichete, taxonomii, date, tipuri personalizate de postări și arhive de autori
    if( is_archive() )
    {
        if (    is_category()
             || is_tag()
             || is_tax()
        ) {
            // Setăm variabilele pentru această secțiune
            $term_object        = get_term( $queried_object );
            $taxonomy           = $term_object->taxonomy;
            $term_id            = $term_object->term_id;
            $term_name          = $term_object->name;
            $term_parent        = $term_object->parent;
            $taxonomy_object    = get_taxonomy( $taxonomy );
            $current_term_link  = $before . $taxonomy_object->labels->singular_name . ': ' . $term_name . $after;
            $parent_term_string = '';

            if ( 0 !== $term_parent )
            {
                // Obține toți strămoșii termenului curent
                $parent_term_links = [];
                while ( $term_parent ) {
                    $term = get_term( $term_parent, $taxonomy );

                    $parent_term_links[] = sprintf( $link, esc_url( get_term_link( $term ) ), $term->name );

                    $term_parent = $term->parent;
                }

                $parent_term_links  = array_reverse( $parent_term_links );
                $parent_term_string = implode( $delimiter, $parent_term_links );
            }

            if ( $parent_term_string ) {
                $breadcrumb_trail = $parent_term_string . $delimiter . $current_term_link;
            } else {
                $breadcrumb_trail = $current_term_link;
            }

        } elseif ( is_author() ) {

            $breadcrumb_trail = __( 'Arhivă autor pentru ') .  $before . $queried_object->data->display_name . $after;

        } elseif ( is_date() ) {
            // Setăm variabilele implicite
            $year     = $wp_the_query->query_vars['year'];
            $monthnum = $wp_the_query->query_vars['monthnum'];
            $day      = $wp_the_query->query_vars['day'];

            // Obține numele lunii dacă $monthnum are o valoare
            if ( $monthnum ) {
                $date_time  = DateTime::createFromFormat( '!m', $monthnum );
                $month_name = $date_time->format( 'F' );
            }

            if ( is_year() ) {

                $breadcrumb_trail = $before . $year . $after;

            } elseif( is_month() ) {

                $year_link        = sprintf( $link, esc_url( get_year_link( $year ) ), $year );

                $breadcrumb_trail = $year_link . $delimiter . $before . $month_name . $after;

            } elseif( is_day() ) {

                $year_link        = sprintf( $link, esc_url( get_year_link( $year ) ),             $year       );
                $month_link       = sprintf( $link, esc_url( get_month_link( $year, $monthnum ) ), $month_name );

                $breadcrumb_trail = $year_link . $delimiter . $month_link . $delimiter . $before . $day . $after;
            }

        } elseif ( is_post_type_archive() ) {

            $post_type        = $wp_the_query->query_vars['post_type'];
            $post_type_object = get_post_type_object( $post_type );

            $breadcrumb_trail = $before . $post_type_object->labels->singular_name . $after;

        }
    }   

    // Gestionează pagina de căutare
    if ( is_search() ) {
        $breadcrumb_trail = __( 'Rezultate căutare pentru: ' ) . $before . get_search_query() . $after;
    }

    // Gestionează erorile 404
    if ( is_404() ) {
        $breadcrumb_trail = $before . __( 'Eroare 404' ) . $after;
    }

    // Gestionează paginile paginate
    if ( is_paged() ) {
        $current_page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : get_query_var( 'page' );
        $page_addon   = $before . sprintf( __( ' ( Pagina %s )' ), number_format_i18n( $current_page ) ) . $after;
    }

    $breadcrumb_output_link  = '';
    $breadcrumb_output_link .= '<div class="breadcrumb">';
    if (    is_home()
         || is_front_page()
    ) {
        // Nu afișa breadcrumbs pe pagina unu de acasă și frontpage
        if ( is_paged() ) {
            $breadcrumb_output_link .= $here_text . $delimiter;
            $breadcrumb_output_link .= '<a href="' . $home_link . '">' . $home_text . '</a>';
            $breadcrumb_output_link .= $page_addon;
        }
    } else {
        $breadcrumb_output_link .= $here_text . $delimiter;
        $breadcrumb_output_link .= '<a href="' . $home_link . '" rel="v:url" property="v:title">' . $home_text . '</a>';
        $breadcrumb_output_link .= $delimiter;
        $breadcrumb_output_link .= $breadcrumb_trail;
        $breadcrumb_output_link .= $page_addon;
    }
    $breadcrumb_output_link .= '</div><!-- .breadcrumbs -->';

    return $breadcrumb_output_link;
}
12 nov. 2018 11:35:35
Comentarii

Poți să explici în text de ce va funcționa, ce ai făcut, etc.?

kero kero
12 nov. 2018 11:42:32