JezK
Edit File: Breadcrumbs.php
<?php declare( strict_types = 1 ); namespace Automattic\WooCommerce\Blocks\BlockTypes; use Automattic\WooCommerce\Blocks\Utils\StyleAttributesUtils; use WP_Block; /** * Breadcrumbs class. */ class Breadcrumbs extends AbstractBlock { /** * Block name. * * @var string */ protected $block_name = 'breadcrumbs'; /** * Render the block. * * @param array $attributes Block attributes. * @param string $content Block content. * @param WP_Block $block Block instance. * * @return string | void Rendered block output. */ protected function render( $attributes, $content, $block ) { ob_start(); woocommerce_breadcrumb(); $breadcrumb = ob_get_clean(); if ( ! $breadcrumb ) { return; } $classes_and_styles = StyleAttributesUtils::get_classes_and_styles_by_attributes( $attributes, array(), array( 'font_size' ) ); $font_size_classes_and_styles = $this->get_font_size_classes_and_styles( $attributes, $block ); $classes_and_styles['classes'] = $classes_and_styles['classes'] . ' ' . ( $font_size_classes_and_styles['class'] ?? '' ) . ' '; $classes_and_styles['styles'] = $classes_and_styles['styles'] . ' ' . ( $font_size_classes_and_styles['style'] ?? '' ) . ' '; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => 'woocommerce wc-block-breadcrumbs ' . trim( $classes_and_styles['classes'] ), 'style' => trim( $classes_and_styles['styles'] ), ) ); $has_non_small_custom_font_size = strpos( $font_size_classes_and_styles['class'] ?? '', 'has-small-font-size' ) === false; // Remove the default 'has-small-font-size' class when the block has a custom font size different from small. // This is needed because the block.json defines a default font size, which is considered an anti-pattern // since styles should be defined by themes and plugins instead. if ( $has_non_small_custom_font_size ) { $wrapper_attributes = str_replace( 'has-small-font-size', '', $wrapper_attributes ); } return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $breadcrumb ); } /** * Get the frontend script handle for this block type. * * @param string $key Data to get, or default to everything. */ protected function get_block_type_script( $key = null ) { return null; } /** * Gets font size classes and styles for the breadcrumbs block. * * @param array $attributes The block attributes. * @param WP_Block $block The block instance. * @return array The font size classes and styles. */ private function get_font_size_classes_and_styles( array $attributes, $block ) { $custom_font_size = $attributes['style']['typography']['fontSize'] ?? ''; if ( '' !== $custom_font_size ) { return array( 'class' => null, 'style' => sprintf( 'font-size: %s;', $custom_font_size ), ); } $explicit_font_size = isset( $block->parsed_block['attrs']['fontSize'] ) ? $block->parsed_block['attrs']['fontSize'] : null; if ( is_string( $explicit_font_size ) && '' !== $explicit_font_size ) { return array( 'class' => sprintf( 'has-font-size has-%s-font-size', $explicit_font_size ), 'style' => null, ); } $theme_font_size_classes_and_styles = $this->get_theme_font_size_classes_and_styles(); if ( $theme_font_size_classes_and_styles['class'] || $theme_font_size_classes_and_styles['style'] ) { return $theme_font_size_classes_and_styles; } $font_size = $attributes['fontSize'] ?? ''; if ( $font_size ) { return array( 'class' => sprintf( 'has-font-size has-%s-font-size', $font_size ), 'style' => null, ); } return array( 'class' => null, 'style' => null, ); } /** * Gets font size classes and styles from theme.json block styles. * * @return array The font size classes and styles. */ private function get_theme_font_size_classes_and_styles() { $theme_font_size = wp_get_global_styles( array( 'blocks', 'woocommerce/breadcrumbs', 'typography', 'fontSize' ) ); if ( ! is_string( $theme_font_size ) || '' === $theme_font_size ) { return array( 'class' => null, 'style' => null, ); } $preset_prefix = 'var(--wp--preset--font-size--'; if ( str_starts_with( $theme_font_size, $preset_prefix ) ) { $slug = rtrim( substr( $theme_font_size, strlen( $preset_prefix ) ), ')' ); return array( 'class' => sprintf( 'has-font-size has-%s-font-size', $slug ), 'style' => null, ); } return array( 'class' => null, 'style' => sprintf( 'font-size: %s;', $theme_font_size ), ); } }