Files
2026-04-28 15:13:50 +02:00

397 lines
12 KiB
PHP

<?php
namespace AIOSEO\Plugin\Pro\Breadcrumbs;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class Breadcrumbs
*
* @since 4.1.1
*/
class Breadcrumbs extends \AIOSEO\Plugin\Common\Breadcrumbs\Breadcrumbs {
/**
* Breadcrumbs constructor.
*
* @since 4.1.1
*/
public function __construct() {
parent::__construct();
$this->frontend = new Frontend();
}
/**
* Overrides a post taxonomy crumbs to allow the selection of a taxonomy.
*
* @since 4.1.1
*
* @param int|\WP_Post $post An ID or a WP_Post object.
* @param null|string $taxonomy A taxonomy to use. If none is provided the first one with terms selected will be used.
* @return array An array of term crumbs.
*/
public function getPostTaxonomyCrumbs( $post, $taxonomy = null ) {
$overrideShowTaxonomy = $this->getOverride( 'showTaxonomyCrumbs' );
if ( is_bool( $overrideShowTaxonomy ) ) {
return $overrideShowTaxonomy ? parent::getPostTaxonomyCrumbs( $post, $taxonomy ) : [];
}
$postType = get_post_type( $post );
if (
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate
) {
// Hide crumbs.
if ( ! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->showTaxonomyCrumbs ) {
return [];
}
// Use the configured taxonomy.
if ( aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->taxonomy ) {
$taxonomy = aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->taxonomy;
}
}
return parent::getPostTaxonomyCrumbs( $post, $taxonomy );
}
/**
* Overrides the post archive crumb to allow for it to be disabled.
*
* @since 4.1.1
*
* @param int|\WP_Post $post An ID or a WP_Post object.
* @return array A crumb.
*/
public function getPostArchiveCrumb( $post ) {
$postType = get_post_type( $post );
if (
$postType &&
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->showArchiveCrumb
) {
return [];
}
return parent::getPostArchiveCrumb( $post );
}
/**
* Overrides the post's term hierarchy to allow skipping unselected terms.
*
* @since 4.1.1
*
* @param int|\WP_Post $post An ID or a WP_Post object.
* @param array $taxonomies An array of taxonomy names.
* @param false $skipUnselectedTerms Allow unselected terms to be filtered out from the crumbs.
* @return array An array of the taxonomy name + a term hierarchy.
*/
public function getPostTaxTermHierarchy( $post, $taxonomies = [], $skipUnselectedTerms = false ) {
if ( aioseo()->options->breadcrumbs->advanced->taxonomySkipUnselected ) {
$skipUnselectedTerms = true;
}
return parent::getPostTaxTermHierarchy( $post, $taxonomies, $skipUnselectedTerms );
}
/**
* Gets a home page crumb.
*
* @since 4.1.1
*
* @param string $type The type of breadcrumb.
* @param mixed $reference The breadcrumb reference.
* @return array The home crumb.
*/
public function maybeGetHomePageCrumb( $type = null, $reference = null ) {
// Option from Post/Term.
$overrideShowHome = $this->getOverride( 'showHomeCrumb' );
if ( is_bool( $overrideShowHome ) ) {
return $overrideShowHome ? parent::getHomePageCrumb() : [];
}
$show = parent::maybeGetHomePageCrumb( $type, $reference );
switch ( $type ) {
case 'post':
case 'single':
case 'page':
case 'wcProduct':
$postType = get_post_type( $reference );
if (
$postType &&
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate
) {
$show = aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->showHomeCrumb;
}
break;
case 'category':
case 'tag':
case 'taxonomy':
if ( is_a( $reference, 'WP_Term' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->taxonomies->has( $reference->taxonomy ) &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$reference->taxonomy}->useDefaultTemplate
) {
$show = aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$reference->taxonomy}->showHomeCrumb;
}
}
break;
case 'postTypeArchive':
if ( is_a( $reference, 'WP_Post_Type' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->has( $reference->name ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$reference->name}->useDefaultTemplate
) {
$show = aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$reference->name}->showHomeCrumb;
}
}
break;
case 'date':
case 'author':
case 'blog':
case 'search':
case 'notFound':
if (
aioseo()->dynamicOptions->breadcrumbs->archives->has( $type ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->{$type}->useDefaultTemplate
) {
$show = aioseo()->dynamicOptions->breadcrumbs->archives->{$type}->showHomeCrumb;
}
break;
}
if ( $show ) {
return parent::getHomePageCrumb();
}
return [];
}
/**
* Overrides the home page crumb to allow to disable it.
*
* @since 4.1.1
*
* @param string $type The type of breadcrumb.
* @param mixed $reference The breadcrumb reference.
* @return array The home crumb.
*/
public function getPrefixCrumb( $type, $reference ) {
switch ( $type ) {
case 'post':
case 'single':
case 'page':
case 'wcProduct':
$postType = get_post_type( $reference );
if (
$postType &&
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->showPrefixCrumb
) {
return [];
}
break;
case 'category':
case 'tag':
case 'taxonomy':
if ( is_a( $reference, 'WP_Term' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->taxonomies->has( $reference->taxonomy ) &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$reference->taxonomy}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$reference->taxonomy}->showPrefixCrumb
) {
return [];
}
}
break;
case 'postTypeArchive':
if ( is_a( $reference, 'WP_Post_Type' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->has( $reference->name ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$reference->name}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$reference->name}->showPrefixCrumb
) {
return [];
}
}
break;
case 'date':
case 'author':
case 'blog':
case 'search':
case 'notFound':
if (
aioseo()->dynamicOptions->breadcrumbs->archives->has( $type ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->{$type}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->archives->{$type}->showPrefixCrumb
) {
return [];
}
break;
}
return parent::getPrefixCrumb( $type, $reference );
}
/**
* Gets the post's parent crumbs.
*
* @since 4.1.1
*
* @param int|\WP_Post $post An ID or a WP_Post object.
* @param string $type The crumb type.
* @return array An array of the post parent crumbs.
*/
public function getPostParentCrumbs( $post, $type = 'single' ) {
$postType = get_post_type( $post );
$overrideShow = $this->getOverride( 'showParentCrumbs' );
if ( is_bool( $overrideShow ) ) {
return $overrideShow ? parent::getPostParentCrumbs( $post, $type ) : [];
}
if (
$postType &&
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->showParentCrumbs
) {
return [];
}
return parent::getPostParentCrumbs( $post, $type );
}
/**
* Overrides an array of crumbs parents for the term.
*
* @since 4.1.1
*
* @param \WP_Term $term A WP_Term object.
* @return array An array of parent crumbs.
*/
public function getTermTaxonomyParentCrumbs( $term ) {
$overrideShow = $this->getOverride( 'showParentCrumbs' );
if ( is_bool( $overrideShow ) ) {
return $overrideShow ? parent::getTermTaxonomyParentCrumbs( $term ) : [];
}
if (
! empty( $term->taxonomy ) &&
aioseo()->dynamicOptions->breadcrumbs->taxonomies->has( $term->taxonomy ) &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$term->taxonomy}->useDefaultTemplate &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$term->taxonomy}->showParentCrumbs
) {
return [];
}
return parent::getTermTaxonomyParentCrumbs( $term );
}
/**
* Gets the paged crumb.
*
* @since 4.1.1
*
* @param array $reference The paged array for reference.
* @return array|void A crumb.
*/
public function getPagedCrumb( $reference ) {
if ( ! aioseo()->options->breadcrumbs->advanced->showPaged ) {
return;
}
return $this->makeCrumb( sprintf( aioseo()->options->breadcrumbs->advanced->pagedFormat, $reference['paged'] ), $reference['link'], 'paged', $reference );
}
/**
* Function to extend on pro for extra functionality.
*
* @since 4.1.1
*
* @param string $type The type of breadcrumb.
* @param mixed $reference The breadcrumb reference.
* @return bool Show current item.
*/
public function showCurrentItem( $type = null, $reference = null ) {
$showCurrentItem = parent::showCurrentItem( $type, $reference );
switch ( $type ) {
case 'post':
case 'single':
case 'page':
case 'wcProduct':
$postType = get_post_type( $reference );
if (
$postType &&
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->{$postType}->useDefaultTemplate
) {
$showCurrentItem = true;
}
break;
case 'category':
case 'tag':
case 'taxonomy':
if ( is_a( $reference, 'WP_Term' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->taxonomies->has( $reference->taxonomy ) &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->{$reference->taxonomy}->useDefaultTemplate
) {
$showCurrentItem = true;
}
}
break;
case 'postTypeArchive':
if ( is_a( $reference, 'WP_Post_Type' ) ) {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->has( $reference->name ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$reference->name}->useDefaultTemplate
) {
$showCurrentItem = true;
}
}
break;
case 'date':
case 'author':
case 'blog':
case 'search':
case 'notFound':
if (
aioseo()->dynamicOptions->breadcrumbs->archives->has( $type ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->{$type}->useDefaultTemplate
) {
$showCurrentItem = true;
}
break;
}
return apply_filters( 'aioseo_breadcrumbs_show_current_item', $showCurrentItem, $type, $reference );
}
/**
* Gets a post crumb.
*
* @since 4.8.7
*
* @param \WP_Post $post A post object for reference.
* @param string $type The breadcrumb type.
* @param string $subType The breadcrumb subType.
* @return array A crumb.
*/
public function getPostCrumb( $post, $type = 'single', $subType = '' ) {
$postTitle = get_the_title( $post );
$overridePostTitle = $this->getOverride( 'postTitle' );
if ( 'parent' !== $subType && ! empty( $overridePostTitle ) ) {
$postTitle = $overridePostTitle;
}
return $this->makeCrumb( $postTitle, get_permalink( $post ), $type, $post, $subType );
}
}