Instantly share code, notes, and snippets.
-
Save twarrdy/ee4a5c4188eaa659cebfb42a2c783c93 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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