/** * Helper: apply rules to a single product. * Multiple rules targeting the same label will append values as "Gold, Brushed". * If "Overwrite" is ticked on a rule, it replaces any existing value entirely. * * @param int $post_id */ function doup_clr_apply_rules_for_product( $post_id ) { $category_rules = get_option( 'doup_clr_category_rules', [] ); $attribute_rules = get_option( 'doup_clr_attribute_rules', [] ); $keyword_rules = get_option( 'doup_clr_keyword_rules', [] ); $product_rules = get_option( 'doup_clr_product_rules', [] ); if ( ! is_array( $category_rules ) ) $category_rules = []; if ( ! is_array( $attribute_rules ) ) $attribute_rules = []; if ( ! is_array( $keyword_rules ) ) $keyword_rules = []; if ( ! is_array( $product_rules ) ) $product_rules = []; if ( empty( $category_rules ) && empty( $attribute_rules ) && empty( $keyword_rules ) && empty( $product_rules ) ) { return; } $available_labels = doup_clr_get_available_labels(); // Load existing saved values $existing = []; foreach ( $available_labels as $label ) { $existing[ $label ] = get_post_meta( $post_id, $label, true ); } // Track values being built during this run (as arrays for deduplication) // Structure: [ 'custom_label_1' => [ 'Gold', 'Brushed' ], ... ] $pending = []; $product_title = get_the_title( $post_id ); $product_cat_ids = wp_get_post_terms( $post_id, 'product_cat', [ 'fields' => 'ids' ] ); if ( is_wp_error( $product_cat_ids ) ) $product_cat_ids = []; /** * Helper closure: add a value to pending for a label. * If overwrite is true, clears existing + pending and starts fresh. * Otherwise appends if not already present. */ $add_value = function( $label_key, $value, $overwrite ) use ( &$pending, &$existing ) { if ( '' === $value ) return; if ( $overwrite ) { // Overwrite clears everything for this label $pending[ $label_key ] = [ $value ]; $existing[ $label_key ] = ''; // treat existing as cleared } else { // Build on top of existing saved value if ( ! isset( $pending[ $label_key ] ) ) { // Seed pending from existing saved value if not yet touched this run $existing_val = $existing[ $label_key ]; if ( ! empty( $existing_val ) ) { $pending[ $label_key ] = array_map( 'trim', explode( ',', $existing_val ) ); } else { $pending[ $label_key ] = []; } } // Only append if value not already in the list if ( ! in_array( $value, $pending[ $label_key ], true ) ) { $pending[ $label_key ][] = $value; } } }; // --- Category rules --- foreach ( $category_rules as $rule ) { $term_id = isset( $rule['term_id'] ) ? (int) $rule['term_id'] : 0; $label_key = isset( $rule['label_key'] ) ? $rule['label_key'] : ''; $value = isset( $rule['value'] ) ? $rule['value'] : ''; $overwrite = ! empty( $rule['overwrite'] ); if ( $term_id <= 0 || ! in_array( $label_key, $available_labels, true ) ) continue; if ( ! in_array( $term_id, $product_cat_ids, true ) ) continue; $add_value( $label_key, $value, $overwrite ); } // --- Keyword rules --- foreach ( $keyword_rules as $rule ) { $keyword = isset( $rule['keyword'] ) ? $rule['keyword'] : ''; $label_key = isset( $rule['label_key'] ) ? $rule['label_key'] : ''; $value = isset( $rule['value'] ) ? $rule['value'] : ''; $overwrite = ! empty( $rule['overwrite'] ); if ( '' === $keyword || ! in_array( $label_key, $available_labels, true ) ) continue; if ( stripos( $product_title, $keyword ) === false ) continue; $add_value( $label_key, $value, $overwrite ); } // --- Attribute rules --- if ( ! empty( $attribute_rules ) ) { $tax_map = []; $taxes_to_check = array_unique( array_filter( array_column( $attribute_rules, 'tax_slug' ) ) ); foreach ( $taxes_to_check as $tax_slug ) { $slugs = doup_clr_get_product_term_slugs( $post_id, $tax_slug ); if ( ! empty( $slugs ) ) { $tax_map[ $tax_slug ] = $slugs; } } foreach ( $attribute_rules as $rule ) { $tax_slug = isset( $rule['tax_slug'] ) ? $rule['tax_slug'] : ''; $term_slug = isset( $rule['term_slug'] ) ? $rule['term_slug'] : ''; $label_key = isset( $rule['label_key'] ) ? $rule['label_key'] : ''; $value = isset( $rule['value'] ) ? $rule['value'] : ''; $overwrite = ! empty( $rule['overwrite'] ); if ( '' === $tax_slug || '' === $term_slug || '' === $label_key || '' === $value ) continue; if ( ! in_array( $label_key, $available_labels, true ) ) continue; if ( ! isset( $tax_map[ $tax_slug ] ) || ! in_array( $term_slug, $tax_map[ $tax_slug ], true ) ) continue; $add_value( $label_key, $value, $overwrite ); } } // --- Product-specific rules --- foreach ( $product_rules as $rule ) { $product_id = isset( $rule['product_id'] ) ? (int) $rule['product_id'] : 0; $label_key = isset( $rule['label_key'] ) ? $rule['label_key'] : ''; $value = isset( $rule['value'] ) ? $rule['value'] : ''; $overwrite = ! empty( $rule['overwrite'] ); if ( $product_id !== $post_id ) continue; if ( ! in_array( $label_key, $available_labels, true ) ) continue; $add_value( $label_key, $value, $overwrite ); } // --- Write all pending values to post meta --- foreach ( $pending as $label_key => $values ) { if ( empty( $values ) ) continue; $final = implode( ', ', array_unique( array_filter( $values ) ) ); update_post_meta( $post_id, $label_key, $final ); } }