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

309 lines
9.3 KiB
PHP

<?php
namespace AIOSEO\Plugin\Pro\Breadcrumbs;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
use AIOSEO\Plugin\Pro\Models;
use AIOSEO\Plugin\Common\Models as CommonModels;
/**
* Class Frontend.
*
* @since 4.1.1
*/
class Frontend extends \AIOSEO\Plugin\Common\Breadcrumbs\Frontend {
/**
* Overrides the base getCrumbTemplate function to allow custom templates.
*
* @since 4.1.1
*
* @param array $crumb The crumb array.
* @return array The template type and html.
*/
protected function getCrumbTemplate( $crumb ) {
$template = '';
switch ( $crumb['type'] ) {
case 'single':
case 'page':
$template = $this->getPostTypeTemplate( $crumb['reference'], $crumb['subType'] );
break;
case 'taxonomy':
$template = $this->getTaxonomyTemplate( $crumb['reference'], $crumb['subType'] );
break;
case 'postTypeArchive':
$template = $this->getPostTypeArchiveTemplate( $crumb['reference'] );
break;
case 'blog':
$template = $this->getBlogArchiveTemplate();
break;
case 'year':
case 'month':
case 'day':
$template = $this->getDateArchiveTemplate( $crumb['type'] );
break;
case 'search':
$template = $this->getSearchTemplate();
break;
case 'notFound':
$template = $this->getNotFoundTemplate();
break;
case 'author':
$template = $this->getAuthorTemplate();
break;
}
$templateType = 'custom';
if ( empty( $template ) ) {
$template = $this->getDefaultTemplate( $crumb );
$templateType = 'default';
}
$type = null;
if ( 'parent' === $crumb['subType'] ) {
$type = 'parent';
} elseif ( ! in_array( $crumb['type'], [ 'homePage', 'prefix', 'wcShop', 'blog' ], true ) ) {
$type = 'current';
}
$templateItem = [
'templateType' => $templateType,
'template' => $template,
];
$parentTemplateOverride = aioseo()->breadcrumbs->getOverride( 'parentTemplate' );
if ( 'parent' === $type && ! empty( $parentTemplateOverride ) ) {
$templateItem['template'] = isset( $parentTemplateOverride['template'] ) ? $parentTemplateOverride['template'] : aioseo()->helpers->decodeHtmlEntities( $parentTemplateOverride );
}
$templateOverride = aioseo()->breadcrumbs->getOverride( 'template' );
if ( 'current' === $type && ! empty( $templateOverride ) ) {
$templateItem['template'] = isset( $templateOverride['template'] ) ? $templateOverride['template'] : aioseo()->helpers->decodeHtmlEntities( $templateOverride );
}
return apply_filters( 'aioseo_breadcrumbs_template', $templateItem, $crumb );
}
/**
* Default html template.
*
* @since 4.1.1
*
* @param string $type The crumb's type.
* @param mixed $reference The crumb's reference.
* @return string The default crumb template.
*/
public function getDefaultTemplate( $type = '', $reference = '' ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
$label = '#breadcrumb_label';
switch ( $type ) {
case 'single':
case 'page':
$label = '#breadcrumb_post_title';
break;
case 'taxonomy':
$label = '#breadcrumb_taxonomy_title';
break;
case 'postTypeArchive':
$label = '#breadcrumb_archive_post_type_format';
break;
case 'blog':
$label = '#breadcrumb_blog_page_title';
break;
case 'year':
case 'month':
case 'day':
$label = '#breadcrumb_date_archive_' . $type;
break;
case 'search':
$label = '#breadcrumb_search_result_format';
break;
case 'notFound':
$label = '#breadcrumb_404_error_format';
break;
case 'author':
$label = '#breadcrumb_author_display_name';
break;
}
return <<<TEMPLATE
<span class="aioseo-breadcrumb">
<a href="#breadcrumb_link" title="$label">$label</a>
</span>
TEMPLATE;
}
/**
* Gets a custom post template.
*
* @since 4.1.1
*
* @param int|\WP_Post $post An ID or a WP_Post object.
* @param string $subType The template subtype ( single, parent )
* @return string|void A custom template if one exists.
*/
protected function getPostTypeTemplate( $post, $subType = '' ) {
$postType = get_post_type( $post );
if (
aioseo()->dynamicOptions->breadcrumbs->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->postTypes->$postType->useDefaultTemplate
) {
$template = aioseo()->dynamicOptions->breadcrumbs->postTypes->$postType->template;
if ( 'parent' === $subType && aioseo()->dynamicOptions->breadcrumbs->postTypes->$postType->has( 'parentTemplate' ) ) {
$template = aioseo()->dynamicOptions->breadcrumbs->postTypes->$postType->parentTemplate;
}
return aioseo()->helpers->encodeOutputHtml( $template );
}
}
/**
* Gets a custom term template.
*
* @since 4.1.1
*
* @param string|\WP_Term $taxonomy A taxonomy name.
* @param string $subType The template subtype ( single, parent )
* @return string|void A custom template if one exists.
*/
protected function getTaxonomyTemplate( $taxonomy, $subType = '' ) {
$taxonomy = ! empty( $taxonomy->taxonomy ) ? $taxonomy->taxonomy : $taxonomy;
if (
aioseo()->dynamicOptions->breadcrumbs->taxonomies->has( $taxonomy ) &&
! aioseo()->dynamicOptions->breadcrumbs->taxonomies->$taxonomy->useDefaultTemplate
) {
$template = aioseo()->dynamicOptions->breadcrumbs->taxonomies->$taxonomy->template;
if ( 'parent' === $subType && aioseo()->dynamicOptions->breadcrumbs->taxonomies->$taxonomy->has( 'parentTemplate' ) ) {
$template = aioseo()->dynamicOptions->breadcrumbs->taxonomies->$taxonomy->parentTemplate;
}
return aioseo()->helpers->encodeOutputHtml( $template );
}
}
/**
* Gets a custom post type archive template.
*
* @since 4.1.1
*
* @param string|\WP_Post_Type $postType A post type name or an object.
* @return string|void A custom template if one exists.
*/
protected function getPostTypeArchiveTemplate( $postType ) {
$postType = ! empty( $postType->name ) ? $postType->name : $postType;
if (
aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->has( $postType ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$postType}->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->postTypes->{$postType}->template );
}
}
/**
* Gets a custom blog archive template.
*
* @since 4.1.1
*
* @return string|void A custom template if one exists.
*/
protected function getBlogArchiveTemplate() {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->blog->has( 'template' ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->blog->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->blog->template );
}
}
/**
* Gets a custom date archive template.
*
* @since 4.1.1
*
* @param string $type A date type ( year | month | day ).
* @return string|void A custom template if one exists.
*/
protected function getDateArchiveTemplate( $type ) {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->date->template->has( $type ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->date->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->date->template->{$type} );
}
}
/**
* Gets a custom search template.
*
* @since 4.1.1
*
* @return string|void A custom template if one exists.
*/
protected function getSearchTemplate() {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->search->has( 'template' ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->search->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->search->template );
}
}
/**
* Gets a 404 template.
*
* @since 4.1.1
*
* @return string|void A custom template if one exists.
*/
protected function getNotFoundTemplate() {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->notFound->has( 'template' ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->notFound->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->notFound->template );
}
}
/**
* Gets an author template.
*
* @since 4.1.1
*
* @return string|void A custom template if one exists.
*/
protected function getAuthorTemplate() {
if (
aioseo()->dynamicOptions->breadcrumbs->archives->author->has( 'template' ) &&
! aioseo()->dynamicOptions->breadcrumbs->archives->author->useDefaultTemplate
) {
return aioseo()->helpers->encodeOutputHtml( aioseo()->dynamicOptions->breadcrumbs->archives->author->template );
}
}
/**
* Gets the current page's breadcrumbs.
*
* @since 4.8.3
*
* @return array
*/
public function getBreadcrumbs() {
if ( is_singular() && ! is_admin() ) {
$post = CommonModels\Post::getPost( get_the_ID() );
if ( ! empty( $post->breadcrumb_settings ) ) {
aioseo()->breadcrumbs->setOverride( (array) $post->breadcrumb_settings );
}
}
$isTax = is_category() || is_tag() || is_tax();
if ( $isTax && ! is_admin() ) {
$term = Models\Term::getTerm( get_queried_object_id() );
if ( ! empty( $term->breadcrumb_settings ) ) {
aioseo()->breadcrumbs->setOverride( (array) $term->breadcrumb_settings );
}
}
return parent::getBreadcrumbs();
}
}