Skip to content

Instantly share code, notes, and snippets.

@twarrdy
Created March 4, 2021 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save twarrdy/ee4a5c4188eaa659cebfb42a2c783c93 to your computer and use it in GitHub Desktop.
Save twarrdy/ee4a5c4188eaa659cebfb42a2c783c93 to your computer and use it in GitHub Desktop.
add_filter('wpseo_breadcrumb_links', array($this, 'filter_breadcrumbs'), 9);
add_filter('rank_math/frontend/breadcrumb/items', array($this, 'filter_breadcrumbs'), 9);
add_filter('seopress_pro_breadcrumbs_crumbs', array($this, 'filter_breadcrumbs'), 9);
add_filter('woocommerce_get_breadcrumb', array($this, 'filter_breadcrumbs'), 9);
add_filter('slim_seo_breadcrumbs_links', array($this, 'filter_breadcrumbs'), 9);
function filter_breadcrumbs($links) {
// Get post type permastructure settings
global $permalink_manager_uris, $permalink_manager_options, $post, $wpdb, $wp, $wp_current_filter;
// Check if the filter should be activated
if(empty($permalink_manager_options['general']['yoast_breadcrumbs']) || empty($permalink_manager_uris)) { return $links; }
// Get current post/page/term (if available)
$queried_element = get_queried_object();
if(!empty($queried_element->ID)) {
$element_id = $queried_element->ID;
} else if(!empty($queried_element->term_id)) {
$element_id = "tax-{$queried_element->term_id}";
}
// Get the custom permalink (if available) or the current request URL (if unavailable)
if(!empty($element_id) && !empty($permalink_manager_uris[$element_id])) {
$custom_uri = preg_replace("/([^\/]+)$/", '', $permalink_manager_uris[$element_id]);
} else {
$custom_uri = trim(preg_replace("/([^\/]+)$/", '', $wp->request), "/");
}
$all_uris = array_flip($permalink_manager_uris);
$custom_uri_parts = explode('/', trim($custom_uri));
$breadcrumbs = array();
$snowball = '';
$available_taxonomies = Permalink_Manager_Helper_Functions::get_taxonomies_array();
$available_post_types = Permalink_Manager_Helper_Functions::get_post_types_array();
$current_filter = end($wp_current_filter);
// Get Yoast Meta (the breadcrumbs titles can be changed in Yoast metabox)
$yoast_meta_terms = get_option('wpseo_taxonomy_meta');
// Get internal breadcrumb elements
foreach($custom_uri_parts as $slug) {
if(empty($slug)) { continue; }
$snowball = (empty($snowball)) ? $slug : "{$snowball}/{$slug}";
// 1A. Try to match any custom URI
if($snowball) {
$uri = trim($snowball, "/");
$element = (!empty($all_uris[$uri])) ? $all_uris[$uri] : false;
if(!empty($element) && strpos($element, 'tax-') !== false) {
$element_id = intval(preg_replace("/[^0-9]/", "", $element));
$element = get_term($element_id);
} else if(is_numeric($element)) {
$element = get_post($element);
}
}
// 1B. Try to get term
if(empty($element) && !empty($available_taxonomies)) {
$sql = sprintf("SELECT t.term_id, t.name, tt.taxonomy FROM {$wpdb->terms} AS t LEFT JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id WHERE slug = '%s' AND tt.taxonomy IN ('%s') LIMIT 1", esc_sql($slug), implode("','", array_keys($available_taxonomies)));
$element = $wpdb->get_row($sql);
}
// 1C. Try to get page/post
if(empty($element) && !empty($available_post_types)) {
$sql = sprintf("SELECT ID, post_title, post_type FROM {$wpdb->posts} WHERE post_name = '%s' AND post_status = 'publish' AND post_type IN ('%s') AND post_type != 'attachment' LIMIT 1", esc_sql($slug), implode("','", array_keys($available_post_types)));
$element = $wpdb->get_row($sql);
}
// 2A. When the term is found, we can add it to the breadcrumbs
if(!empty($element->term_id)) {
$term_id = apply_filters('wpml_object_id', $element->term_id, $element->taxonomy, true);
$term = ($element->term_id !== $term_id) ? get_term($term_id) : $element;
$title = (!empty($yoast_meta_terms[$term->taxonomy][$term->term_id]['wpseo_bctitle'])) ? $yoast_meta_terms[$term->taxonomy][$term->term_id]['wpseo_bctitle'] : $term->name;
$breadcrumbs[] = array(
'text' => $title,
'url' => get_term_link((int) $term->term_id, $term->taxonomy),
);
}
// 2B. When the post/page is found, we can add it to the breadcrumbs
else if(!empty($element->ID)) {
$page_id = apply_filters('wpml_object_id', $element->ID, $element->post_type, true);
$page = ($element->ID !== $page_id) ? get_post($page_id) : $element;
$title = get_post_meta($page->ID, '_yoast_wpseo_bctitle', true);
$title = (!empty($title)) ? $title : $page->post_title;
$breadcrumbs[] = array(
'text' => $title,
'url' => get_permalink($page->ID),
);
}
}
// Add new links to current breadcrumbs array
if(!empty($links) && is_array($links)) {
$first_element = reset($links);
$last_element = end($links);
$breadcrumbs = (!empty($breadcrumbs)) ? $breadcrumbs : array();
// Support RankMath/SEOPress/WooCommerce/Slim SEO breadcrumbs
if(in_array($current_filter, array('wpseo_breadcrumb_links', 'rank_math/frontend/breadcrumb/items', 'seopress_pro_breadcrumbs_crumbs', 'woocommerce_get_breadcrumb', 'slim_seo_breadcrumbs_links'))) {
foreach($breadcrumbs as &$breadcrumb) {
if(isset($breadcrumb['text'])) {
$breadcrumb[0] = $breadcrumb['text'];
$breadcrumb[1] = $breadcrumb['url'];
}
}
}
if(in_array($current_filter, array('slim_seo_breadcrumbs_links'))) {
$links = array_merge(array($first_element), $breadcrumbs);
} else {
$links = array_merge(array($first_element), $breadcrumbs, array($last_element));
}
}
return array_filter($links);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment