824 lines
28 KiB
PHP
824 lines
28 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Kadence\Breadcrumbs\Component class
|
||
|
*
|
||
|
* @package kadence
|
||
|
*/
|
||
|
|
||
|
namespace Kadence\Breadcrumbs;
|
||
|
|
||
|
use Kadence\Component_Interface;
|
||
|
use Kadence\Templating_Component_Interface;
|
||
|
use function Kadence\kadence;
|
||
|
use WPSEO_Primary_Term;
|
||
|
use WPSEO_Taxonomy_Meta;
|
||
|
use WP_Post;
|
||
|
use function add_action;
|
||
|
use function add_filter;
|
||
|
use function wp_enqueue_script;
|
||
|
use function get_theme_file_uri;
|
||
|
use function get_theme_file_path;
|
||
|
use function wp_script_add_data;
|
||
|
use function wp_localize_script;
|
||
|
use function rank_math_the_breadcrumbs;
|
||
|
use function yoast_breadcrumb;
|
||
|
use function seopress_display_breadcrumbs;
|
||
|
use function is_bbpress;
|
||
|
use function bbp_breadcrumb;
|
||
|
|
||
|
/**
|
||
|
* Class for adding custom header support.
|
||
|
*
|
||
|
* Exposes template tags:
|
||
|
* * `kadence()->get_breadcrumb()`
|
||
|
*/
|
||
|
class Component implements Component_Interface, Templating_Component_Interface {
|
||
|
/**
|
||
|
* Instance Control
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected static $instance = null;
|
||
|
|
||
|
/**
|
||
|
* Breadcrumb separator.
|
||
|
*
|
||
|
* @var string/null
|
||
|
*/
|
||
|
private $sep = null;
|
||
|
|
||
|
/**
|
||
|
* Breadcrumb link.
|
||
|
*
|
||
|
* @var string/null
|
||
|
*/
|
||
|
private $link = null;
|
||
|
|
||
|
/**
|
||
|
* Breadcrumb settings.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private $settings = array();
|
||
|
|
||
|
/**
|
||
|
* Local breadcrumb args.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private $args = array();
|
||
|
|
||
|
/**
|
||
|
* Breadcrumb post types.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private $post_types = array();
|
||
|
/**
|
||
|
* Gets the unique identifier for the theme component.
|
||
|
*
|
||
|
* @return string Component slug.
|
||
|
*/
|
||
|
public function get_slug() : string {
|
||
|
return 'breadcrumbs';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds the action and filter hooks to integrate with WordPress.
|
||
|
*/
|
||
|
public function initialize() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets template tags to expose as methods on the Template_Tags class instance, accessible through `kadence()`.
|
||
|
*
|
||
|
* @return array Associative array of $method_name => $callback_info pairs. Each $callback_info must either be
|
||
|
* a callable or an array with key 'callable'. This approach is used to reserve the possibility of
|
||
|
* adding support for further arguments in the future.
|
||
|
*/
|
||
|
public function template_tags() : array {
|
||
|
return array(
|
||
|
'get_breadcrumb' => array( $this, 'get_breadcrumb' ),
|
||
|
'print_breadcrumb' => array( $this, 'print_breadcrumb' ),
|
||
|
);
|
||
|
}
|
||
|
/**
|
||
|
* Get the breadcrumbs.
|
||
|
*
|
||
|
* @param array $args Arguments.
|
||
|
*/
|
||
|
public function print_breadcrumb( $args = array() ) {
|
||
|
if ( 'rankmath' === kadence()->option( 'breadcrumb_engine' ) ) {
|
||
|
if ( function_exists( 'rank_math_the_breadcrumbs' ) ) {
|
||
|
echo '<div class="kadence-breadcrumbs rankmath-bc-wrap">';
|
||
|
rank_math_the_breadcrumbs();
|
||
|
echo '</div>';
|
||
|
}
|
||
|
} elseif ( 'yoast' === kadence()->option( 'breadcrumb_engine' ) ) {
|
||
|
if ( function_exists( 'yoast_breadcrumb' ) ) {
|
||
|
yoast_breadcrumb( '<div class="kadence-breadcrumbs yoast-bc-wrap">','</div>' );
|
||
|
}
|
||
|
} elseif ( 'seopress' === kadence()->option( 'breadcrumb_engine' ) ) {
|
||
|
if ( function_exists( 'seopress_display_breadcrumbs' ) ) {
|
||
|
echo '<div class="kadence-breadcrumbs seopress-bc-wrap">';
|
||
|
seopress_display_breadcrumbs();
|
||
|
echo '</div>';
|
||
|
}
|
||
|
} else {
|
||
|
if ( function_exists( 'is_bbpress' ) && is_bbpress() && function_exists( 'bbp_breadcrumb' ) ) {
|
||
|
echo '<div class="kadence-breadcrumbs bbpress-topic-meta">';
|
||
|
bbp_breadcrumb();
|
||
|
echo '</div>';
|
||
|
} else {
|
||
|
echo kadence()->get_breadcrumb( $args );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Get the breadcrumbs.
|
||
|
*
|
||
|
* @param array $args Arguments.
|
||
|
* @return string
|
||
|
*/
|
||
|
public function get_breadcrumb( $args = array() ) {
|
||
|
$this->args = apply_filters(
|
||
|
'kadence_local_breadcrumb_args',
|
||
|
wp_parse_args(
|
||
|
$args,
|
||
|
array(
|
||
|
'home_title' => __( 'Home', 'kadence' ),
|
||
|
'404_title' => __( 'Error 404', 'kadence' ),
|
||
|
'search_title' => __( 'Search results for', 'kadence' ),
|
||
|
'page' => __( 'Page', 'kadence' ),
|
||
|
'show_shop' => true,
|
||
|
'show_title' => true,
|
||
|
'color_style' => '',
|
||
|
'blog_id' => '',
|
||
|
'portfolio_id' => '',
|
||
|
'staff_id' => '',
|
||
|
'testimonial_id' => '',
|
||
|
'gallery_id' => 'none',
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
$this->settings = wp_parse_args(
|
||
|
apply_filters( 'kadence_breadcrumb_args', array() ),
|
||
|
array(
|
||
|
'home' => true,
|
||
|
'home_icon' => kadence()->option( 'breadcrumb_home_icon' ),
|
||
|
'before' => '<span class="kadence-bread-current">',
|
||
|
'after' => '</span>',
|
||
|
'home_link' => home_url( '/' ),
|
||
|
'wrap_before' => '<nav id="kadence-breadcrumbs" aria-label="' . esc_attr__( 'Breadcrumbs', 'kadence' ) . '" class="kadence-breadcrumbs"><div class="kadence-breadcrumb-container"' . ( $this->args['color_style'] ? ' style="' . esc_attr( $this->args['color_style'] ) . '"' : '' ) . '>',
|
||
|
'wrap_after' => '</div></nav>',
|
||
|
'delimiter' => apply_filters( 'kadence_breadcrumb_delimiter', '/' ),
|
||
|
'delimiter_before' => '<span class="bc-delimiter">',
|
||
|
'delimiter_after' => '</span>',
|
||
|
'link_before' => '<span>',
|
||
|
'link_after' => '</span>',
|
||
|
'link_in_before' => '<span>',
|
||
|
'link_in_after' => '</span>',
|
||
|
)
|
||
|
);
|
||
|
$this->post_types = wp_parse_args(
|
||
|
apply_filters( 'kadence_breadcrumb_post_types', array() ),
|
||
|
array(
|
||
|
'product' => array(
|
||
|
'post_type' => 'product',
|
||
|
'taxonomy' => 'product_cat',
|
||
|
'archive_page' => 'shop',
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'portfolio' => array(
|
||
|
'post_type' => 'portfolio',
|
||
|
'taxonomy' => 'portfolio-type',
|
||
|
'archive_page' => $this->args['portfolio_id'],
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'post' => array(
|
||
|
'post_type' => 'post',
|
||
|
'taxonomy' => 'category',
|
||
|
'archive_page' => $this->args['blog_id'],
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'staff' => array(
|
||
|
'post_type' => 'staff',
|
||
|
'taxonomy' => 'staff-group',
|
||
|
'archive_page' => $this->args['staff_id'],
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'testimonial' => array(
|
||
|
'post_type' => 'testimonial',
|
||
|
'taxonomy' => 'testimonial-group',
|
||
|
'archive_page' => $this->args['testimonial_id'],
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'kt_gallery' => array(
|
||
|
'post_type' => 'kt_gallery',
|
||
|
'taxonomy' => 'kt_album',
|
||
|
'archive_page' => $this->args['gallery_id'],
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'tribe_events' => array(
|
||
|
'post_type' => 'tribe_events',
|
||
|
'taxonomy' => 'tribe_events_cat',
|
||
|
'archive_page' => 'tribe_events',
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'event' => array(
|
||
|
'post_type' => 'event',
|
||
|
'taxonomy' => 'event-category',
|
||
|
'archive_page' => '',
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'podcast' => array(
|
||
|
'post_type' => 'podcast',
|
||
|
'taxonomy' => 'series',
|
||
|
'archive_page' => '',
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'course' => array(
|
||
|
'post_type' => 'course',
|
||
|
'taxonomy' => 'course_cat',
|
||
|
'archive_page' => get_option( 'lifterlms_shop_page_id' ),
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'lesson' => array(
|
||
|
'post_type' => 'lesson',
|
||
|
'taxonomy' => '',
|
||
|
'custom' => 'liferlms',
|
||
|
'archive_page' => get_option( 'lifterlms_shop_page_id' ),
|
||
|
'archive_label' => '',
|
||
|
),
|
||
|
'ht_kb' => array(
|
||
|
'post_type' => 'ht_kb',
|
||
|
'taxonomy' => 'ht_kb_category',
|
||
|
'archive_page' => 'archive',
|
||
|
'archive_label' => esc_html__( 'Knowledge Base', 'kadence' ),
|
||
|
),
|
||
|
)
|
||
|
);
|
||
|
$html = '';
|
||
|
|
||
|
if ( ! is_front_page() ) {
|
||
|
$html .= $this->settings['wrap_before'];
|
||
|
if ( $this->settings['home'] ) {
|
||
|
$html .= $this->get_crumbs_frontpage() . $this->get_sep();
|
||
|
}
|
||
|
$html = apply_filters( 'kadence_breadcrumbs_after_home', $html );
|
||
|
if ( is_home() ) {
|
||
|
$html .= $this->get_crumbs_home();
|
||
|
} elseif ( is_404() ) {
|
||
|
$html .= $this->get_crumbs_404();
|
||
|
} elseif ( is_search() ) {
|
||
|
$html .= $this->get_crumbs_search();
|
||
|
} elseif ( is_attachment() ) {
|
||
|
$html .= $this->get_crumbs_attachment();
|
||
|
} elseif ( function_exists( 'is_shop' ) && is_shop() ) {
|
||
|
$html .= $this->get_crumbs_shop();
|
||
|
} elseif ( is_single() ) {
|
||
|
$html .= $this->get_crumbs_single();
|
||
|
} elseif ( is_page() ) {
|
||
|
$html .= $this->get_crumbs_page();
|
||
|
} elseif ( is_singular() && ! is_attachment() ) {
|
||
|
$html .= $this->get_crumbs_single();
|
||
|
} elseif ( function_exists( 'is_product_category' ) && is_product_category() ) {
|
||
|
$html .= $this->get_crumbs_product_category();
|
||
|
} elseif ( function_exists( 'is_product_tag' ) && is_product_tag() ) {
|
||
|
$html .= $this->get_crumbs_product_tag();
|
||
|
} elseif ( $this->is_wc_attribute() ) {
|
||
|
$html .= $this->get_crumbs_product_attribute();
|
||
|
} elseif ( function_exists( 'dokan_is_store_page' ) && dokan_is_store_page() ) {
|
||
|
$html .= $this->get_crumbs_dokan_store();
|
||
|
} elseif ( is_category() ) {
|
||
|
$html .= $this->get_crumbs_category();
|
||
|
} elseif ( is_tag() ) {
|
||
|
$html .= $this->get_crumbs_tag();
|
||
|
} elseif ( is_tax() ) {
|
||
|
$html .= $this->get_crumbs_tax();
|
||
|
} elseif ( is_date() ) {
|
||
|
$html .= $this->get_crumbs_date();
|
||
|
} elseif ( is_author() ) {
|
||
|
$html .= $this->get_crumbs_author();
|
||
|
} elseif ( is_archive() ) {
|
||
|
$html .= $this->get_crumbs_archive();
|
||
|
} else {
|
||
|
$html .= $this->settings['before'] . get_the_title() . $this->settings['after'];
|
||
|
}
|
||
|
|
||
|
if ( get_query_var( 'paged' ) ) {
|
||
|
$html .= ' - ' . $this->args['page'] . ' ' . esc_html( get_query_var( 'paged' ) );
|
||
|
}
|
||
|
|
||
|
$html .= $this->settings['wrap_after'];
|
||
|
}
|
||
|
/**
|
||
|
* Change the breadcrumbs HTML output.
|
||
|
*
|
||
|
* @param string $html HTML output.
|
||
|
*/
|
||
|
return apply_filters( 'kadence_breadcrumb_html', $html );
|
||
|
}
|
||
|
/**
|
||
|
* Check for wc_attribute_archive.
|
||
|
*/
|
||
|
public function is_wc_attribute() {
|
||
|
|
||
|
/**
|
||
|
* Attributes are proper taxonomies, therefore first thing is
|
||
|
* to check if we are on a taxonomy page using the is_tax().
|
||
|
* Also, a further check if the taxonomy_is_product_attribute
|
||
|
* function exists is necessary, in order to ensure that this
|
||
|
* function does not produce fatal errors when the WooCommerce
|
||
|
* is not activated
|
||
|
*/
|
||
|
if ( is_tax() && function_exists( 'taxonomy_is_product_attribute') ) {
|
||
|
// now we know for sure that the queried object is a taxonomy
|
||
|
$tax_obj = get_queried_object();
|
||
|
return taxonomy_is_product_attribute( $tax_obj->taxonomy );
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
/**
|
||
|
* Get Separator
|
||
|
*/
|
||
|
public function get_sep() {
|
||
|
if ( is_null( $this->sep ) ) {
|
||
|
$this->sep = ' ' . $this->settings['delimiter_before'] . $this->settings['delimiter'] . $this->settings['delimiter_after'] . ' ';
|
||
|
}
|
||
|
return $this->sep;
|
||
|
}
|
||
|
/**
|
||
|
* Get link string
|
||
|
*/
|
||
|
public function get_link() {
|
||
|
if ( is_null( $this->link ) ) {
|
||
|
$this->link = $this->settings['link_before'] . '<a href="%1$s" itemprop="url" ' . ( $this->args['color_style'] ? 'style="' . esc_attr( $this->args['color_style'] ) . '"' : '' ) . '>' . $this->settings['link_in_before'] . '%2$s' . $this->settings['link_in_after'] . '</a>' . $this->settings['link_after'];
|
||
|
}
|
||
|
return $this->link;
|
||
|
}
|
||
|
/**
|
||
|
* Get Breadcrumb Term Title
|
||
|
*
|
||
|
* @param object $term the current term.
|
||
|
*/
|
||
|
private function get_breadcrumb_term_title( $term ) {
|
||
|
$title = '';
|
||
|
if ( class_exists( 'WPSEO_Taxonomy_Meta' ) ) {
|
||
|
$title = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'bctitle' );
|
||
|
} elseif ( class_exists( 'RankMath' ) ) {
|
||
|
$title = get_metadata( 'term', $term->term_id, 'rank_math_breadcrumb_title', false );
|
||
|
if ( is_array( $title ) && ! empty( $title ) ) {
|
||
|
$title = $title[0];
|
||
|
}
|
||
|
}
|
||
|
if ( ! is_string( $title ) || '' === $title ) {
|
||
|
$title = $term->name;
|
||
|
}
|
||
|
|
||
|
return $title;
|
||
|
}
|
||
|
/**
|
||
|
* Get Home Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_frontpage() {
|
||
|
if ( $this->settings['home_icon'] ) {
|
||
|
$output = $this->settings['link_before'] . '<a href="' . esc_url( $this->settings['home_link'] ) . '" title="'. esc_attr( $this->args['home_title'] ) . '" itemprop="url" class="kadence-bc-home kadence-bc-home-icon" ' . ( $this->args['color_style'] ? 'style="' . esc_attr( $this->args['color_style'] ) . '"' : '' ) . '>' . $this->settings['link_in_before'] . kadence()->get_icon( 'home' ) . $this->settings['link_in_after'] . '</a>' . $this->settings['link_after'];
|
||
|
} else {
|
||
|
$output = $this->settings['link_before'] . '<a href="' . esc_url( $this->settings['home_link'] ) . '" itemprop="url" class="kadence-bc-home" ' . ( $this->args['color_style'] ? 'style="' . esc_attr( $this->args['color_style'] ) . '"' : '' ) . '>' . $this->settings['link_in_before'] . esc_html( $this->args['home_title'] ) . $this->settings['link_in_after'] . '</a>' . $this->settings['link_after'];
|
||
|
}
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Home Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_home() {
|
||
|
return $this->settings['before'] . get_the_title( get_option( 'page_for_posts' ) ) . $this->settings['after'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get 404 Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_404() {
|
||
|
return $this->settings['before'] . $this->args['404_title'] . $this->settings['after'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get search Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_search() {
|
||
|
$html = '';
|
||
|
if ( array_key_exists( 'ht-kb-search', $_REQUEST ) ) {
|
||
|
if ( $this->post_types['ht_kb']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['ht_kb']['archive_page'], $this->post_types['ht_kb']['archive_label'] );
|
||
|
}
|
||
|
}
|
||
|
return $html . $this->settings['before'] . $this->args['search_title'] . ' "' . get_search_query() . '"' . $this->settings['after'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get attachment Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_attachment() {
|
||
|
global $post;
|
||
|
$parent_id = $post->post_parent;
|
||
|
$html = '';
|
||
|
$parentcrumbs = array();
|
||
|
|
||
|
if ( $parent_id ) {
|
||
|
while ( $parent_id ) {
|
||
|
$page = get_page( $parent_id );
|
||
|
$parentcrumbs[] = sprintf( $this->get_link(), get_permalink( $page->ID ), get_the_title( $page->ID ) ) . $this->get_sep();
|
||
|
$parent_id = $page->post_parent;
|
||
|
}
|
||
|
}
|
||
|
$parentcrumbs = array_reverse( $parentcrumbs );
|
||
|
foreach ( $parentcrumbs as $parentcrumb ) {
|
||
|
$html .= $parentcrumb;
|
||
|
}
|
||
|
$html .= $this->settings['before'] . get_the_title() . $this->settings['after'];
|
||
|
return $html;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get shop page Breadcrumb
|
||
|
*/
|
||
|
private function get_crumbs_shop() {
|
||
|
$shop_page_id = wc_get_page_id( 'shop' );
|
||
|
$page_title = get_the_title( $shop_page_id );
|
||
|
return $this->settings['before'] . $page_title . $this->settings['after'];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get shop Breadcrumb
|
||
|
*/
|
||
|
private function get_shop_crumb() {
|
||
|
$shop_page_id = wc_get_page_id( 'shop' );
|
||
|
$shop_page = get_post( $shop_page_id );
|
||
|
$shop_bread = '';
|
||
|
if ( get_option( 'page_on_front' ) !== $shop_page_id ) {
|
||
|
$shop_bread = sprintf( $this->get_link(), get_permalink( $shop_page ), get_the_title( $shop_page_id ) ) . $this->get_sep();
|
||
|
}
|
||
|
return $shop_bread;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get product category
|
||
|
*/
|
||
|
private function get_crumbs_product_category() {
|
||
|
$html = '';
|
||
|
if ( $this->args['show_shop'] ) {
|
||
|
$html .= $this->get_shop_crumb();
|
||
|
}
|
||
|
$ancestors = get_ancestors( get_queried_object()->term_id, 'product_cat' );
|
||
|
$ancestors = array_reverse( $ancestors );
|
||
|
foreach ( $ancestors as $ancestor ) {
|
||
|
$ancestor = get_term( $ancestor, 'product_cat' );
|
||
|
$html .= sprintf( $this->get_link(), get_term_link( $ancestor->slug, 'product_cat' ), $this->get_breadcrumb_term_title( $ancestor ) ) . $this->get_sep();
|
||
|
}
|
||
|
return $html . $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'];
|
||
|
}
|
||
|
/**
|
||
|
* Get product tag
|
||
|
*/
|
||
|
private function get_crumbs_product_tag() {
|
||
|
$html = '';
|
||
|
if ( $this->args['show_shop'] ) {
|
||
|
$html .= $this->get_shop_crumb();
|
||
|
}
|
||
|
return $html . $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'];
|
||
|
}
|
||
|
/**
|
||
|
* Get product attributes.
|
||
|
*/
|
||
|
private function get_crumbs_product_attribute() {
|
||
|
$html = '';
|
||
|
if ( $this->args['show_shop'] ) {
|
||
|
$html .= $this->get_shop_crumb();
|
||
|
}
|
||
|
return $html . $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'];
|
||
|
}
|
||
|
/**
|
||
|
* Get dokan store.
|
||
|
*/
|
||
|
private function get_crumbs_dokan_store() {
|
||
|
$html = '';
|
||
|
$store_user = dokan()->vendor->get( get_query_var( 'author' ) );
|
||
|
return $html . $this->settings['before'] . $store_user->get_shop_name() . $this->settings['after'];
|
||
|
}
|
||
|
/**
|
||
|
* Check if has post archive.
|
||
|
*
|
||
|
* @param string $post_type the post type.
|
||
|
*/
|
||
|
private function check_has_archive( $post_type ) {
|
||
|
if ( ! isset( $post_type ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
// find custom post types with archives.
|
||
|
$args = array(
|
||
|
'has_archive' => true,
|
||
|
'_builtin' => false,
|
||
|
);
|
||
|
$output = 'names';
|
||
|
$archived_custom_post_types = get_post_types( $args, $output );
|
||
|
|
||
|
// if there are no custom post types, then the current post can't be one.
|
||
|
if ( empty( $archived_custom_post_types ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
// check if post type is a supports archives.
|
||
|
if ( in_array( $post_type, $archived_custom_post_types ) ) {
|
||
|
return true;
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
// if all else fails, return false.
|
||
|
return false;
|
||
|
}
|
||
|
/**
|
||
|
* Get archive Breadcrumb
|
||
|
*
|
||
|
* @param mixed $archive_page the archive page for breadcrumbs.
|
||
|
* @param string $archive_label the archive page label for breadcrumbs.
|
||
|
*/
|
||
|
private function get_archive_crumb( $archive_page, $archive_label = '' ) {
|
||
|
$html = '';
|
||
|
if ( is_numeric( $archive_page ) ) {
|
||
|
// Check if page ID.
|
||
|
$parent_page_link = get_page_link( $archive_page );
|
||
|
if ( $parent_page_link ) {
|
||
|
$html .= sprintf( $this->get_link(), $parent_page_link, get_the_title( $archive_page ) ) . $this->get_sep();
|
||
|
}
|
||
|
} elseif ( 'shop' === $archive_page ) {
|
||
|
if ( ! is_archive() && ! $this->args['show_shop'] ) {
|
||
|
$html .= '';
|
||
|
} else {
|
||
|
$html .= $this->get_shop_crumb();
|
||
|
}
|
||
|
} elseif ( 'tribe_events' === $archive_page ) {
|
||
|
// Check for tribe.
|
||
|
$html .= sprintf( $this->get_link(), tribe_get_events_link(), tribe_get_event_label_plural() ) . $this->get_sep();
|
||
|
} elseif ( 'none' === $archive_page ) {
|
||
|
// Check for none.
|
||
|
$html .= '';
|
||
|
} elseif ( 'archive' === $archive_page ) {
|
||
|
$parent_title = ( ! empty( $archive_label ) ? $archive_label : 'Archive' );
|
||
|
$html .= sprintf( $this->get_link(), get_post_type_archive_link( get_post_type() ), $parent_title ) . $this->get_sep();
|
||
|
} elseif ( filter_var( $archive_page, FILTER_VALIDATE_URL ) ) {
|
||
|
// Check if url.
|
||
|
$parent_title = ( ! empty( $archive_label ) ? $archive_label : 'Archive' );
|
||
|
$html .= sprintf( $this->get_link(), $archive_page, $parent_title ) . $this->get_sep();
|
||
|
} elseif ( $this->check_has_archive( get_post_type() ) ) {
|
||
|
$post_type_obj = get_post_type_object( get_post_type() );
|
||
|
$parent_title = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name, get_post_type() );
|
||
|
$html .= sprintf( $this->get_link(), get_post_type_archive_link( get_post_type() ), $parent_title ) . $this->get_sep();
|
||
|
}
|
||
|
return $html;
|
||
|
}
|
||
|
/**
|
||
|
* Get main tax.
|
||
|
*
|
||
|
* @param string $taxonomy the taxonomy name.
|
||
|
* @param number $post_id the post id.
|
||
|
*/
|
||
|
private function get_taxonomy_main( $taxonomy, $post_id ) {
|
||
|
$main_term = '';
|
||
|
$terms = wp_get_post_terms(
|
||
|
$post_id,
|
||
|
$taxonomy,
|
||
|
array(
|
||
|
'orderby' => 'parent',
|
||
|
'order' => 'DESC',
|
||
|
)
|
||
|
);
|
||
|
if ( $terms && ! is_wp_error( $terms ) ) {
|
||
|
if ( is_array( $terms ) ) {
|
||
|
$main_term = $terms[0];
|
||
|
}
|
||
|
}
|
||
|
return $main_term;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get tax Breadcrumb
|
||
|
*
|
||
|
* @param string $taxonomy the taxonomy type for breadcrumbs.
|
||
|
*/
|
||
|
private function get_taxonomy_crumb( $taxonomy ) {
|
||
|
global $post;
|
||
|
$html = '';
|
||
|
$main_term = '';
|
||
|
if ( class_exists( 'WPSEO_Primary_Term' ) ) {
|
||
|
$wpseo_term = new WPSEO_Primary_Term( $taxonomy, $post->ID );
|
||
|
$wpseo_term = $wpseo_term->get_primary_term();
|
||
|
$wpseo_term = get_term( $wpseo_term );
|
||
|
if ( is_wp_error( $wpseo_term ) ) {
|
||
|
$main_term = $this->get_taxonomy_main( $taxonomy, $post->ID );
|
||
|
} else {
|
||
|
$main_term = $wpseo_term;
|
||
|
}
|
||
|
} elseif ( class_exists( 'RankMath' ) ) {
|
||
|
$wpseo_term = get_post_meta( $post->ID, 'rank_math_primary_' . $taxonomy, true );
|
||
|
if ( $wpseo_term ) {
|
||
|
$wpseo_term = get_term( $wpseo_term );
|
||
|
if ( is_wp_error( $wpseo_term ) ) {
|
||
|
$main_term = $this->get_taxonomy_main( $taxonomy, $post->ID );
|
||
|
} else {
|
||
|
$main_term = $wpseo_term;
|
||
|
}
|
||
|
} else {
|
||
|
$main_term = $this->get_taxonomy_main( $taxonomy, $post->ID );
|
||
|
}
|
||
|
} else {
|
||
|
$main_term = $this->get_taxonomy_main( $taxonomy, $post->ID );
|
||
|
}
|
||
|
if ( $main_term && ! is_wp_error( $main_term ) ) {
|
||
|
$ancestors = get_ancestors( $main_term->term_id, $taxonomy );
|
||
|
$ancestors = array_reverse( $ancestors );
|
||
|
foreach ( $ancestors as $ancestor ) {
|
||
|
$ancestor = get_term( $ancestor, $taxonomy );
|
||
|
$html .= sprintf( $this->get_link(), get_term_link( $ancestor->slug, $taxonomy ), $this->get_breadcrumb_term_title( $ancestor ) ) . $this->get_sep();
|
||
|
}
|
||
|
$term_link = get_term_link( $main_term->slug, $taxonomy );
|
||
|
if ( $term_link && ! is_wp_error( $term_link ) ) {
|
||
|
$html .= sprintf( $this->get_link(), $term_link, $this->get_breadcrumb_term_title( $main_term ) ) . $this->get_sep();
|
||
|
}
|
||
|
}
|
||
|
return $html;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get Custom Breadcrumb
|
||
|
*
|
||
|
* @param string $custom the custom string for breadcrumbs.
|
||
|
*/
|
||
|
private function get_custom_crumb( $custom ) {
|
||
|
global $post;
|
||
|
$html = '';
|
||
|
if ( 'liferlms' === $custom ) {
|
||
|
$parent_course = get_post_meta( $post->ID, '_llms_parent_course', true );
|
||
|
if ( $parent_course ) {
|
||
|
$html .= sprintf( $this->get_link(), get_permalink( $parent_course ), get_the_title( $parent_course ) ) . $this->get_sep();
|
||
|
}
|
||
|
}
|
||
|
return $html;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get category
|
||
|
*/
|
||
|
private function get_crumbs_category() {
|
||
|
$html = '';
|
||
|
if ( $this->post_types['post']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['post']['archive_page'], $this->post_types['post']['archive_label'] );
|
||
|
}
|
||
|
$ancestors = get_ancestors( get_queried_object()->term_id, 'category' );
|
||
|
$ancestors = array_reverse( $ancestors );
|
||
|
foreach ( $ancestors as $ancestor ) {
|
||
|
$ancestor = get_term( $ancestor, 'category' );
|
||
|
$html .= sprintf( $this->get_link(), get_term_link( $ancestor->slug, 'category' ), $this->get_breadcrumb_term_title( $ancestor ) ) . $this->get_sep();
|
||
|
}
|
||
|
$title_output = ( $this->args['show_title'] ? $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'] : '' );
|
||
|
return $html . $title_output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get tag
|
||
|
*/
|
||
|
private function get_crumbs_tag() {
|
||
|
$html = '';
|
||
|
if ( $this->post_types['post']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['post']['archive_page'], $this->post_types['post']['archive_label'] );
|
||
|
}
|
||
|
$title_output = ( $this->args['show_title'] ? $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'] : '' );
|
||
|
return $html . $title_output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get author
|
||
|
*/
|
||
|
private function get_crumbs_author() {
|
||
|
global $author;
|
||
|
$html = '';
|
||
|
if ( $this->post_types['post']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['post']['archive_page'], $this->post_types['post']['archive_label'] );
|
||
|
}
|
||
|
$userdata = get_userdata( $author );
|
||
|
$title_output = ( $this->args['show_title'] ? $this->settings['before'] . $userdata->display_name . $this->settings['after'] : '' );
|
||
|
return $html . $title_output;
|
||
|
}
|
||
|
/**
|
||
|
* Get author
|
||
|
*/
|
||
|
private function get_crumbs_archive() {
|
||
|
$html = '';
|
||
|
$title_output = ( $this->args['show_title'] ? $this->settings['before'] . get_the_archive_title() . $this->settings['after'] : '' );
|
||
|
return $html . $title_output;
|
||
|
}
|
||
|
/**
|
||
|
* Get date
|
||
|
*/
|
||
|
private function get_crumbs_date() {
|
||
|
$html = '';
|
||
|
if ( $this->post_types['post']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['post']['archive_page'], $this->post_types['post']['archive_label'] );
|
||
|
}
|
||
|
if ( is_day() ) {
|
||
|
$html .= sprintf( $this->get_link(), get_year_link( get_the_time( 'Y' ) ), get_the_time( 'Y' ) ) . $this->get_sep();
|
||
|
$html .= sprintf( $this->get_link(), get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ), get_the_time( 'F' ) ) . $this->get_sep();
|
||
|
$title = get_the_time( 'd' );
|
||
|
} elseif ( is_month() ) {
|
||
|
$html .= sprintf( $this->get_link(), get_year_link( get_the_time( 'Y' ) ), get_the_time( 'Y' ) ) . $this->get_sep();
|
||
|
$title = get_the_time( 'F' );
|
||
|
} else {
|
||
|
$title = get_the_time( 'Y' );
|
||
|
}
|
||
|
$title_output = ( $this->args['show_title'] ? $this->settings['before'] . $title . $this->settings['after'] : '' );
|
||
|
return $html . $title_output;
|
||
|
}
|
||
|
/**
|
||
|
* Get tax
|
||
|
*/
|
||
|
private function get_crumbs_tax() {
|
||
|
$html = '';
|
||
|
if ( is_tax( 'portfolio-type' ) || is_tax( 'portfolio-tag' ) ) {
|
||
|
if ( $this->post_types['portfolio']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['portfolio']['archive_page'], $this->post_types['portfolio']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'staff-group' ) ) {
|
||
|
if ( $this->post_types['staff']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['staff']['archive_page'], $this->post_types['staff']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'testimonial-group' ) ) {
|
||
|
if ( $this->post_types['testimonial']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['testimonial']['archive_page'], $this->post_types['testimonial']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'event-category' ) ) {
|
||
|
if ( $this->post_types['event']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['event']['archive_page'], $this->post_types['event']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'series' ) ) {
|
||
|
if ( $this->post_types['podcast']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['podcast']['archive_page'], $this->post_types['podcast']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'ht_kb_category' ) ) {
|
||
|
if ( $this->post_types['ht_kb']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['ht_kb']['archive_page'], $this->post_types['ht_kb']['archive_label'] );
|
||
|
}
|
||
|
} elseif ( is_tax( 'course_cat' ) || is_tax( 'course_tag' ) || is_tax( 'course_track' ) ) {
|
||
|
if ( $this->post_types['course']['archive_page'] ) {
|
||
|
$html .= $this->get_archive_crumb( $this->post_types['course']['archive_page'], $this->post_types['course']['archive_label'] );
|
||
|
}
|
||
|
}
|
||
|
$title = ( $this->args['show_title'] ? $this->settings['before'] . $this->get_breadcrumb_term_title( get_queried_object() ) . $this->settings['after'] : '' );
|
||
|
return $html . $title;
|
||
|
}
|
||
|
/**
|
||
|
* Get page
|
||
|
*/
|
||
|
private function get_crumbs_page() {
|
||
|
global $post;
|
||
|
$html = '';
|
||
|
$parent_id = $post->post_parent;
|
||
|
$parentcrumbs = array();
|
||
|
if ( $parent_id ) {
|
||
|
while ( $parent_id ) {
|
||
|
$page = get_page( $parent_id );
|
||
|
$parentcrumbs[] = sprintf( $this->get_link(), get_permalink( $page->ID ), get_the_title( $page->ID ) ) . $this->get_sep();
|
||
|
$parent_id = $page->post_parent;
|
||
|
}
|
||
|
}
|
||
|
$parentcrumbs = array_reverse( $parentcrumbs );
|
||
|
foreach ( $parentcrumbs as $parentcrumb ) {
|
||
|
$html .= $parentcrumb;
|
||
|
}
|
||
|
$title = ( $this->args['show_title'] ? $this->settings['before'] . get_the_title() . $this->settings['after'] : '' );
|
||
|
return $html . $title;
|
||
|
}
|
||
|
/**
|
||
|
* Get single
|
||
|
*/
|
||
|
private function get_crumbs_single() {
|
||
|
$html = '';
|
||
|
$post_type = get_post_type();
|
||
|
if ( isset( $this->post_types[ $post_type ] ) ) {
|
||
|
// Archive Page.
|
||
|
$html .= $this->get_archive_crumb( $this->post_types[ $post_type ]['archive_page'], $this->post_types[ $post_type ]['archive_label'] );
|
||
|
// Tax Page.
|
||
|
$html .= $this->get_taxonomy_crumb( $this->post_types[ $post_type ]['taxonomy'] );
|
||
|
// Custom Parent.
|
||
|
if ( isset( $this->post_types[ $post_type ]['custom'] ) ) {
|
||
|
$html .= $this->get_custom_crumb( $this->post_types[ $post_type ]['custom'] );
|
||
|
}
|
||
|
} else {
|
||
|
// Archive Page.
|
||
|
$html .= $this->get_archive_crumb( '', '' );
|
||
|
}
|
||
|
$title = ( $this->args['show_title'] ? $this->settings['before'] . get_the_title() . $this->settings['after'] : '' );
|
||
|
return $html . $title;
|
||
|
}
|
||
|
}
|