}> */ public static function get(): array { return self::sanitize( get_option( Meta::OPTION_CATEGORY_DEFAULTS, array() ) ); } /** * Normalise la structure : clés term_id entières, `triman` booléen, composants Info-tri * filtrés. Les catégories sans aucun défaut utile sont écartées. * * @param mixed $raw Données brutes (option ou formulaire). * @return array}> */ public static function sanitize( $raw ): array { if ( ! is_array( $raw ) ) { return array(); } $clean = array(); foreach ( $raw as $term_id => $def ) { $term_id = (int) $term_id; if ( $term_id <= 0 || ! is_array( $def ) ) { continue; } $triman = ! empty( $def['triman'] ); $components = InfoTri::sanitize_components( $def['components'] ?? array() ); if ( ! $triman && empty( $components ) ) { continue; // Rien d'utile : on ne stocke pas une entrée vide. } $clean[ $term_id ] = array( 'triman' => $triman, 'components' => $components, ); } return $clean; } /** * Résout le défaut effectif pour les catégories d'un produit. * * Règle déterministe : `triman` vrai si une catégorie au moins l'active ; composants = * union des catégories, la première (ordre fourni) l'emporte en cas de conflit. * * @param array $term_ids Catégories du produit (ordonnées). * @param array}> $defaults Défauts par catégorie. * @return array{triman:bool, components:array} */ public static function for_terms( array $term_ids, array $defaults ): array { $triman = false; $components = array(); foreach ( $term_ids as $term_id ) { $term_id = (int) $term_id; if ( ! isset( $defaults[ $term_id ] ) ) { continue; } if ( ! empty( $defaults[ $term_id ]['triman'] ) ) { $triman = true; } foreach ( $defaults[ $term_id ]['components'] as $material => $consigne ) { if ( ! isset( $components[ $material ] ) ) { $components[ $material ] = $consigne; } } } return array( 'triman' => $triman, 'components' => $components, ); } }