1.5 – Breadcrumbs

Nel tema child ho inserito la funzione per generare le breadcrumbs con un workaround per gestire i custom post type. Al momento la funzione è nel file functions.php del tema child, quando effettuerò il merge dei temi questa funzione andrà a sovrascrivere la funzione per le breadcrumbs del tema parent presente nella cartella inc/.

// Bootstrap breadcrumbs
function the_breadcrumb() {
	$show_current   = 1; // 1 - show current page title, 0 - don't show
	global $post;
	global $wp_query;
	$parent_id      = ($post) ? $post->post_parent : '';
	$frontpage_id   = get_option('page_on_front');
// NON MOSTRA LE BREADCRUMBS IN HOME PAGE
if ( !is_front_page() ) {
	echo '<nav aria-label="breadcrumb">';
	echo '<ol class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList">';
	echo '<li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a itemprop="item" href="';
	echo get_option('home');
	echo '">';
	echo '<span itemprop="name">Home</span>';
	echo '</a><meta itemprop="position" content="1" /></li>';
	// MOSTRA IL TITOLO DELLA PAGINA NELLA HOME BLOG
	if (is_home()){ // FUNZIONA (MA è MIGLIORABILE)
		global $post;
		$page_for_posts_id = get_option('page_for_posts');
		if ( $page_for_posts_id ) {
			$post = get_page($page_for_posts_id);
			setup_postdata($post); ?>
			<li class="breadcrumb-item active">
			<?php the_title(); ?>
			</li>
			<?php rewind_posts();
		}
	} // MOSTRA IL LINK ALLA HOME BLOG IN OGNI POST
	elseif ( is_single() && !is_attachment() && !is_custom_post_type() ) { // FUNZIONA
		/** Cancellare la parte da echo in poi se non si vuole la blog base o modificare l'url della stessa */
		echo '<li class="breadcrumb-item"><a href="'.get_site_url().'/blog">Blog</a></li><li class="breadcrumb-item active">';the_title();'</li>';
	} // MOSTRA IL LINK ALLA HOME BLOG E AL POST PARENT
	elseif ( is_attachment() ) { // FUNZIONA
		$parent = get_post($post->post_parent);
		$permalink = get_permalink( $current_attachment->post_parent );
		$parent_title = get_post( $current_attachment->post_parent )->post_title;
		/** Cancellare la parte da echo in poi se non si vuole la blog base o modificare l'url della stessa */
		echo '<li class="breadcrumb-item"><a href="'.get_site_url().'/blog">Blog</a></li><li class="breadcrumb-item"><a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a></li>';
		echo '<li class="breadcrumb-item active">';the_title();'</li>';
	} // MOSTRA LE PAGINE PARENT SE CI SONO ALTRIMENTI SOLO LA PAGINA CORRENTE
	elseif ( is_page()){ // FUNZIONA
		if ( $parent_id ) {
			if ($parent_id != $frontpage_id) {
				$breadcrumbs = array();
				while ($parent_id) {
					$page = get_page($parent_id);
					if ($parent_id != $frontpage_id) {
						$breadcrumbs[] = sprintf('<li class="breadcrumb-item"><a href="%s">%s</a></li>', esc_url( get_permalink($page->ID) ), get_the_title($page->ID));
					}
					$parent_id = $page->post_parent;
				}
				$breadcrumbs = array_reverse($breadcrumbs);
				for ($i = 0; $i < count($breadcrumbs); $i++) {
					echo $breadcrumbs[$i];
				}
			} echo '<li class="breadcrumb-item active">';the_title();'</li>';
		} else {
			echo '<li class="breadcrumb-item active">';the_title();'</li>';
		}
	} // MOSTRA LE CATEGORIE PARENT SE CI SONO ALTRIMENTI SOLO LA CATEGORIA CORRENTE
	 elseif (is_category()) {
		if ( $term_ids = get_ancestors( get_queried_object_id(), 'category') ) { //FUNZIONA [Da testare con tax]
			$crumbs = [];
			foreach ( $term_ids as $term_id ) {
				$term = get_term( $term_id, 'category' );
				if ( $term && ! is_wp_error( $term ) ) {
					$crumbs[] = sprintf( '<li class="breadcrumb-item"><a href="%s">%s</a></li>', esc_url( get_term_link( $term ) ), esc_html( $term->name ) );
					}
				}
				echo implode( array_reverse( $crumbs ) );
				echo '<li class="breadcrumb-item active">';single_cat_title();'</li>';
		} else //FUNZIONA
		echo '<li class="breadcrumb-item active">';single_cat_title();'</li>';
	} // GESTISCE LA PAGINA 404
	 elseif ( is_404() ) { //FUNZIONA
		echo '<li class="breadcrumb-item active">404 - Pagina non trovata</li>';
	} // GESTISCE L'ARCHIVIO TAG
	 elseif (is_tag()) { //FUNZIONA
		echo "<li class='breadcrumb-item active'>Tag: "; single_tag_title(); echo'</li>';
	}
	elseif (is_day()) {
		echo"<li class='breadcrumb-item'>Archive for "; the_time('F jS, Y'); echo'</li>';
	}
	elseif (is_month()) {
		echo"<li class='breadcrumb-item'>Archive for "; the_time('F, Y'); echo'</li>';
	}
	elseif (is_year()) {
		echo"<li class='breadcrumb-item'>Archive for "; the_time('Y'); echo'</li>';
	}
	elseif (is_author()) {
		echo"<li class='breadcrumb-item'>Author Archive"; echo'</li>';
	}
	elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { // NON FUNZIONA
		echo "<li>Blog Archives"; echo'</li>';}
	// GESTISCE LA PAGINA RISULTATI DI RICERCA
	elseif (is_search()) { //FUNZIONA
		echo"<li class='breadcrumb-item'>";printf( esc_html__( 'Risultati di ricerca per: %s', '_incubation' ), '<span>' . get_search_query() . '</span>' ); echo'</li>';
	} elseif ( is_single() && !is_custom_post_type( 'version' ) ) {
		echo '<li class="breadcrumb-item"><a href="'.get_site_url().'/versioni">Versioni</a></li><li class="breadcrumb-item active">';the_title();'</li>';
	}// MANCANO CPT E TAX
}
echo '</ol>';
echo '</nav>';
}

