, * }, * price: array{ * visible: bool, * label: string|null, * amount: string|null, * currency: string|null, * observed_at_label: string|null, * disclaimer_required: bool, * }, * availability: array{ * visible: bool, * status: string, * label: string|null, * }, * buttons: list, * badges: list, * disclaimers: list, * meta: array{ * show_brand: bool, * show_description: bool, * show_price: bool, * show_provider_badge: bool, * }, * classes: array{root: string, image: string, body: string, title: string, price: string, buttons: string}, * is_fallback: bool, * _render_meta: array{ * surface: string, * locale: string|null, * request_id: string|null, * is_amp: bool, * is_feed: bool, * tracking_enabled: bool, * lazy_load_enabled: bool, * debug: bool, * }, * } * * Output rules (per `specifications/rendering-and-template-spec.md`): * * - §10 / §15: BEM class strings come pre-tokenized in * `$viewModel['classes']`. The template stamps them verbatim * and never synthesizes its own modifier strings. * - §13.3: Optional sections degrade gracefully — a null / * empty primary image, empty buttons list, hidden price, * hidden availability, empty disclaimers, or empty badges * simply omits the corresponding region. * - §20: The image link is decorative (`tabindex="-1"`, * `aria-hidden="true"`); the title link is the canonical * focusable detail-page link. * - All dynamic output is escaped with `esc_html` / * `esc_attr` / `esc_url`. The $viewModel array is treated * as read-only by convention. * * The template exits on direct file access and also returns silently * when its single contract input is missing or has the wrong type. * * @package Affilun * * @var array $viewModel §8.2 array shape with `_render_meta` attached. */ if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! isset( $viewModel ) || ! is_array( $viewModel ) ) { return; } $affilun_classes = ( isset( $viewModel['classes'] ) && is_array( $viewModel['classes'] ) ) ? $viewModel['classes'] : array(); $affilun_product = ( isset( $viewModel['product'] ) && is_array( $viewModel['product'] ) ) ? $viewModel['product'] : array(); $affilun_images = ( isset( $viewModel['images'] ) && is_array( $viewModel['images'] ) ) ? $viewModel['images'] : array(); $affilun_price = ( isset( $viewModel['price'] ) && is_array( $viewModel['price'] ) ) ? $viewModel['price'] : array(); $affilun_availability = ( isset( $viewModel['availability'] ) && is_array( $viewModel['availability'] ) ) ? $viewModel['availability'] : array(); $affilun_buttons = ( isset( $viewModel['buttons'] ) && is_array( $viewModel['buttons'] ) ) ? $viewModel['buttons'] : array(); $affilun_badges = ( isset( $viewModel['badges'] ) && is_array( $viewModel['badges'] ) ) ? $viewModel['badges'] : array(); $affilun_disclaimers = ( isset( $viewModel['disclaimers'] ) && is_array( $viewModel['disclaimers'] ) ) ? $viewModel['disclaimers'] : array(); $affilun_meta = ( isset( $viewModel['meta'] ) && is_array( $viewModel['meta'] ) ) ? $viewModel['meta'] : array(); $affilun_render_meta = ( isset( $viewModel['_render_meta'] ) && is_array( $viewModel['_render_meta'] ) ) ? $viewModel['_render_meta'] : array(); $affilun_root_class = isset( $affilun_classes['root'] ) ? (string) $affilun_classes['root'] : 'affilun-card'; $affilun_image_class = isset( $affilun_classes['image'] ) ? (string) $affilun_classes['image'] : 'affilun-card__image'; $affilun_body_class = isset( $affilun_classes['body'] ) ? (string) $affilun_classes['body'] : 'affilun-card__body'; $affilun_title_class = isset( $affilun_classes['title'] ) ? (string) $affilun_classes['title'] : 'affilun-card__title'; $affilun_price_class = isset( $affilun_classes['price'] ) ? (string) $affilun_classes['price'] : 'affilun-card__price'; $affilun_buttons_class = isset( $affilun_classes['buttons'] ) ? (string) $affilun_classes['buttons'] : 'affilun-card__buttons'; $affilun_locale = ( isset( $affilun_render_meta['locale'] ) && is_string( $affilun_render_meta['locale'] ) && $affilun_render_meta['locale'] !== '' ) ? $affilun_render_meta['locale'] : null; $affilun_primary_image = ( isset( $affilun_images['primary'] ) && is_array( $affilun_images['primary'] ) ) ? $affilun_images['primary'] : null; $affilun_detail_url = isset( $affilun_product['detail_url'] ) ? (string) $affilun_product['detail_url'] : ''; $affilun_affiliate_url = isset( $affilun_product['affiliate_url'] ) ? (string) $affilun_product['affiliate_url'] : ''; $affilun_link_url = $affilun_affiliate_url !== '' ? $affilun_affiliate_url : $affilun_detail_url; $affilun_product_id = isset( $affilun_product['id'] ) ? (string) $affilun_product['id'] : ''; $affilun_title = ( isset( $affilun_product['title'] ) ) ? (string) $affilun_product['title'] : ''; $affilun_provider = isset( $affilun_product['provider'] ) ? (string) $affilun_product['provider'] : ''; $affilun_provider_lbl = ( isset( $affilun_product['provider_label'] ) && is_string( $affilun_product['provider_label'] ) && $affilun_product['provider_label'] !== '' ) ? $affilun_product['provider_label'] : null; $affilun_brand = ( isset( $affilun_product['brand'] ) && is_string( $affilun_product['brand'] ) && $affilun_product['brand'] !== '' ) ? $affilun_product['brand'] : null; $affilun_description = ( isset( $affilun_product['description'] ) && is_string( $affilun_product['description'] ) && $affilun_product['description'] !== '' ) ? $affilun_product['description'] : null; $affilun_show_provider_badge = ! empty( $affilun_meta['show_provider_badge'] ); $affilun_show_brand = ! empty( $affilun_meta['show_brand'] ); $affilun_show_description = ! empty( $affilun_meta['show_description'] ); $affilun_price_visible = ! empty( $affilun_price['visible'] ); $affilun_price_label = ( isset( $affilun_price['label'] ) && is_string( $affilun_price['label'] ) ) ? $affilun_price['label'] : ''; $affilun_price_observed_at = ( isset( $affilun_price['observed_at_label'] ) && is_string( $affilun_price['observed_at_label'] ) && $affilun_price['observed_at_label'] !== '' ) ? $affilun_price['observed_at_label'] : null; $affilun_availability_visible = ! empty( $affilun_availability['visible'] ); $affilun_availability_label = ( isset( $affilun_availability['label'] ) && is_string( $affilun_availability['label'] ) && $affilun_availability['label'] !== '' ) ? $affilun_availability['label'] : null; $affilun_availability_status = isset( $affilun_availability['status'] ) ? (string) $affilun_availability['status'] : 'unknown'; $affilun_lang_attr = ( $affilun_locale !== null ) ? ' lang="' . esc_attr( $affilun_locale ) . '"' : ''; ?>