'1', 'dpp_position' => 'tab', ]; /** * @var array */ private array $settings; public function __construct() { $this->settings = self::settings(); } /** * Saved settings over the defaults. * * @return array */ public static function settings(): array { $raw = get_option(self::OPTION); return array_merge(self::DEFAULTS, is_array($raw) ? $raw : []); } public function isEnabled(): bool { return ! empty($this->settings['enabled']); } public function registerHooks(): void { if (! $this->isEnabled()) { return; } $position = (string) ($this->settings['dpp_position'] ?? 'tab'); if ($position === 'summary') { add_action('woocommerce_single_product_summary', [$this, 'renderPassportSummary'], 28); } else { add_filter('woocommerce_product_tabs', [$this, 'registerPassportTab']); } add_filter('woocommerce_structured_data_product', [$this, 'extendStructuredData'], 10, 2); } public function getPassportData(\WC_Product $product): PassportData { $raw = $product->get_meta(self::META_PASSPORT_DATA, true); return new PassportData(is_array($raw) ? $raw : []); } public function renderPassportSummary(): void { global $product; if (! $product instanceof \WC_Product) { return; } $dpp = $this->getPassportData($product); if (! $dpp->hasData()) { return; } $this->renderPassportHtml($dpp); } /** * @param array $tabs * @return array */ public function registerPassportTab(array $tabs): array { global $product; if (! $product instanceof \WC_Product) { return $tabs; } $dpp = $this->getPassportData($product); if (! $dpp->hasData()) { return $tabs; } $tabs['pasporto_dpp'] = [ 'title' => __('Digital Product Passport (DPP)', 'pasporto'), 'priority' => 40, 'callback' => function () use ($dpp): void { $this->renderPassportHtml($dpp); }, ]; return $tabs; } public function renderPassportHtml(PassportData $dpp): void { ?>

getUniqueId() !== '') : ?> getPrimaryMaterial() !== '') : ?> getRecycledContentPercent() !== null) : ?> getCarbonFootprintKg() !== null) : ?> getCircularityClass() !== '') : ?> getConformityDocUrl() !== '') : ?>
getUniqueId()); ?>
getPrimaryMaterial()); ?>
getRecycledContentPercent()); ?>%
getCarbonFootprintKg()); ?> kg CO2e
getCircularityClass()); ?>
↗
getPassportUrl() !== '') : ?> ↗
getPassportData($product); if (! $dpp->hasData()) { return $markup; } if ($dpp->getUniqueId() !== '' && empty($markup['identifier'])) { $markup['identifier'] = $dpp->getUniqueId(); } $props = $dpp->additionalProperties(); if ($props !== []) { $existing = isset($markup['additionalProperty']) && is_array($markup['additionalProperty']) ? $markup['additionalProperty'] : []; $markup['additionalProperty'] = array_merge($existing, $props); } return $markup; } /** * A duplicated product is a different product: its identifier and passport * link must not be copied from the original. * * @param mixed $duplicate */ public function clearIdentityOnDuplicate($duplicate): void { if (! $duplicate instanceof \WC_Product) { return; } $raw = $duplicate->get_meta(self::META_PASSPORT_DATA, true); if (! is_array($raw) || $raw === []) { return; } $raw['unique_id'] = ''; $raw['passport_url'] = ''; $duplicate->update_meta_data(self::META_PASSPORT_DATA, $raw); $duplicate->save_meta_data(); } }