L’output è compatibile con le breadcrumb di bootstrap e prevede l’implementazione, migliorabile, di schema.org come microdata.

La funzione è richiamata in ogni pagina tramite shortcode incluso in una funzione condizionale in modo che se anche le breadcrumb dovessero essere disattivate non si genererebbero errori.

        <?php
        if (function_exists('the_breadcrumb')) {
            the_breadcrumb();
        }
         ?> 

La funzione è basata su istruzioni condizionali.

  • Se la pagina in visualizzazione usa il template home e non è impostata come pagina iniziale viene visualizzato il link alla home;
  • Se la pagina in visualizzazione è un articolo singolo che non è un allegato o un custom post type viene visualizzato il link alla home, il link alla pagina del blog (il cui url al momento è /blog, modificabile), e il titolo dell’articolo;
  • Se la pagina in visualizzazione è un allegato viene mostrato il link alla home, il link alla pagina del blog, il link all’articolo in cui è contenuto l’allegato stesso e il titolo dell’allegato;
  • Se viene visualizzata una pagina viene mostrato il link alla home, il link a eventuali pagine parent in ordine gerarchico e il titolo della pagina stessa;
  • Se viene visualizzata la pagina di una categoria viene mostrato il link alla home, il link a eventuali categorie parent in ordine gerarchico e il titolo della categoria stessa;
  • Se viene visualizzata la pagina 404 viene mostrato il link alla home e il titolo della pagina;
  • Se viene visualizzata la pagina di un tag viene mostrato il link alla home e il titolo del tag;
  • Se viene visualizzata la pagina con i risultati di ricerca viene mostrato il link alla home e la stringa “Risultati di ricerca per:” con il termine che era stato cercato;
  • Se viene visualizzato un custom post type version viene mostrato il link alla pagina che li contiene e il titolo del cpt stesso.

Workaround

  • WordPress, per impostazione predefinita, consente di assegnare più categorie allo stesso post e nelle breadcrumbs sarebbero comparse tutte. Tra due delle possibili soluzioni (recuperare la prima categoria cronologicamente assegnata al post o eliminare le categorie dalla url degli articoli) ho scelto la seconda per evitare il rischio che la prima categoria sia quella meno rilevante.
  • Per inserire nelle breadcrumbs il riferimento ai custom post type ho modificato la struttura dei permalink in modo da mostrare nell’url la pagina Versioni che li elenca. Quando avrò impostato gli altri CPT userò lo stesso procedimento.
'rewrite'				=> array( 'slug' => 'versioni' ),