Breadcrumb con custom post type senza plugin

6 ott 2015, 12:57:05
Visualizzazioni: 32K
Voti: 1

Ho utilizzato la seguente funzione per le breadcrumb su ogni sito finora, ma il sito di oggi ha 3 custom post type e il cliente vorrebbe le breadcrumb funzionanti, ad esempio invece di "home / vini / naire blanco" otteniamo solo "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 'Home';
        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>Archivio per "; the_time('F jS, Y'); echo'</li>';}
    elseif (is_month()) {echo"<li>Archivio per "; the_time('F, Y'); echo'</li>';}
    elseif (is_year()) {echo"<li>Archivio per "; the_time('Y'); echo'</li>';}
    elseif (is_author()) {echo"<li>Archivio Autore"; echo'</li>';}
    elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {echo "<li>Archivi Blog"; echo'</li>';}
    elseif (is_search()) {echo"<li>Risultati Ricerca"; echo'</li>';}
    echo '</ol>';
}

Come si può vedere nel codice, ho provato ad aggiungere || is_post_type() dopo is_category() || is_single() con un echo get_post_type() ma questo non ha funzionato.

Apprezzerei qualche indicazione per favore.

Grazie

0
Tutte le risposte alla domanda 3
1
11

Il problema con la maggior parte delle funzioni per il breadcrumb è che si basano sull'oggetto $post su tutte le pagine. Non solo la variabile globale $post è totalmente inaffidabile (vedi il mio post qui), ma potrebbe anche non contenere i dati di cui abbiamo bisogno, anche se la variabile globale $post non è compromessa.

La variabile globale $post nelle pagine di archivio (che includono categorie, tag, date, termini di tassonomia, autori e archivi di custom post type) contiene il primo post nel loop prima del loop. Non è sempre vero che il primo post provenga dall'archivio selezionato (la pagina di archivio su cui ti trovi), il che significa che le informazioni che stai cercando potrebbero essere errate, anche se la variabile globale $post non è compromessa. Le condizioni in cui il primo post potrebbe non provenire dall'archivio selezionato includono post inseriti tramite sticky personalizzati e il filtro the_posts.

Recentemente ho riscritto una mia vecchia funzione per il breadcrumb che utilizza l'oggetto $GLOBALS['wp_the_query'] e l'oggetto interrogato salvato nella variabile globale $GLOBALS['wp_the_query']. In questo modo, abbiamo un breadcrumb affidabile al 99,999% che non dipende dalla variabile globale $post o da dati compromessi.

Ecco la funzione: (Richiede PHP 5.4+. Sentiti libero di modificarla secondo necessità)

function get_hansel_and_gretel_breadcrumbs()
{
    // Imposta le variabili per un uso successivo
    $here_text        = __( 'Sei qui!' );
    $home_link        = home_url('/');
    $home_text        = __( 'Home' );
    $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; ';              // Separatore tra le breadcrumb
    $before           = '<span class="current">'; // Tag prima della breadcrumb corrente
    $after            = '</span>';                // Tag dopo la breadcrumb corrente
    $page_addon       = '';                       // Aggiunge il numero di pagina se la query è paginata
    $breadcrumb_trail = '';
    $category_links   = '';

    /** 
     * Imposta la nostra variabile $wp_the_query. Non utilizzare la versione globale a causa 
     * dell'affidabilità
     */
    $wp_the_query   = $GLOBALS['wp_the_query'];
    $queried_object = $wp_the_query->get_queried_object();

    // Gestisce le richieste di singolo post che includono pagine singole, post e allegati
    if ( is_singular() ) 
    {
        /** 
         * Imposta la nostra variabile $post. Non utilizzare la versione globale a causa 
         * dell'affidabilità. Imposteremo la variabile $post_object su $GLOBALS['wp_the_query']
         */
        $post_object = sanitize_post( $queried_object );

        // Imposta le variabili 
        $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 ) 
        {
            // Ottieni le categorie del post
            $categories = get_the_category( $post_id );
            if ( $categories ) {
                // Prendiamo la prima categoria
                $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 );
        }

        // Ottieni i genitori del post se $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 );
        }

        // Costruiamo il percorso del 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;
    }

    // Gestisce gli archivi che includono categorie, tag, tassonomie, date, archivi di custom post type e archivi di autori
    if( is_archive() )
    {
        if (    is_category()
             || is_tag()
             || is_tax()
        ) {
            // Imposta le variabili per questa sezione
            $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 )
            {
                // Ottieni tutti gli antenati del termine corrente
                $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 = __( 'Archivio autore per ') .  $before . $queried_object->data->display_name . $after;

        } elseif ( is_date() ) {
            // Imposta le variabili predefinite
            $year     = $wp_the_query->query_vars['year'];
            $monthnum = $wp_the_query->query_vars['monthnum'];
            $day      = $wp_the_query->query_vars['day'];

            // Ottieni il nome del mese se $monthnum ha un valore
            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;

        }
    }   

    // Gestisce la pagina di ricerca
    if ( is_search() ) {
        $breadcrumb_trail = __( 'Risultati della ricerca per: ' ) . $before . get_search_query() . $after;
    }

    // Gestisce gli errori 404
    if ( is_404() ) {
        $breadcrumb_trail = $before . __( 'Errore 404' ) . $after;
    }

    // Gestisce le pagine 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()
    ) {
        // Non mostrare il breadcrumb sulla prima pagina della home e della 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;
}

