resolveCardRenderer( $registry ); $renderer = new ProductShortcodeRenderer( static fn ( array $attributes ): string => $cardRenderer->render( $attributes ) ); $this->renderer = $renderer; $registry->bind( self::BINDING_PRODUCT_SHORTCODE_RENDERER, $renderer ); $key = AmazonDiscountServiceProvider::BINDING_SHORTCODE_RENDERER; if ( $registry->has( $key ) ) { $value = $registry->get( $key ); if ( $value instanceof AmazonDiscountShortcodeRenderer ) { $this->amazonDiscountRenderer = $value; } } } /** * Wire shortcode registration onto init. * * @param HookRegistrar $hooks Hooks. */ public function boot( HookRegistrar $hooks ): void { $hooks->addAction( 'init', array( $this, 'onInit' ) ); } /** * Register shortcodes with WordPress. */ public function onInit(): void { if ( $this->renderer === null || ! function_exists( 'add_shortcode' ) ) { return; } add_shortcode( 'affilun_product_card', array( $this->renderer, 'renderCardShortcode' ) ); if ( $this->amazonDiscountRenderer !== null ) { add_shortcode( 'affilun_amazon_discounts', array( $this->amazonDiscountRenderer, 'renderShortcode' ) ); } } /** * Resolve card block renderer. * * @param ServiceProviderRegistry $registry Registry. * * @throws LogicException When the renderer binding is missing or invalid. */ private function resolveCardRenderer( ServiceProviderRegistry $registry ): ProductCardBlockRenderer { $key = BlockServiceProvider::BINDING_PRODUCT_CARD_BLOCK_RENDERER; if ( ! $registry->has( $key ) ) { throw new LogicException( 'ShortcodeServiceProvider requires BlockServiceProvider card renderer.' ); } $renderer = $registry->get( $key ); if ( ! $renderer instanceof ProductCardBlockRenderer ) { throw new LogicException( 'ShortcodeServiceProvider expected ProductCardBlockRenderer.' ); } return $renderer; } }