/** * Custom breadcrumbs. * * @package Bloghash * @author Peregrine Themes * @since 1.0.0 */ /** * Do not allow direct script access. */ if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! function_exists( 'bloghash_breadcrumb_trail' ) ) { /** * Show a breadcrumb. * * @since 1.0.0 * @param array $args Arguments to pass. */ function bloghash_breadcrumb_trail( $args = array() ) { // Check if breadcrumb is turned on from WPSEO option. $breadcrumb_enable = is_callable( 'WPSEO_Options::get' ) ? WPSEO_Options::get( 'breadcrumbs-enable' ) : false; $wpseo_option = get_option( 'wpseo_internallinks' ) ? get_option( 'wpseo_internallinks' ) : $breadcrumb_enable; if ( ! is_array( $wpseo_option ) ) { unset( $wpseo_option ); $wpseo_option = array( 'breadcrumbs-enable' => $breadcrumb_enable, ); } if ( function_exists( 'yoast_breadcrumb' ) && $wpseo_option && true === $wpseo_option['breadcrumbs-enable'] ) { // Yoast breadcrumb. return yoast_breadcrumb(); } elseif ( function_exists( 'seopress_display_breadcrumbs' ) ) { // SEOPress breadcrumb. return seopress_display_breadcrumbs(); } elseif ( function_exists( 'rank_math_the_breadcrumbs' ) ) { // Rank Math breadcrumbs. return rank_math_the_breadcrumbs(); } // Bloghash breadcrumb trail. $breadcrumb = apply_filters( 'bloghash_breadcrumb_trail_object', null, $args ); if ( ! is_object( $breadcrumb ) ) { $breadcrumb = new Bloghash_Breadcrumb_Trail( $args ); } return $breadcrumb->trail(); } /** * Before HTML for SEOPress breadcrumbs. * * @since 1.0.0 */ function bloghash_seopress_breadcrumbs_before_html() { echo '
'; } add_action( 'seopress_breadcrumbs_before_html', 'bloghash_seopress_breadcrumbs_before_html' ); /** * After HTML for SEOPress breadcrumbs. * * @since 1.0.0 */ function bloghash_seopress_breadcrumbs_after_html() { echo '
'; } add_action( 'seopress_breadcrumbs_after_html', 'bloghash_seopress_breadcrumbs_after_html' ); /** * Overwrite the items for the breadcrumb trail. * * @since 1.0.0 * * @param array $items Array of items belonging to the current breadcrumb trail. * @param array $args Arguments used to build the breadcrumb trail. */ function bloghash_breadcrumb_trail_items( $items, $args ) { // Add link to the Blog page. if ( is_singular( 'post' ) ) { $page_for_posts = get_option( 'page_for_posts' ); $front_page = get_option( 'page_on_front' ); if ( $page_for_posts && $front_page ) { $posts_page_url = sprintf( '%s', esc_url( get_permalink( $page_for_posts ) ), esc_html( get_the_title( $page_for_posts ) ) ); array_splice( $items, 1, 0, $posts_page_url ); } } return $items; } add_filter( 'bloghash_breadcrumb_trail_items', 'bloghash_breadcrumb_trail_items', 10, 2 ); } /** * Creates a breadcrumbs menu for the site based on the current page that's being viewed by the user. * * @since 1.0.0 * @access public */ class Bloghash_Breadcrumb_Trail { /** * Array of items belonging to the current breadcrumb trail. * * @since 1.0.0 * @access public * @var array */ public $items = array(); /** * Arguments used to build the breadcrumb trail. * * @since 1.0.0 * @access public * @var array */ public $args = array(); /** * Array of text labels. * * @since 1.0.0 * @access public * @var array */ public $labels = array(); /** * Array of post types (key) and taxonomies (value) to use for single post views. * * @since 1.0.0 * @access public * @var array */ public $post_taxonomy = array(); /* ====== Magic Methods ====== */ /** * Magic method to use in case someone tries to output the layout object as a string. * We'll just return the trail HTML. * * @since 1.0.0 * @access public * @return string */ public function __toString() { return $this->trail(); } /** * Sets up the breadcrumb trail properties. Calls the `Breadcrumb_Trail::add_items()` method * to creat the array of breadcrumb items. * * @since 1.0.0 * @access public * @param array $args Optional. * @type string $container Container HTML element. nav|div. * @type string $before String to output before breadcrumb menu. * @type string $after String to output after breadcrumb menu. * @type string $browse_tag The HTML tag to use to wrap the "Browse" header text. * @type string $list_tag The HTML tag to use for the list wrapper. * @type string $item_tag The HTML tag to use for the item wrapper. * @type bool $show_on_front Whether to show when `is_front_page()`. * @type bool $network Whether to link to the network main site (multisite only). * @type bool $show_title Whether to show the title (last item) in the trail. * @type bool $show_browse Whether to show the breadcrumb menu header. * @type array $labels Text labels. @see Breadcrumb_Trail::set_labels() * @type array $post_taxonomy Taxonomies to use for post types. @see Breadcrumb_Trail::set_post_taxonomy() * @type bool $echo Whether to print or return the breadcrumbs. * @return void */ public function __construct( $args = array() ) { $defaults = array( 'container' => 'nav', 'before' => '', 'after' => '', 'browse_tag' => 'h2', 'list_tag' => 'ul', 'item_tag' => 'li', 'show_on_front' => true, 'network' => false, 'show_title' => true, 'show_browse' => true, 'labels' => array(), 'post_taxonomy' => array(), 'echo' => true, ); // Parse the arguments with the deaults. $this->args = apply_filters( 'bloghash_breadcrumb_trail_args', wp_parse_args( $args, $defaults ) ); // Set the labels and post taxonomy properties. $this->set_labels(); $this->set_post_taxonomy(); // Let's find some items to add to the trail! $this->add_items(); } /* ====== Public Methods ====== */ /** * Formats the HTML output for the breadcrumb trail. * * @since 1.0.0 * @access public * @return string */ public function trail() { // Set up variables that we'll need. $breadcrumb = ''; $item_count = count( $this->items ); $item_position = 0; // Connect the breadcrumb trail if there are items in the trail. if ( 0 < $item_count ) { // Add 'browse' label if it should be shown. if ( true === $this->args['show_browse'] ) { $breadcrumb .= sprintf( '<%1$s class="trail-browse">%2$s', tag_escape( $this->args['browse_tag'] ), $this->labels['browse'] ); } // Open the unordered list. $breadcrumb .= sprintf( '<%s class="trail-items" itemscope itemtype="http://schema.org/BreadcrumbList">', tag_escape( $this->args['list_tag'] ) ); // Add the number of items and item list order schema. $breadcrumb .= sprintf( '', absint( $item_count ) ); $breadcrumb .= ''; // Loop through the items and add them to the list. foreach ( $this->items as $item ) { // Iterate the item position. ++$item_position; // Check if the item is linked. preg_match( '/()(.*?)(<\/a>)/i', $item, $matches ); // Wrap the item text with appropriate itemprop. $item = ! empty( $matches ) ? sprintf( '%s%s%s', $matches[1], $matches[2], $matches[3] ) : sprintf( '%s', $item ); // Wrap the item with its itemprop. $item = ! empty( $matches ) ? preg_replace( '/(/i', '$1$2 itemprop=$2item$2>', $item ) : sprintf( '%s', $item ); // Add list item classes. $item_class = 'trail-item'; if ( 1 === $item_position && 1 < $item_count ) { $item_class .= ' trail-begin'; } elseif ( $item_count === $item_position ) { $item_class .= ' trail-end'; } // Create list item attributes. $attributes = 'itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" class="' . $item_class . '"'; // Build the meta position HTML. $meta = sprintf( '', absint( $item_position ) ); // Build the list item. $breadcrumb .= sprintf( '<%1$s %2$s>%3$s%4$s', tag_escape( $this->args['item_tag'] ), $attributes, $item, $meta ); } // Close the unordered list. $breadcrumb .= sprintf( '', tag_escape( $this->args['list_tag'] ) ); // Wrap the breadcrumb trail. $breadcrumb = sprintf( '<%1$s role="navigation" aria-label="%2$s" class="breadcrumb-trail breadcrumbs" itemprop="breadcrumb">%3$s%4$s%5$s', tag_escape( $this->args['container'] ), esc_attr( $this->labels['aria_label'] ), $this->args['before'], $breadcrumb, $this->args['after'] ); } // Allow developers to filter the breadcrumb trail HTML. $breadcrumb = apply_filters( 'bloghash_breadcrumb_trail', $breadcrumb, $this->args ); if ( false === $this->args['echo'] ) { return $breadcrumb; } echo $breadcrumb; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /* ====== Protected Methods ====== */ /** * Sets the labels property. Parses the inputted labels array with the defaults. * * @since 1.0.0 * @access protected * @return void */ protected function set_labels() { $defaults = array( 'browse' => esc_html__( 'Browse:', 'bloghash' ), 'aria_label' => esc_attr_x( 'Breadcrumbs', 'breadcrumbs aria label', 'bloghash' ), 'home' => esc_html__( 'Home', 'bloghash' ), 'error_404' => esc_html__( '404 Not Found', 'bloghash' ), 'archives' => esc_html__( 'Archives', 'bloghash' ), // Translators: %s is the search query. 'search' => esc_html__( 'Search results for: %s', 'bloghash' ), // Translators: %s is the page number. 'paged' => esc_html__( 'Page %s', 'bloghash' ), // Translators: %s is the page number. 'paged_comments' => esc_html__( 'Comment Page %s', 'bloghash' ), // Translators: Minute archive title. %s is the minute time format. 'archive_minute' => esc_html__( 'Minute %s', 'bloghash' ), // Translators: Weekly archive title. %s is the week date format. 'archive_week' => esc_html__( 'Week %s', 'bloghash' ), // "%s" is replaced with the translated date/time format. 'archive_minute_hour' => '%s', 'archive_hour' => '%s', 'archive_day' => '%s', 'archive_month' => '%s', 'archive_year' => '%s', ); $this->labels = apply_filters( 'bloghash_breadcrumb_trail_labels', wp_parse_args( $this->args['labels'], $defaults ) ); } /** * Sets the `$post_taxonomy` property. This is an array of post types (key) and taxonomies (value). * The taxonomy's terms are shown on the singular post view if set. * * @since 1.0.0 * @access protected * @return void */ protected function set_post_taxonomy() { $defaults = array(); // If post permalink is set to `%postname%`, use the `category` taxonomy. if ( '%postname%' === trim( get_option( 'permalink_structure' ), '/' ) ) { $defaults['post'] = 'category'; } $this->post_taxonomy = apply_filters( 'bloghash_breadcrumb_trail_post_taxonomy', wp_parse_args( $this->args['post_taxonomy'], $defaults ) ); } /** * Runs through the various WordPress conditional tags to check the current page being viewed. Once * a condition is met, a specific method is launched to add items to the `$items` array. * * @since 1.0.0 * @access protected * @return void */ protected function add_items() { if ( is_front_page() ) { $this->add_front_page_items(); } else { // Add the network and site home links. $this->add_network_home_link(); $this->add_site_home_link(); if ( is_home() ) { $this->add_blog_items(); } elseif ( is_singular() ) { $this->add_singular_items(); } elseif ( is_archive() ) { if ( is_post_type_archive() ) { $this->add_post_type_archive_items(); } elseif ( is_category() || is_tag() || is_tax() ) { $this->add_term_archive_items(); } elseif ( is_author() ) { $this->add_user_archive_items(); } elseif ( get_query_var( 'minute' ) && get_query_var( 'hour' ) ) { $this->add_minute_hour_archive_items(); } elseif ( get_query_var( 'minute' ) ) { $this->add_minute_archive_items(); } elseif ( get_query_var( 'hour' ) ) { $this->add_hour_archive_items(); } elseif ( is_day() ) { $this->add_day_archive_items(); } elseif ( get_query_var( 'w' ) ) { $this->add_week_archive_items(); } elseif ( is_month() ) { $this->add_month_archive_items(); } elseif ( is_year() ) { $this->add_year_archive_items(); } else { $this->add_default_archive_items(); } } elseif ( is_search() ) { $this->add_search_items(); } elseif ( is_404() ) { $this->add_404_items(); } } // Add paged items if they exist. $this->add_paged_items(); // Allow developers to overwrite the items for the breadcrumb trail. $this->items = array_unique( apply_filters( 'bloghash_breadcrumb_trail_items', $this->items, $this->args ) ); } /** * Gets front items based on $wp_rewrite->front. * * @since 1.0.0 * @access protected * @return void */ protected function add_rewrite_front_items() { global $wp_rewrite; if ( $wp_rewrite->front ) { $this->add_path_parents( $wp_rewrite->front ); } } /** * Adds the page/paged number to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_paged_items() { if ( is_singular() && 1 < get_query_var( 'page' ) && true === $this->args['show_title'] ) { // If viewing a paged singular post. $this->items[] = sprintf( $this->labels['paged'], number_format_i18n( absint( get_query_var( 'page' ) ) ) ); } elseif ( is_singular() && get_option( 'page_comments' ) && 1 < get_query_var( 'cpage' ) ) { // If viewing a singular post with paged comments. $this->items[] = sprintf( $this->labels['paged_comments'], number_format_i18n( absint( get_query_var( 'cpage' ) ) ) ); } elseif ( is_paged() && true === $this->args['show_title'] ) { // If viewing a paged archive-type page. $this->items[] = sprintf( $this->labels['paged'], number_format_i18n( absint( get_query_var( 'paged' ) ) ) ); } } /** * Adds the network (all sites) home page link to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_network_home_link() { if ( is_multisite() && ! is_main_site() && true === $this->args['network'] ) { $this->items[] = sprintf( '%s', esc_url( network_home_url() ), $this->labels['home'] ); } } /** * Adds the current site's home page link to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_site_home_link() { $network = is_multisite() && ! is_main_site() && true === $this->args['network']; $label = $network ? get_bloginfo( 'name' ) : $this->labels['home']; $rel = $network ? '' : ' rel="home"'; $this->items[] = sprintf( '%s', esc_url( user_trailingslashit( home_url() ) ), $rel, $label ); } /** * Adds items for the front page to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_front_page_items() { // Only show front items if the 'show_on_front' argument is set to 'true'. if ( true === $this->args['show_on_front'] || is_paged() || ( is_singular() && 1 < get_query_var( 'page' ) ) ) { // Add network home link. $this->add_network_home_link(); if ( is_paged() ) { // If on a paged view, add the site home link. $this->add_site_home_link(); } elseif ( true === $this->args['show_title'] ) { // If on the main front page, add the network home title. $this->items[] = is_multisite() && true === $this->args['network'] ? get_bloginfo( 'name' ) : $this->labels['home']; } } } /** * Adds items for the posts page (i.e., is_home()) to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_blog_items() { // Get the post ID and post. $post_id = get_queried_object_id(); $post = get_post( $post_id ); // If the post has parents, add them to the trail. if ( 0 < $post->post_parent ) { $this->add_post_parents( $post->post_parent ); } // Get the page title. $title = get_the_title( $post_id ); // Add the posts page item. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), $title ); } elseif ( $title && true === $this->args['show_title'] ) { $this->items[] = $title; } } /** * Adds singular post items to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_singular_items() { // Get the queried post. $post = get_queried_object(); $post_id = get_queried_object_id(); if ( 0 < $post->post_parent ) { // If the post has a parent, follow the parent trail. $this->add_post_parents( $post->post_parent ); } else { // If the post doesn't have a parent, get its hierarchy based off the post type. $this->add_post_hierarchy( $post_id ); } // Display terms for specific post type taxonomy if requested. if ( ! empty( $this->post_taxonomy[ $post->post_type ] ) ) { $this->add_post_terms( $post_id, $this->post_taxonomy[ $post->post_type ] ); } // End with the post title. $post_title = single_post_title( '', false ); if ( $post_title ) { if ( ( 1 < get_query_var( 'page' ) || is_paged() ) || ( get_option( 'page_comments' ) && 1 < absint( get_query_var( 'cpage' ) ) ) ) { $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), $post_title ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = $post_title; } } } /** * Adds the items to the trail items array for taxonomy term archives. * * @since 1.0.0 * @access protected * @global object $wp_rewrite * @return void */ protected function add_term_archive_items() { global $wp_rewrite; // Get some taxonomy and term variables. $term = get_queried_object(); $taxonomy = get_taxonomy( $term->taxonomy ); $done_post_type = false; // If there are rewrite rules for the taxonomy. if ( false !== $taxonomy->rewrite ) { // If 'with_front' is true, dd $wp_rewrite->front to the trail. if ( $taxonomy->rewrite['with_front'] && $wp_rewrite->front ) { $this->add_rewrite_front_items(); } // Get parent pages by path if they exist. $this->add_path_parents( $taxonomy->rewrite['slug'] ); // Add post type archive if its 'has_archive' matches the taxonomy rewrite 'slug'. if ( $taxonomy->rewrite['slug'] ) { $slug = trim( $taxonomy->rewrite['slug'], '/' ); // Deals with the situation if the slug has a '/' between multiple // strings. For example, "movies/genres" where "movies" is the post // type archive. $matches = explode( '/', $slug ); // If matches are found for the path. if ( isset( $matches ) ) { // Reverse the array of matches to search for posts in the proper order. $matches = array_reverse( $matches ); // Loop through each of the path matches. foreach ( $matches as $match ) { // Get public post types that match the rewrite slug. $post_types = $this->get_post_types_by_slug( $match ); if ( ! empty( $post_types ) ) { $post_type_object = $post_types[0]; // Add support for a non-standard label of 'archive_title' (special use case). $label = ! empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'bloghash_post_type_archive_title', $label, $post_type_object->name ); // Add the post type archive link to the trail. $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), $label ); $done_post_type = true; // Break out of the loop. break; } } } } } // If there's a single post type for the taxonomy, use it. if ( false === $done_post_type && 1 === count( $taxonomy->object_type ) && post_type_exists( $taxonomy->object_type[0] ) ) { // If the post type is 'post'. if ( 'post' === $taxonomy->object_type[0] ) { $post_id = get_option( 'page_for_posts' ); if ( 'posts' !== get_option( 'show_on_front' ) && 0 < $post_id ) { $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), get_the_title( $post_id ) ); } // If the post type is not 'post'. } else { $post_type_object = get_post_type_object( $taxonomy->object_type[0] ); $label = ! empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'bloghash_post_type_archive_title', $label, $post_type_object->name ); $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), $label ); } } // If the taxonomy is hierarchical, list its parent terms. if ( is_taxonomy_hierarchical( $term->taxonomy ) && $term->parent ) { $this->add_term_parents( $term->parent, $term->taxonomy ); } // Add the term name to the trail end. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_term_link( $term, $term->taxonomy ) ), single_term_title( '', false ) ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = single_term_title( '', false ); } } /** * Adds the items to the trail items array for post type archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_post_type_archive_items() { // Get the post type object. $post_type_object = get_post_type_object( get_query_var( 'post_type' ) ); if ( false !== $post_type_object->rewrite ) { // If 'with_front' is true, add $wp_rewrite->front to the trail. if ( $post_type_object->rewrite['with_front'] ) { $this->add_rewrite_front_items(); } // If there's a rewrite slug, check for parents. if ( ! empty( $post_type_object->rewrite['slug'] ) ) { $this->add_path_parents( $post_type_object->rewrite['slug'] ); } } // Add the post type [plural] name to the trail end. if ( is_paged() || is_author() ) { $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), post_type_archive_title( '', false ) ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = post_type_archive_title( '', false ); } // If viewing a post type archive by author. if ( is_author() ) { $this->add_user_archive_items(); } } /** * Adds the items to the trail items array for user (author) archives. * * @since 1.0.0 * @access protected * @global object $wp_rewrite * @return void */ protected function add_user_archive_items() { global $wp_rewrite; // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the user ID. $user_id = get_query_var( 'author' ); // If $author_base exists, check for parent pages. if ( ! empty( $wp_rewrite->author_base ) && ! is_post_type_archive() ) { $this->add_path_parents( $wp_rewrite->author_base ); } // Add the author's display name to the trail end. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_author_posts_url( $user_id ) ), get_the_author_meta( 'display_name', $user_id ) ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = get_the_author_meta( 'display_name', $user_id ); } } /** * Adds the items to the trail items array for minute + hour archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_minute_hour_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the minute + hour item. if ( true === $this->args['show_title'] ) { $this->items[] = sprintf( $this->labels['archive_minute_hour'], get_the_time( esc_html_x( 'g:i a', 'minute and hour archives time format', 'bloghash' ) ) ); } } /** * Adds the items to the trail items array for minute archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_minute_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the minute item. if ( true === $this->args['show_title'] ) { $this->items[] = sprintf( $this->labels['archive_minute'], get_the_time( esc_html_x( 'i', 'minute archives time format', 'bloghash' ) ) ); } } /** * Adds the items to the trail items array for hour archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_hour_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the hour item. if ( true === $this->args['show_title'] ) { $this->items[] = sprintf( $this->labels['archive_hour'], get_the_time( esc_html_x( 'g a', 'hour archives time format', 'bloghash' ) ) ); } } /** * Adds the items to the trail items array for day archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_day_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get year, month, and day. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'bloghash' ) ) ); $month = sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'bloghash' ) ) ); $day = sprintf( $this->labels['archive_day'], get_the_time( esc_html_x( 'j', 'daily archives date format', 'bloghash' ) ) ); // Add the year and month items. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) ), $month ); // Add the day item. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_day_link( get_the_time( 'Y' ) ), get_the_time( 'm' ), get_the_time( 'd' ) ), $day ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = $day; } } /** * Adds the items to the trail items array for week archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_week_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year and week. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'bloghash' ) ) ); $week = sprintf( $this->labels['archive_week'], get_the_time( esc_html_x( 'W', 'weekly archives date format', 'bloghash' ) ) ); // Add the year item. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); // Add the week item. if ( is_paged() ) { $this->items[] = esc_url( get_archives_link( add_query_arg( array( 'm' => get_the_time( 'Y' ), 'w' => get_the_time( 'W' ), ), home_url() ), $week, false ) ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = $week; } } /** * Adds the items to the trail items array for month archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_month_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year and month. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'bloghash' ) ) ); $month = sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'bloghash' ) ) ); // Add the year item. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); // Add the month item. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) ), $month ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = $month; } } /** * Adds the items to the trail items array for year archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_year_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'bloghash' ) ) ); // Add the year item. if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = $year; } } /** * Adds the items to the trail items array for archives that don't have a more specific method * defined in this class. * * @since 1.0.0 * @access protected * @return void */ protected function add_default_archive_items() { // If this is a date-/time-based archive, add $wp_rewrite->front to the trail. if ( is_date() || is_time() ) { $this->add_rewrite_front_items(); } if ( true === $this->args['show_title'] ) { $this->items[] = $this->labels['archives']; } } /** * Adds the items to the trail items array for search results. * * @since 1.0.0 * @access protected * @return void */ protected function add_search_items() { if ( is_paged() ) { $this->items[] = sprintf( '%s', esc_url( get_search_link() ), sprintf( $this->labels['search'], get_search_query() ) ); } elseif ( true === $this->args['show_title'] ) { $this->items[] = sprintf( $this->labels['search'], get_search_query() ); } } /** * Adds the items to the trail items array for 404 pages. * * @since 1.0.0 * @access protected * @return void */ protected function add_404_items() { if ( true === $this->args['show_title'] ) { $this->items[] = $this->labels['error_404']; } } /** * Adds a specific post's parents to the items array. * * @since 1.0.0 * @access protected * @param int $post_id Post ID. * @return void */ protected function add_post_parents( $post_id ) { $parents = array(); while ( $post_id ) { // Get the post by ID. $post = get_post( $post_id ); // If we hit a page that's set as the front page, bail. if ( 'page' === $post->post_type && 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) === $post_id ) { break; } // Add the formatted post link to the array of parents. $parents[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), get_the_title( $post_id ) ); // If there's no longer a post parent, break out of the loop. if ( 0 >= $post->post_parent ) { break; } // Change the post ID to the parent post to continue looping. $post_id = $post->post_parent; } // Get the post hierarchy based off the final parent post. $this->add_post_hierarchy( $post_id ); // Display terms for specific post type taxonomy if requested. if ( ! empty( $this->post_taxonomy[ $post->post_type ] ) ) { $this->add_post_terms( $post_id, $this->post_taxonomy[ $post->post_type ] ); } // Merge the parent items into the items array. $this->items = array_merge( $this->items, array_reverse( $parents ) ); } /** * Adds a specific post's hierarchy to the items array. The hierarchy is determined by post type's * rewrite arguments and whether it has an archive page. * * @since 1.0.0 * @access protected * @param int $post_id Post ID. * @return void */ protected function add_post_hierarchy( $post_id ) { // Get the post type. $post_type = get_post_type( $post_id ); $post_type_object = get_post_type_object( $post_type ); if ( 'post' === $post_type ) { // If this is the 'post' post type, get the rewrite front items and map the rewrite tags. // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Map the rewrite tags. $this->map_rewrite_tags( $post_id, get_option( 'permalink_structure' ) ); } elseif ( false !== $post_type_object->rewrite ) { // If the post type has rewrite rules. // If 'with_front' is true, add $wp_rewrite->front to the trail. if ( $post_type_object->rewrite['with_front'] ) { $this->add_rewrite_front_items(); } // If there's a path, check for parents. if ( ! empty( $post_type_object->rewrite['slug'] ) ) { $this->add_path_parents( $post_type_object->rewrite['slug'] ); } } // If there's an archive page, add it to the trail. if ( $post_type_object->has_archive ) { // Add support for a non-standard label of 'archive_title' (special use case). $label = ! empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'bloghash_post_type_archive_title', $label, $post_type_object->name ); $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type ) ), $label ); } // Map the rewrite tags if there's a `%` in the slug. if ( 'post' !== $post_type && ! empty( $post_type_object->rewrite['slug'] ) && false !== strpos( $post_type_object->rewrite['slug'], '%' ) ) { $this->map_rewrite_tags( $post_id, $post_type_object->rewrite['slug'] ); } } /** * Gets post types by slug. This is needed because the get_post_types() function doesn't exactly * match the 'has_archive' argument when it's set as a string instead of a boolean. * * @since 1.0.0 * @access protected * @param int $slug The post type archive slug to search for. * @return array */ protected function get_post_types_by_slug( $slug ) { $return = array(); $post_types = get_post_types( array(), 'objects' ); foreach ( $post_types as $type ) { if ( $slug === $type->has_archive || ( true === $type->has_archive && $slug === $type->rewrite['slug'] ) ) { $return[] = $type; } } return $return; } /** * Adds a post's terms from a specific taxonomy to the items array. * * @since 1.0.0 * @access protected * @param int $post_id The ID of the post to get the terms for. * @param string $taxonomy The taxonomy to get the terms from. * @return void */ protected function add_post_terms( $post_id, $taxonomy ) { // Get the post categories. $terms = get_the_terms( $post_id, $taxonomy ); // Check that categories were returned. if ( $terms && ! is_wp_error( $terms ) ) { // Sort the terms by ID and get the first category. if ( function_exists( 'wp_list_sort' ) ) { $terms = wp_list_sort( $terms, 'term_id' ); } else { usort( $terms, '_usort_terms_by_ID' ); } $term = get_term( $terms[0], $taxonomy ); // If the category has a parent, add the hierarchy to the trail. if ( 0 < $term->parent ) { $this->add_term_parents( $term->parent, $taxonomy ); } // Add the category archive link to the trail. $this->items[] = sprintf( '%s', esc_url( get_term_link( $term, $taxonomy ) ), $term->name ); } } /** * Get parent posts by path. Currently, this method only supports getting parents of the 'page' * post type. The goal of this function is to create a clear path back to home given what would * normally be a "ghost" directory. If any page matches the given path, it'll be added. * * @since 1.0.0 * @access protected * @param string $path The path (slug) to search for posts by. * @return void */ protected function add_path_parents( $path ) { // Trim '/' off $path in case we just got a simple '/' instead of a real path. $path = trim( $path, '/' ); // If there's no path, return. if ( empty( $path ) ) { return; } // Get parent post by the path. $post = get_page_by_path( $path ); if ( ! empty( $post ) ) { $this->add_post_parents( $post->ID ); } elseif ( is_null( $post ) ) { // Separate post names into separate paths by '/'. $path = trim( $path, '/' ); preg_match_all( '/\/.*?\z/', $path, $matches ); // If matches are found for the path. if ( isset( $matches ) ) { // Reverse the array of matches to search for posts in the proper order. $matches = array_reverse( $matches ); // Loop through each of the path matches. foreach ( $matches as $match ) { // If a match is found. if ( isset( $match[0] ) ) { // Get the parent post by the given path. $path = str_replace( $match[0], '', $path ); $post = get_page_by_path( trim( $path, '/' ) ); // If a parent post is found, set the $post_id and break out of the loop. if ( ! empty( $post ) && 0 < $post->ID ) { $this->add_post_parents( $post->ID ); break; } } } } } } /** * Searches for term parents of hierarchical taxonomies. This function is similar to the WordPress * function get_category_parents() but handles any type of taxonomy. * * @since 1.0.0 * @param int $term_id ID of the term to get the parents of. * @param string $taxonomy Name of the taxonomy for the given term. * @return void */ protected function add_term_parents( $term_id, $taxonomy ) { // Set up some default arrays. $parents = array(); // While there is a parent ID, add the parent term link to the $parents array. while ( $term_id ) { // Get the parent term. $term = get_term( $term_id, $taxonomy ); // Add the formatted term link to the array of parent terms. $parents[] = sprintf( '%s', esc_url( get_term_link( $term, $taxonomy ) ), $term->name ); // Set the parent term's parent as the parent ID. $term_id = $term->parent; } // If we have parent terms, reverse the array to put them in the proper order for the trail. if ( ! empty( $parents ) ) { $this->items = array_merge( $this->items, array_reverse( $parents ) ); } } /** * Turns %tag% from permalink structures into usable links for the breadcrumb trail. This feels kind of * hackish for now because we're checking for specific %tag% examples and only doing it for the 'post' * post type. In the future, maybe it'll handle a wider variety of possibilities, especially for custom post * types. * * @since 1.0.0 * @access protected * @param int $post_id ID of the post whose parents we want. * @param string $path Path of a potential parent page. * @return void */ protected function map_rewrite_tags( $post_id, $path ) { $post = get_post( $post_id ); // Trim '/' from both sides of the $path. $path = trim( $path, '/' ); // Split the $path into an array of strings. $matches = explode( '/', $path ); // If matches are found for the path. if ( is_array( $matches ) ) { // Loop through each of the matches, adding each to the $trail array. foreach ( $matches as $match ) { // Trim any '/' from the $match. $tag = trim( $match, '/' ); if ( '%year%' === $tag ) { // If using the %year% tag, add a link to the yearly archive. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y', $post_id ) ) ), sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'bloghash' ) ) ) ); } elseif ( '%monthnum%' === $tag ) { // If using the %monthnum% tag, add a link to the monthly archive. $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y', $post_id ), get_the_time( 'm', $post_id ) ) ), sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'bloghash' ) ) ) ); } elseif ( '%day%' === $tag ) { // If using the %day% tag, add a link to the daily archive. $this->items[] = sprintf( '%s', esc_url( get_day_link( get_the_time( 'Y', $post_id ), get_the_time( 'm', $post_id ), get_the_time( 'd', $post_id ) ) ), sprintf( $this->labels['archive_day'], get_the_time( esc_html_x( 'j', 'daily archives date format', 'bloghash' ) ) ) ); } elseif ( '%author%' === $tag ) { // If using the %author% tag, add a link to the post author archive. $this->items[] = sprintf( '%s', esc_url( get_author_posts_url( $post->post_author ) ), get_the_author_meta( 'display_name', $post->post_author ) ); } elseif ( taxonomy_exists( trim( $tag, '%' ) ) ) { // If using the %category% tag, add a link to the first category archive to match permalinks. // Force override terms in this post type. $this->post_taxonomy[ $post->post_type ] = false; // Add the post categories. $this->add_post_terms( $post_id, trim( $tag, '%' ) ); } } } } } -
Skip to content

  • IPL
  • Sports
  • Cricket
    • World Cup
  • Football
  • NFL
  • IPL
  • NBA
  • Tennis
  • facebook.com
  • twitter.com
  • t.me
  • instagram.com
  • youtube.com
Subscribe
Top Stories
England squad for 5th Test against India announced, CSK star included
July 28, 2025
Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air
July 28, 2025
Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad
July 27, 2025
Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026
July 27, 2025
MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?
July 27, 2025
Bhuvneshwar Kumar breaks silence after RCB stampede case
July 27, 2025
After Yash Dayal, Nitish Kumar Reddy faces colossal legal trouble
July 26, 2025
[WATCH] ‘Was really hard to leave her’ – KL Rahul opens up on missing daughter during England tour
July 26, 2025
RCB in trouble? Bengaluru stampede sparks talk of ban on IPL 2025 winners
July 25, 2025
RCB’s home ground, Chinnaswamy Stadium, banned from IPL
July 25, 2025
RCB to be banned from IPL!! Karnataka Government initiates legal proceedings
July 25, 2025
Yash Dayal Rape Case- RCB Star booked for crime with a MINOR in Jaipur during IPL 2025
July 24, 2025
M. Chinnaswamy Stadium flagged “unsuitable and unsafe” to host following stampede row
July 24, 2025
Sanjiv Goenka issues official statement on Rishabh Pant’s future after continuous injuries
July 24, 2025
Rajat Patidar ruled out of Duleep Trophy; Avesh, Mayank undergo surgeries
July 23, 2025
Actor Abhishek Bachchan believes IPL changed lives for cricketers around the world
July 23, 2025
Dewald Brevis faces Mumbai Indians’ wrath for joining CSK, thrown out of the team
July 23, 2025
Akash Deep, Arshdeep Singh IPL contracts in danger in England; investigation ordered
July 23, 2025
Kavya Maran’s Sunrisers suffer massive blow as captain leaves the team
July 23, 2025
BCCI loses faith in Gautam Gambhir, Anshul Kamboj inducted after MS Dhoni’s approval
July 23, 2025
Virat Kohli’s RCB In, Babar Azam’s Peshawar Zalmi Out!! Champions League T20 formula conceived
July 22, 2025
Mumbai Indians or Hardik Pandya? Who made Rohit Sharma Impact Player finally revealed
July 22, 2025
CSK’s Urvil Patel demolishes RCB; exposes cheap tactics
July 22, 2025
“It was a…”: Harbhajan Singh gets candid about Sreesanth’s daughter’s emotional confrontation
July 21, 2025
Ravi Bishnoi makes colossal statement on Virat Kohli
July 21, 2025
Painful! Harbhajan Singh finally reveals what Sreesanth’s daughter did to leave him broken and crying
July 21, 2025
‘Two good news’ – Urvil Patel reveals receiving offers from both CSK, RCB on same day
July 20, 2025
IPL 2026 Trade Window: Nitish Rana fuels KKR move speculation with team cap appearance
July 20, 2025
Will RCB be allowed to play in Champions League T20 2026?
July 20, 2025
RCB insider exposes how Virat Kohli controls team strategies without being captain
July 19, 2025
Mohammed Shami’s Test comeback on the cards? Pacer officially included in…
July 19, 2025
CSK captain Ruturaj Gaikwad quits the team; Official statement issued
July 19, 2025
KKR set to ditch Venkatesh Iyer for SRH superstar in high-profile trade ahead of IPL 2026
July 18, 2025
BCCI strengthens financial dominance, mind-blowing ₹9,741.7 crore revenue revealed as IPL contributes….
July 18, 2025
Shocking! Mohammed Shami’s estranged wife Hasin Jahan booked for plotting murder of….
July 18, 2025
RCB fully blamed for Bengaluru stampede, Karnataka govt shockingly targets Virat Kohli
July 17, 2025
Allahabad High Court grants interim protection from arrest to RCB pacer Yash Dayal
July 16, 2025
Mumbai Indians’ benchwarmer in IPL 2025, now a T20I debutant – SA vs NZ, Zimbabwe T20I Tri Series
July 16, 2025
After more than 1 year of T20 retirement, Virat Kohli becomes 1st Indian player to
July 16, 2025
Watch- Jitesh Sharma humiliated; denied entry at Lord’s, Dinesh Karthik forced to rescue
July 16, 2025
Sanju Samson removed as franchise captain as CSK transfer nears
July 16, 2025
Virat Kohli’s jersey number 18 allotted to this Indian player
July 16, 2025
RCB’s troubles mount in Stampede case; High court orders State Government to…
July 16, 2025
Karnataka High Court orders state to share Chinnaswamy Stadium stampede report
July 15, 2025
Mohammed Shami, Ishan Kishan to be released by SRH ahead of IPL 2026 auction
July 15, 2025
Gametwist belote : Jeu gratuit en ligne avec des Twists
July 14, 2025
Kavya Maran’s SRH announces new bowling coach for IPL 2026
July 14, 2025
Nitish Kumar Reddy crumbles after constant ‘IPL’ sledging from Ex-SRH teammate Harry Brook
July 14, 2025
Sunrisers Hyderabad appoint Varun Aaron as new bowling coach ahead of IPL 2026
July 14, 2025
RCB veteran ditches team; picks IPL rivals to help
July 14, 2025
RCB’s main sponsor leaves after stampede incident; how will they pay Virat Kohli’s salary?
July 13, 2025
All IPL teams attack England Cricket after Shubman Gill-Zak Crawley episode, ECB responds
July 13, 2025
RCB ban from IPL sealed; judicial enquiry holds team responsible for Bengaluru stampede
July 12, 2025
Mayank Yadav set for miraculous comeback at Asia Cup 2025? Pacer set to begin rehab after surgery
July 12, 2025
Mitchell Starc shuts the door forever on his IPL career ahead of 100th Test for Australia
July 12, 2025
Yash Dayal sexual harassment case- RCB pacer goes 1 step forward
July 11, 2025
Five HCA members arrested for blackmailing SRH owner Kavya Maran
July 10, 2025
KKR scout drops big hint on Sanju Samson move amid IPL 2026 Trade Window chatter
July 10, 2025
RCB pacer leaves his team amid franchise turmoil
July 10, 2025
Sanju Samson-Venkatesh Iyer mega trade on the cards? KKR scout drops bombshell
July 10, 2025
Kavya Maran’s SRH linked with ₹2.32 crore scam as Hyderabad Cricket Association officials land in jail
July 10, 2025
Mumbai Indians and Lucknow Super Giants hunt down RCB player in IPL Trade Deal
July 10, 2025
Vaibhav Suryavanshi goes against India legend
July 10, 2025
Real villain behind Shubman Gill’s KKR exit OUT in public
July 10, 2025
Mohammad Azharuddin busts massive IPL ticket scam; BCCI ashamed
July 10, 2025
Not MI or CSK? Check out which team overtook traditional giants — full list of franchise valuations
July 9, 2025
Yash Dayal issues official statement on damaging sexual exploitation allegations
July 9, 2025
Phil Salt caught CHEATING on field in Vitality Blast! Anti-corruption unit steps in
July 9, 2025
RCB takes legal action in Stampede case; desperate moves initiated to avoid IPL ban
July 8, 2025
India’s fastest-ever pacer gets fully fit; Test debut vs England on the cards?
July 8, 2025
Royal Challengers Bengaluru brutally beats CSK again in this competition
July 8, 2025
Ravi Shastri exposes Dinesh Karthik for bootlicking Shubman Gill after releasing him from KKR
July 8, 2025
Yash Dayal Sexual Harassment Case- FIR filed against RCB Star, Sex Exploitation registered
July 8, 2025
3 teams that can spark bidding war for Wiaan Mulder
July 7, 2025
AB de Villiers shares blunt views on MS Dhoni: “Was very difficult to…”
July 7, 2025
“It’s very important to be…”: Former Indian opener warns IPL wonderkid Vaibhav Suryavanshi ahead of the 2026 edition
July 7, 2025
Pakistan banned from World Club Championship 2026; IPL participation officially ruled out
July 6, 2025
Rishabh Pant and Gautam Gambhir’s team politics caught on camera
July 6, 2025
Digvesh Rathi beaten by CSK discard for highest price in DPL Auction 2025
July 6, 2025
Vaibhav Suryavanshi’s entry in senior team India announced
July 6, 2025
RCB ban destined? Stampede victims level unhinged allegations; BCCI set for legal route!
July 6, 2025
Top 5 Players Who Have Won Most IPL Titles
July 6, 2025
3 reasons Sanju Samson could be traded from RR to CSK ahead of IPL 2026
July 5, 2025
Vaibhav Suryavanshi receives orders to stay away from..
July 5, 2025
Sanju Samson signed as the most expensive player by..
July 5, 2025
Sanju Samson confronted on CSK move; player responds
July 4, 2025
Sanjana Ganesan spills beans on Jasprit Bumrah’s unforgettable IPL proposal
July 4, 2025
Sanjana Ganesan spills beans on Jasprit Bumrah’s unforgettable IPL proposal
July 4, 2025
Test Post
July 3, 2025
Test Post
July 3, 2025
RCB ban inevitable! BCCI moves ahead with IPS complaint on stampede
July 3, 2025
Shashank Singh exposes Shreyas Iyer’s weakness in the latter’s house
July 3, 2025
Ravichandran Ashwin gives trial for Rajasthan Royals amid Sanju Samson’s transfer to CSK
July 3, 2025
Nitish Rana quits UP to play for Delhi Cricket; now BCCI bans him from..
July 3, 2025
3 teams that can target Sanju Samson during IPL 2026 Player Trade Window
July 3, 2025
Mohammed Shami’s Hasin Jahan vows to make his life hell after latest court order
July 3, 2025
Virat Kohli raided in London; conflict arises
July 3, 2025
SRH co-owner Kavya Maran finally reacts to viral IPL memes about her
July 2, 2025
Sanju Samson announced MS Dhoni’s successor in CSK
July 2, 2025
Not Shivam Dube!! 2 CSK players picked for Sanju Samson trade
July 2, 2025
England squad for 5th Test against India announced, CSK star included
July 28, 2025
Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air
July 28, 2025
Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad
July 27, 2025
Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026
July 27, 2025
MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?
July 27, 2025
Bhuvneshwar Kumar breaks silence after RCB stampede case
July 27, 2025
After Yash Dayal, Nitish Kumar Reddy faces colossal legal trouble
July 26, 2025
[WATCH] ‘Was really hard to leave her’ – KL Rahul opens up on missing daughter during England tour
July 26, 2025
RCB in trouble? Bengaluru stampede sparks talk of ban on IPL 2025 winners
July 25, 2025
RCB’s home ground, Chinnaswamy Stadium, banned from IPL
July 25, 2025
RCB to be banned from IPL!! Karnataka Government initiates legal proceedings
July 25, 2025
Yash Dayal Rape Case- RCB Star booked for crime with a MINOR in Jaipur during IPL 2025
July 24, 2025
M. Chinnaswamy Stadium flagged “unsuitable and unsafe” to host following stampede row
July 24, 2025
Sanjiv Goenka issues official statement on Rishabh Pant’s future after continuous injuries
July 24, 2025
Rajat Patidar ruled out of Duleep Trophy; Avesh, Mayank undergo surgeries
July 23, 2025
Actor Abhishek Bachchan believes IPL changed lives for cricketers around the world
July 23, 2025
Dewald Brevis faces Mumbai Indians’ wrath for joining CSK, thrown out of the team
July 23, 2025
Akash Deep, Arshdeep Singh IPL contracts in danger in England; investigation ordered
July 23, 2025
Kavya Maran’s Sunrisers suffer massive blow as captain leaves the team
July 23, 2025
BCCI loses faith in Gautam Gambhir, Anshul Kamboj inducted after MS Dhoni’s approval
July 23, 2025
Virat Kohli’s RCB In, Babar Azam’s Peshawar Zalmi Out!! Champions League T20 formula conceived
July 22, 2025
Mumbai Indians or Hardik Pandya? Who made Rohit Sharma Impact Player finally revealed
July 22, 2025
CSK’s Urvil Patel demolishes RCB; exposes cheap tactics
July 22, 2025
“It was a…”: Harbhajan Singh gets candid about Sreesanth’s daughter’s emotional confrontation
July 21, 2025
Ravi Bishnoi makes colossal statement on Virat Kohli
July 21, 2025
Painful! Harbhajan Singh finally reveals what Sreesanth’s daughter did to leave him broken and crying
July 21, 2025
‘Two good news’ – Urvil Patel reveals receiving offers from both CSK, RCB on same day
July 20, 2025
IPL 2026 Trade Window: Nitish Rana fuels KKR move speculation with team cap appearance
July 20, 2025
Will RCB be allowed to play in Champions League T20 2026?
July 20, 2025
RCB insider exposes how Virat Kohli controls team strategies without being captain
July 19, 2025
Mohammed Shami’s Test comeback on the cards? Pacer officially included in…
July 19, 2025
CSK captain Ruturaj Gaikwad quits the team; Official statement issued
July 19, 2025
KKR set to ditch Venkatesh Iyer for SRH superstar in high-profile trade ahead of IPL 2026
July 18, 2025
BCCI strengthens financial dominance, mind-blowing ₹9,741.7 crore revenue revealed as IPL contributes….
July 18, 2025
Shocking! Mohammed Shami’s estranged wife Hasin Jahan booked for plotting murder of….
July 18, 2025
RCB fully blamed for Bengaluru stampede, Karnataka govt shockingly targets Virat Kohli
July 17, 2025
Allahabad High Court grants interim protection from arrest to RCB pacer Yash Dayal
July 16, 2025
Mumbai Indians’ benchwarmer in IPL 2025, now a T20I debutant – SA vs NZ, Zimbabwe T20I Tri Series
July 16, 2025
After more than 1 year of T20 retirement, Virat Kohli becomes 1st Indian player to
July 16, 2025
Watch- Jitesh Sharma humiliated; denied entry at Lord’s, Dinesh Karthik forced to rescue
July 16, 2025
Sanju Samson removed as franchise captain as CSK transfer nears
July 16, 2025
Virat Kohli’s jersey number 18 allotted to this Indian player
July 16, 2025
RCB’s troubles mount in Stampede case; High court orders State Government to…
July 16, 2025
Karnataka High Court orders state to share Chinnaswamy Stadium stampede report
July 15, 2025
Mohammed Shami, Ishan Kishan to be released by SRH ahead of IPL 2026 auction
July 15, 2025
Gametwist belote : Jeu gratuit en ligne avec des Twists
July 14, 2025
Kavya Maran’s SRH announces new bowling coach for IPL 2026
July 14, 2025
Nitish Kumar Reddy crumbles after constant ‘IPL’ sledging from Ex-SRH teammate Harry Brook
July 14, 2025
Sunrisers Hyderabad appoint Varun Aaron as new bowling coach ahead of IPL 2026
July 14, 2025
RCB veteran ditches team; picks IPL rivals to help
July 14, 2025
RCB’s main sponsor leaves after stampede incident; how will they pay Virat Kohli’s salary?
July 13, 2025
All IPL teams attack England Cricket after Shubman Gill-Zak Crawley episode, ECB responds
July 13, 2025
RCB ban from IPL sealed; judicial enquiry holds team responsible for Bengaluru stampede
July 12, 2025
Mayank Yadav set for miraculous comeback at Asia Cup 2025? Pacer set to begin rehab after surgery
July 12, 2025
Mitchell Starc shuts the door forever on his IPL career ahead of 100th Test for Australia
July 12, 2025
Yash Dayal sexual harassment case- RCB pacer goes 1 step forward
July 11, 2025
Five HCA members arrested for blackmailing SRH owner Kavya Maran
July 10, 2025
KKR scout drops big hint on Sanju Samson move amid IPL 2026 Trade Window chatter
July 10, 2025
RCB pacer leaves his team amid franchise turmoil
July 10, 2025
Sanju Samson-Venkatesh Iyer mega trade on the cards? KKR scout drops bombshell
July 10, 2025
Kavya Maran’s SRH linked with ₹2.32 crore scam as Hyderabad Cricket Association officials land in jail
July 10, 2025
Mumbai Indians and Lucknow Super Giants hunt down RCB player in IPL Trade Deal
July 10, 2025
Vaibhav Suryavanshi goes against India legend
July 10, 2025
Real villain behind Shubman Gill’s KKR exit OUT in public
July 10, 2025
Mohammad Azharuddin busts massive IPL ticket scam; BCCI ashamed
July 10, 2025
Not MI or CSK? Check out which team overtook traditional giants — full list of franchise valuations
July 9, 2025
Yash Dayal issues official statement on damaging sexual exploitation allegations
July 9, 2025
Phil Salt caught CHEATING on field in Vitality Blast! Anti-corruption unit steps in
July 9, 2025
RCB takes legal action in Stampede case; desperate moves initiated to avoid IPL ban
July 8, 2025
India’s fastest-ever pacer gets fully fit; Test debut vs England on the cards?
July 8, 2025
Royal Challengers Bengaluru brutally beats CSK again in this competition
July 8, 2025
Ravi Shastri exposes Dinesh Karthik for bootlicking Shubman Gill after releasing him from KKR
July 8, 2025
Yash Dayal Sexual Harassment Case- FIR filed against RCB Star, Sex Exploitation registered
July 8, 2025
3 teams that can spark bidding war for Wiaan Mulder
July 7, 2025
AB de Villiers shares blunt views on MS Dhoni: “Was very difficult to…”
July 7, 2025
“It’s very important to be…”: Former Indian opener warns IPL wonderkid Vaibhav Suryavanshi ahead of the 2026 edition
July 7, 2025
Pakistan banned from World Club Championship 2026; IPL participation officially ruled out
July 6, 2025
Rishabh Pant and Gautam Gambhir’s team politics caught on camera
July 6, 2025
Digvesh Rathi beaten by CSK discard for highest price in DPL Auction 2025
July 6, 2025
Vaibhav Suryavanshi’s entry in senior team India announced
July 6, 2025
RCB ban destined? Stampede victims level unhinged allegations; BCCI set for legal route!
July 6, 2025
Top 5 Players Who Have Won Most IPL Titles
July 6, 2025
3 reasons Sanju Samson could be traded from RR to CSK ahead of IPL 2026
July 5, 2025
Vaibhav Suryavanshi receives orders to stay away from..
July 5, 2025
Sanju Samson signed as the most expensive player by..
July 5, 2025
Sanju Samson confronted on CSK move; player responds
July 4, 2025
Sanjana Ganesan spills beans on Jasprit Bumrah’s unforgettable IPL proposal
July 4, 2025
Sanjana Ganesan spills beans on Jasprit Bumrah’s unforgettable IPL proposal
July 4, 2025
Test Post
July 3, 2025
Test Post
July 3, 2025
RCB ban inevitable! BCCI moves ahead with IPS complaint on stampede
July 3, 2025
Shashank Singh exposes Shreyas Iyer’s weakness in the latter’s house
July 3, 2025
Ravichandran Ashwin gives trial for Rajasthan Royals amid Sanju Samson’s transfer to CSK
July 3, 2025
Nitish Rana quits UP to play for Delhi Cricket; now BCCI bans him from..
July 3, 2025
3 teams that can target Sanju Samson during IPL 2026 Player Trade Window
July 3, 2025
Mohammed Shami’s Hasin Jahan vows to make his life hell after latest court order
July 3, 2025
Virat Kohli raided in London; conflict arises
July 3, 2025
SRH co-owner Kavya Maran finally reacts to viral IPL memes about her
July 2, 2025
Sanju Samson announced MS Dhoni’s successor in CSK
July 2, 2025
Not Shivam Dube!! 2 CSK players picked for Sanju Samson trade
July 2, 2025
Posted inIPL

England squad for 5th Test against India announced, CSK star included

On Monday, July 28, the England and Wales Cricket Board (ECB) announced the England squad for the fifth and final Test match of the series against the India National Cricket…
Continue Reading
Posted by Admin July 28, 2025
Posted inIPL

Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air

In the last week, speculation has swirled around promising Indian all-rounder Nitish Kumar Reddy and his future with Sunrisers Hyderabad (SRH), the Indian Premier League (IPL) franchise owned by Kavya…
Continue Reading
Posted by Admin July 28, 2025
Posted inIPL

Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad

The 22-year-old India National Cricket Team all-rounder Nitish Kumar Reddy has issued an official statement on the reports of leaving Sunrisers Hyderabad (SRH).In his statement, Nitish Kumar Reddy rubbished the…
Continue Reading
Posted by Admin July 27, 2025
Posted inIPL

Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026

In a shocking development, young Indian all-rounder Nitish Kumar Reddy is reportedly mulling over leaving Sunrisers Hyderabad (SRH) ahead of the next edition of the Indian Premier League (IPL). Despite…
Continue Reading
Posted by Admin July 27, 2025
Posted inIPL

MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?

West Indies cricket legend Dwayne Bravo has shared his views on the ongoing speculation around MS Dhoni's future in the Indian Premier League (IPL). With many fans and experts believing…
Continue Reading
Posted by Admin July 27, 2025
Posted inIPL

Bhuvneshwar Kumar breaks silence after RCB stampede case

Indian seamer Bhuvneshwar Kumar has finally broken his silence after the tragic stampede that unfolded near the M. Chinnaswamy Stadium in Bengaluru on June 4, 2025, during the celebration of…
Continue Reading
Posted by Admin July 27, 2025
England squad for 5th Test against India announced, CSK star included
Posted inIPL

England squad for 5th Test against India announced, CSK star included

On Monday, July 28, the England and Wales Cricket Board (ECB) announced the England squad for the fifth and final Test match of the series against the India National Cricket…
Posted by Admin July 28, 2025
Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air
Posted inIPL

Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air

In the last week, speculation has swirled around promising Indian all-rounder Nitish Kumar Reddy and his future with Sunrisers Hyderabad (SRH), the Indian Premier League (IPL) franchise owned by Kavya…
Posted by Admin July 28, 2025
Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad
Posted inIPL

Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad

The 22-year-old India National Cricket Team all-rounder Nitish Kumar Reddy has issued an official statement on the reports of leaving Sunrisers Hyderabad (SRH).In his statement, Nitish Kumar Reddy rubbished the…
Posted by Admin July 27, 2025
Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026
Posted inIPL

Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026

In a shocking development, young Indian all-rounder Nitish Kumar Reddy is reportedly mulling over leaving Sunrisers Hyderabad (SRH) ahead of the next edition of the Indian Premier League (IPL). Despite…
Posted by Admin July 27, 2025
MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?
Posted inIPL

MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?

West Indies cricket legend Dwayne Bravo has shared his views on the ongoing speculation around MS Dhoni's future in the Indian Premier League (IPL). With many fans and experts believing…
Posted by Admin July 27, 2025
Bhuvneshwar Kumar breaks silence after RCB stampede case
Posted inIPL

Bhuvneshwar Kumar breaks silence after RCB stampede case

Indian seamer Bhuvneshwar Kumar has finally broken his silence after the tragic stampede that unfolded near the M. Chinnaswamy Stadium in Bengaluru on June 4, 2025, during the celebration of…
Posted by Admin July 27, 2025
After Yash Dayal, Nitish Kumar Reddy faces colossal legal trouble
Posted inIPL

After Yash Dayal, Nitish Kumar Reddy faces colossal legal trouble

Amid the Yash Dayal saga, the star India National Cricket Team all-rounder Nitish Kumar Reddy has been caught in a legal storm, but for different reasons than the RCB pacer.Yash…
Posted by Admin July 26, 2025
[WATCH] ‘Was really hard to leave her’ – KL Rahul opens up on missing daughter during England tour
Posted inIPL

[WATCH] ‘Was really hard to leave her’ – KL Rahul opens up on missing daughter during England tour

Indian opener KL Rahul became emotional while speaking about his daughter, Evaarah, during the fourth Test between England and India at Old Trafford, Manchester. Rahul admitted it was difficult to…
Posted by Admin July 26, 2025
RCB in trouble? Bengaluru stampede sparks talk of ban on IPL 2025 winners
Posted inIPL

RCB in trouble? Bengaluru stampede sparks talk of ban on IPL 2025 winners

The euphoria that gripped Bengaluru following the Royal Challengers Bengaluru’s (RCB) historic maiden Indian Premier League (IPL) victory on June 4, 2025, has been tragically overshadowed by a deadly stampede.…
Posted by Admin July 25, 2025
RCB’s home ground, Chinnaswamy Stadium, banned from IPL
Posted inIPL

RCB’s home ground, Chinnaswamy Stadium, banned from IPL

According to the report of the judicial committee headed by Justice John Michael D'Cunha, the Chinnaswamy Stadium has been declared unsuitable to hold major events. If the government considers every…
Posted by Admin July 25, 2025

Posts pagination

1 2 3 … 200 Next page

Recent Posts

  • England squad for 5th Test against India announced, CSK star included
  • Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air
  • Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad
  • Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026
  • MS Dhoni’s IPL 2026 Participation Confirmed! What about Sanju Samson?
  • Bhuvneshwar Kumar breaks silence after RCB stampede case
  • After Yash Dayal, Nitish Kumar Reddy faces colossal legal trouble
  • [WATCH] ‘Was really hard to leave her’ – KL Rahul opens up on missing daughter during England tour
  • RCB in trouble? Bengaluru stampede sparks talk of ban on IPL 2025 winners
  • RCB’s home ground, Chinnaswamy Stadium, banned from IPL
Browse by Category
  • About us
  • Contact Us
  • Disclaimer
  • Cookies policy
  • Privacy policy
  • Terms and conditions
You May Have Missed
Posted inIPL

England squad for 5th Test against India announced, CSK star included

Posted by Admin July 28, 2025
Posted inIPL

Nitish Kumar Reddy to leave Kavya Maran owned SRH? All-rounder clears the air

Posted by Admin July 28, 2025
Posted inIPL

Nitish Kumar Reddy issues official statement on leaving Sunrisers Hyderabad

Posted by Admin July 27, 2025
Posted inIPL

Nitish Kumar Reddy leaves SRH after ugly fallout, set to join new team in IPL 2026

Posted by Admin July 27, 2025

Copyright 2025 — All rights reserved. ZtyIndia

Scroll to Top