Breadcrumbs cu custom post type fără plugin
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

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 = ' » '; // 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

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.

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.

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 = ' » '; // 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;
}
