get_meta( Meta::PRODUCT_TRIMAN ),
$product->get_meta( Meta::PRODUCT_INFOTRI ),
$product->get_category_ids(),
CategoryDefaults::get()
);
$triman = $effective['triman'];
$components = $effective['components'];
$materials = InfoTri::materials();
$consignes = InfoTri::consignes();
$items = '';
foreach ( $components as $material => $consigne ) {
if ( ! isset( $materials[ $material ], $consignes[ $consigne ] ) ) {
continue;
}
// Pictogramme maison décoratif (teinté en CSS via mask) ; le texte porte l'information.
$items .= sprintf(
'
%2$s : %3$s',
esc_attr( $consigne ),
esc_html( $materials[ $material ] ),
esc_html( $consignes[ $consigne ] )
);
}
// Rien de valide à afficher : aucun encart (jamais d'état vide).
if ( ! $triman && '' === $items ) {
return '';
}
// Pictogrammes maison (assets/img/, teintés en CSS) — on ne reproduit jamais la signalétique
// officielle Triman/Info-tri (mark protégé, charte producteur ; cf. docs/regulatory/).
$html = '';
$html .= '
' . esc_html__( 'Tri & recyclage', 'agec-ready' ) . '
';
if ( $triman ) {
// Terme légal exact (L.541-9-3 : le produit « fait l'objet de règles de tri ») — décision
// documentée dans docs/regulatory/emballages.md §Signalétique (QR-10).
$html .= '
' . esc_html__( 'Cet emballage fait l’objet de règles de tri (Triman).', 'agec-ready' ) . '
';
}
if ( '' !== $items ) {
$html .= '
';
}
$html .= '
';
return $html;
}
/**
* Résout le tri effectif d'un produit (le niveau produit gagne ; à défaut, héritage des catégories).
*
* Logique pure (primitives) → réutilisée par l'affichage (html) ET le scan catalogue (CatalogScan), DRY.
*
* @param bool $own_triman Triman propre au produit.
* @param mixed $own_infotri Meta Info-tri propre (peut être '' si jamais renseignée).
* @param array $category_ids Catégories du produit.
* @param array}> $defaults Défauts par catégorie.
* @return array{triman:bool, components:array}
*/
public static function resolve( bool $own_triman, $own_infotri, array $category_ids, array $defaults ): array {
$triman = $own_triman;
$components = InfoTri::sanitize_components( is_array( $own_infotri ) ? $own_infotri : array() );
if ( ! $triman && empty( $components ) ) {
$inherited = CategoryDefaults::for_terms( $category_ids, $defaults );
$triman = $inherited['triman'];
$components = $inherited['components'];
}
return array(
'triman' => $triman,
'components' => $components,
);
}
}