|
<?php |
|
/** |
|
* Breadcrumb Navigation for WordPress. |
|
* |
|
* @author Dominik Schilling |
|
* @author Ralf Albert |
|
* @license GPLv2 |
|
* @link http://wpgrafie.de/204/ |
|
* |
|
* @version 0.2 |
|
*/ |
|
class DS_WP_Breadcrumb { |
|
/** |
|
* The list of breadcrumb items. |
|
* |
|
* @var array |
|
* @since 1.0.0 |
|
*/ |
|
public $breadcrumb = array(); |
|
|
|
/** |
|
* Templates for link, current/standard state and before/after. |
|
* |
|
* @var array |
|
*/ |
|
public $templates = array(); |
|
|
|
/** |
|
* Various strings. |
|
* |
|
* @var array |
|
*/ |
|
public $strings = array(); |
|
|
|
/** |
|
* Various options. |
|
* |
|
* @var array |
|
* @access public |
|
*/ |
|
public $options = array(); |
|
|
|
/** |
|
* Constructor. |
|
* |
|
* @param bool $autorun Autorun or not. |
|
* @return string |
|
*/ |
|
public function __construct( $autorun = false) { |
|
$this->init( 'all' ); |
|
|
|
// Generate breadcrumb |
|
if ( $autorun ) |
|
echo $this->print_breadcrump(); |
|
} |
|
|
|
/** |
|
* |
|
* Define standard settings |
|
* @param string $what What settings to set ( all [default] | templates | options | strings ) |
|
*/ |
|
public function init( $what = 'all' ){ |
|
|
|
if( 'all' == $what || 'templates' == $what ){ |
|
$this->templates = array( |
|
'link' => '<a href="%s">%s</a>', |
|
'current' => '<span class="c">%s</span>', |
|
'standard' => '<span class="s">%s</span>', |
|
'before' => '<nav>', |
|
'after' => '</nav>' |
|
); |
|
} |
|
|
|
if( 'all' == $what || 'options' == $what ){ |
|
$this->options = array( |
|
'separator' => ' › ', |
|
'posts_on_front' => 'posts' == get_option( 'show_on_front' ) ? true : false, |
|
'page_for_posts' => get_option( 'page_for_posts' ), |
|
'show_pagenum' => true, // support pagination |
|
'show_htfpt' => false // show hierarchical terms for post types |
|
); |
|
} |
|
|
|
if( 'all' == $what || 'strings' == $what ){ |
|
$this->strings = array( |
|
'home' => 'Startseite', |
|
'search' => array( |
|
's' => 'Suchergebnis zu <em>%s</em>', |
|
'p' => 'Suchergebnisse zu <em>%s</em>' |
|
), |
|
'paged' => 'Seite %d', |
|
'404_error' => 'Fehler: Seite existiert nicht' |
|
); |
|
} |
|
|
|
} |
|
|
|
/** |
|
* |
|
* Set templates |
|
* @param array $templates An array with templates for link, current/standard state and before/after. |
|
*/ |
|
public function set_templates( array $templates = null ){ |
|
|
|
if( empty( $this->templates ) ) |
|
$this->init( 'templates' ); |
|
|
|
if( null != $templates ) |
|
$this->templates = wp_parse_args( $templates, $this->templates ); |
|
|
|
} |
|
|
|
/** |
|
* |
|
* Set optons |
|
* @param array $options An array with options. |
|
*/ |
|
public function set_options( array $options = null ){ |
|
|
|
if( empty( $this->options ) ) |
|
$this->init( 'options' ); |
|
|
|
if( null != $options ) |
|
$this->options = wp_parse_args( $options, $this->options ); |
|
|
|
} |
|
|
|
/** |
|
* |
|
* Set strings |
|
* @param array $strings An array with strings. |
|
*/ |
|
public function set_strings( array $strings = null ){ |
|
|
|
if( empty( $this->strings ) ) |
|
$this->init( 'strings' ); |
|
|
|
if( null != $strings ) |
|
$this->strings = wp_parse_args( $strings, $this->strings ); |
|
|
|
} |
|
|
|
/** |
|
* Return the final breadcrumb. |
|
* |
|
* @access protected |
|
* @return string |
|
*/ |
|
protected function output() { |
|
if ( empty( $this->breadcrumb ) ) |
|
$this->generate(); |
|
|
|
$breadcrumb = (string) implode( $this->options['separator'], $this->breadcrumb ); |
|
|
|
return $this->templates['before'] . $breadcrumb . $this->templates['after']; |
|
} |
|
|
|
/** |
|
* |
|
* Print the breadcrump |
|
* |
|
* @uses apply_filters |
|
* @param void |
|
* @return string Print the breadcrump to screen |
|
*/ |
|
public function print_breadcrump(){ |
|
echo apply_filters( 'print_ds_wp_breadcrump', $this->output() ); |
|
} |
|
|
|
/** |
|
* |
|
* Return the breadcrump |
|
* |
|
* @uses apply_filters |
|
* @param void |
|
* @return string Return the breadcrump as string |
|
*/ |
|
public function get_breadcrump(){ |
|
return apply_filters( 'get_ds_wp_breadcrump', $this->output() ); |
|
} |
|
|
|
/** |
|
* Build the item based on the type. |
|
* |
|
* @access protected |
|
* @param string|array $item |
|
* @param string $type |
|
* @return string |
|
*/ |
|
protected function template( $item, $type = 'standard' ) { |
|
if ( is_array( $item ) ) |
|
$type = 'link'; |
|
|
|
switch ( $type ) { |
|
case'link': |
|
return $this->template( |
|
sprintf( |
|
$this->templates['link'], |
|
esc_url( $item['link'] ), |
|
$item['title'] |
|
) |
|
); |
|
break; |
|
case 'current': |
|
return sprintf( $this->templates['current'], $item ); |
|
break; |
|
case 'standard': |
|
return sprintf( $this->templates['standard'], $item ); |
|
break; |
|
} |
|
} |
|
|
|
/** |
|
* Helper to generate taxonomy parents. |
|
* |
|
* @access protected |
|
* @param mixed $term_id |
|
* @param mixed $taxonomy |
|
* @return void |
|
*/ |
|
protected function generate_tax_parents( $term_id, $taxonomy ) { |
|
$parent_ids = array_reverse( get_ancestors( $term_id, $taxonomy ) ); |
|
|
|
foreach ( $parent_ids as $parent_id ) { |
|
$term = get_term( $parent_id, $taxonomy ); |
|
$this->breadcrumb["archive_{$taxonomy}_{$parent_id}"] = $this->template( array( |
|
'link' => get_term_link( $term->slug, $taxonomy ), |
|
'title' => $term->name |
|
) ); |
|
} |
|
} |
|
|
|
/** |
|
* Generate the breadcrumb. |
|
* |
|
* @access protected |
|
* @return void |
|
*/ |
|
protected function generate() { |
|
$post_type = get_post_type(); |
|
$queried_object = get_queried_object(); |
|
$this->options['show_pagenum'] = ( $this->options['show_pagenum'] && is_paged() ) ? true : false; |
|
|
|
|
|
// Home & Front Page |
|
$this->breadcrumb['home'] = $this->template( $this->strings['home'], 'current' ); |
|
$home_linked = $this->template( array( |
|
'link' => home_url( '/' ), |
|
'title' => $this->strings['home'] |
|
) ); |
|
|
|
|
|
if ( $this->options['posts_on_front'] ) { |
|
if ( ! is_home() || $this->options['show_pagenum'] ) |
|
$this->breadcrumb['home'] = $home_linked; |
|
} else { |
|
if ( ! is_front_page() ) |
|
$this->breadcrumb['home'] = $home_linked; |
|
|
|
if ( is_home() && !$this->options['show_pagenum'] ) |
|
$this->breadcrumb['blog'] = $this->template( get_the_title( $this->options['page_for_posts'] ), 'current' ); |
|
|
|
if ( ( 'post' == $post_type && ! is_search() && ! is_home() ) || ( 'post' == $post_type && $this->options['show_pagenum'] ) ) |
|
$this->breadcrumb['blog'] = $this->template( array( |
|
'link' => get_permalink( $this->options['page_for_posts'] ), |
|
'title' => get_the_title( $this->options['page_for_posts'] ) |
|
) ); |
|
} |
|
|
|
// Post Type Archive as index |
|
if ( is_singular() || ( is_archive() && ! is_post_type_archive() ) || is_search() || $this->options['show_pagenum'] ) { |
|
if ( $post_type_link = get_post_type_archive_link( $post_type ) ) { |
|
$post_type_label = get_post_type_object( $post_type )->labels->name; |
|
$this->breadcrumb["archive_{$post_type}"] = $this->template( array( |
|
'link' => $post_type_link, |
|
'title' => $post_type_label |
|
) ); |
|
} |
|
} |
|
|
|
if ( is_singular() ) { // Posts, (Sub)Pages, Attachments and Custom Post Types |
|
if ( ! is_front_page() ) { |
|
if ( 0 != $queried_object->post_parent ) { // Get Parents |
|
$parents = array_reverse( get_post_ancestors( $queried_object->ID ) ); |
|
|
|
foreach ( $parents as $parent ) { |
|
$this->breadcrumb["archive_{$post_type}_{$parent}"] = $this->template( array( |
|
'link' => get_permalink( $parent ), |
|
'title' => get_the_title( $parent ) |
|
) ); |
|
} |
|
} |
|
|
|
if ( $this->options['show_htfpt'] ) { |
|
$taxonomies = get_object_taxonomies( $post_type, 'objects' ); |
|
$taxonomies = array_values( wp_list_filter( $taxonomies, array( |
|
'hierarchical' => true |
|
) ) ); |
|
|
|
if ( ! empty( $taxonomies ) ) { |
|
$taxonomy = $taxonomies[0]->name; // Get the first taxonomy |
|
$terms = get_the_terms( $queried_object->ID, $taxonomy ); |
|
|
|
if ( ! empty( $terms ) ) { |
|
$terms = array_values( $terms ); |
|
$term = $terms[0]; // Get the first term |
|
|
|
if ( 0 != $term->parent ) |
|
$this->generate_tax_parents( $term->term_id, $taxonomy ); |
|
|
|
$this->breadcrumb["archive_{$taxonomy}"] = $this->template( array( |
|
'link' => get_term_link( $term->slug, $taxonomy ), |
|
'title' => $term->name |
|
) ); |
|
} |
|
} |
|
} |
|
|
|
|
|
$this->breadcrumb["single_{$post_type}"] = $this->template( get_the_title(), 'current' ); |
|
} |
|
} elseif ( is_search() ) { // Search |
|
$total = $GLOBALS['wp_query']->found_posts; |
|
$text = sprintf( |
|
_n( |
|
$this->strings['search']['s'], |
|
$this->strings['search']['p'], |
|
$total |
|
), |
|
get_search_query() |
|
); |
|
|
|
$this->breadcrumb['search'] = $this->template( $text, 'current' ); |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb['search'] = $this->template( array( |
|
'link' => home_url( '?s=' . urlencode( get_search_query( false ) ) ), |
|
'title' => $text |
|
) ); |
|
} elseif ( is_archive() ) { // All archive pages |
|
if ( is_category() || is_tag() || is_tax() ) { // Categories, Tags and Custom Taxonomies |
|
$taxonomy = $queried_object->taxonomy; |
|
|
|
if ( 0 != $queried_object->parent && is_taxonomy_hierarchical( $taxonomy ) ) // Get Parents |
|
$this->generate_tax_parents( $queried_object->term_id, $taxonomy ); |
|
|
|
$this->breadcrumb["archive_{$taxonomy}"] = $this->template( $queried_object->name, 'current' ); |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb["archive_{$taxonomy}"] = $this->template( array( |
|
'link' => get_term_link( $queried_object->slug, $taxonomy ), |
|
'title' => $queried_object->name |
|
) ); |
|
|
|
} elseif ( is_date() ) { // Date archive |
|
if ( is_year() ) { // Year archive |
|
$this->breadcrumb['archive_year'] = $this->template( get_the_date( 'Y' ), 'current' ); |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb['archive_year'] = $this->template( array( |
|
'link' => get_year_link( get_query_var( 'year' ) ), |
|
'title' => get_the_date( 'Y' ) |
|
) ); |
|
} elseif ( is_month() ) { // Month archive |
|
$this->breadcrumb['archive_year'] = $this->template( array( |
|
'link' => get_year_link( get_query_var( 'year' ) ), |
|
'title' => get_the_date( 'Y' ) |
|
) ); |
|
$this->breadcrumb['archive_month'] = $this->template( get_the_date( 'F' ), 'current' ); |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb['archive_month'] = $this->template( array( |
|
'link' => get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ), |
|
'title' => get_the_date( 'F' ) |
|
) ); |
|
} elseif ( is_day() ) { // Day archive |
|
$this->breadcrumb['archive_year'] = $this->template( array( |
|
'link' => get_year_link( get_query_var( 'year' ) ), |
|
'title' => get_the_date( 'Y' ) |
|
) ); |
|
$this->breadcrumb['archive_month'] = $this->template( array( |
|
'link' => get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ), |
|
'title' => get_the_date( 'F' ) |
|
) ); |
|
$this->breadcrumb['archive_day'] = $this->template( get_the_date( 'j' ) ); |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb['archive_day'] = $this->template( array( |
|
'link' => get_month_link( |
|
get_query_var( 'year' ), |
|
get_query_var( 'monthnum' ), |
|
get_query_var( 'day' ) |
|
), |
|
'title' => get_the_date( 'F' ) |
|
) ); |
|
} |
|
} elseif ( is_post_type_archive() && ! is_paged() ) { // Custom Post Type Archive |
|
$post_type_label = get_post_type_object( $post_type )->labels->name; |
|
$this->breadcrumb["archive_{$post_type}"] = $this->template( $post_type_label, 'current' ); |
|
} elseif ( is_author() ) { // Author archive |
|
$this->breadcrumb['archive_author'] = $this->template( $queried_object->display_name, 'current' ); |
|
} |
|
} elseif ( is_404() ) { |
|
$this->breadcrumb['404'] = $this->template( $this->strings['404_error'], 'current' ); |
|
} |
|
|
|
if ( $this->options['show_pagenum'] ) |
|
$this->breadcrumb['paged'] = $this->template( |
|
sprintf( |
|
$this->strings['paged'], |
|
get_query_var( 'paged' ) |
|
), |
|
'current' |
|
); |
|
} |
|
} |