Puoi semplicemente chiamarla come segue

echo get_hansel_and_gretel_breadcrumbs();

dove necessario

Questa funzione per il breadcrumb gestisce anche i custom post type

23 mar 2016 11:38:29
Commenti

Il tuo codice funziona benissimo, ma Google smetterà presto di supportare il markup data-vocabulary (https://webmasters.googleblog.com/2020/01/data-vocabulary.html) e il codice genererà errori nella Search Console. L'ho modificato per renderlo compatibile con schema.org (https://schema.org/BreadcrumbList). Ho quasi finito ma non riesco a implementare il valore per itemprop="position". Sono nuovo nella comunità di StackExchange e non so ancora come incollare il codice, quindi ho usato gist per mostrare il mio codice: https://gist.github.com/Marinski/4cefcbb7ded15582c4adfa0dc1c53946. Hai qualche suggerimento su come farlo? Grazie.

Marinski Marinski
21 mag 2020 22:45:26
1

Eccellente! Il codice della risposta accettata (di Pieter Goosen) funziona.

Nota: Ho solo aggiunto un piccolo compito in più. Esegui un controllo di validazione di quella funzione prima di chiamarla, in questo modo:

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

Inoltre, ho salvato quella funzione in un file chiamato breadcrumbs.php nella cartella principale del progetto e l'ho inclusa nel file functions.php usando include_once('breadcrumbs.php'); per essere più organizzato.

8 mag 2017 12:12:02
Commenti

potresti anche racchiudere la funzione stessa con if (!function_exists('get_hansel_and_gretel_breadcrumbs')) nel caso in cui altri plugin o temi utilizzino la stessa funzione/nome.

MikeiLL MikeiLL
5 set 2017 22:45:25
1
function get_hansel_and_gretel_breadcrumbs()
{
    // Imposta variabili per uso successivo
    $here_text        = __( 'Ti trovi qui!' );
    $home_link        = home_url('/');
    $home_text        = __( 'Home' );
    $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; ';              // Separatore tra le breadcrumb
    $before           = '<span class="current">'; // Tag prima della breadcrumb corrente
    $after            = '</span>';                // Tag dopo la breadcrumb corrente
    $page_addon       = '';                       // Aggiunge il numero di pagina se la query è paginata
    $breadcrumb_trail = '';
    $category_links   = '';

    /** 
     * Imposta la nostra variabile $wp_the_query. Non usare la versione globale per
     * questioni di affidabilità
     */
    $wp_the_query   = $GLOBALS['wp_the_query'];
    $queried_object = $wp_the_query->get_queried_object();

    // Gestione di singoli post che includono pagine, articoli e allegati
    if ( is_singular() ) 
    {
        /** 
         * Imposta la nostra variabile $post. Non usare la versione globale per
         * questioni di affidabilità. Imposteremo $post_object su $GLOBALS['wp_the_query']
         */
        $post_object = sanitize_post( $queried_object );

        // Imposta variabili
        $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 ) 
        {
            // Ottieni le categorie del post
            $categories = get_the_category( $post_id );
            if ( $categories ) {
                // Prendiamo la prima categoria
                $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 );
        }

        // Ottieni i genitori del post se $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 );
        }

        // Costruiamo il percorso della 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;
    }

    // Gestione archivi che includono categorie, tag, tassonomie, date, archivi di post type personalizzati e autori
    if( is_archive() )
    {
        if (    is_category()
             || is_tag()
             || is_tax()
        ) {
            // Imposta variabili per questa sezione
            $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 )
            {
                // Ottieni tutti gli antenati del termine corrente
                $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 = __( 'Archivio autore per ') .  $before . $queried_object->data->display_name . $after;

        } elseif ( is_date() ) {
            // Imposta variabili predefinite
            $year     = $wp_the_query->query_vars['year'];
            $monthnum = $wp_the_query->query_vars['monthnum'];
            $day      = $wp_the_query->query_vars['day'];

            // Ottieni il nome del mese se $monthnum ha un valore
            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;

        }
    }   

    // Gestione della pagina di ricerca
    if ( is_search() ) {
        $breadcrumb_trail = __( 'Risultati ricerca per: ' ) . $before . get_search_query() . $after;
    }

    // Gestione errori 404
    if ( is_404() ) {
        $breadcrumb_trail = $before . __( 'Errore 404' ) . $after;
    }

    // Gestione pagine 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()
    ) {
        // Non mostrare breadcrumbs sulla prima pagina di home e 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
Commenti

Puoi spiegare in testo perché questo funzionerà, cosa hai fatto, ecc.?

kero kero
12 nov 2018 11:42:32