WC_REST_Product_Variations_Controller::delete_unmatched_product_variations()privateWC 1.0

Deletes all unmatched variations (aka duplicates).

Method of the class: WC_REST_Product_Variations_Controller{}

No Hooks.

Return

Int. Number of deleted variations.

Usage

// private - for code of main (parent) class only
$result = $this->delete_unmatched_product_variations( $product );
$product(WC_Product) (required)
Variable product.

WC_REST_Product_Variations_Controller::delete_unmatched_product_variations() code WC 9.5.1

private function delete_unmatched_product_variations( $product ) {
	$deleted_count = 0;

	if ( ! $product ) {
		return $deleted_count;
	}

	$attributes = wc_list_pluck( array_filter( $product->get_attributes(), 'wc_attributes_array_filter_variation' ), 'get_slugs' );

	// Get existing variations so we don't create duplicates.
	$existing_variations = array_map( 'wc_get_product', $product->get_children() );

	$possible_attribute_combinations = array_reverse( wc_array_cartesian( $attributes ) );

	foreach ( $existing_variations as $existing_variation ) {
		$matching_attribute_key = array_search( $existing_variation->get_attributes(), $possible_attribute_combinations ); // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
		if ( false !== $matching_attribute_key ) {
			// We only want one possible variation for each possible attribute combination.
			unset( $possible_attribute_combinations[ $matching_attribute_key ] );
			continue;
		}
		$existing_variation->delete( true );
		$deleted_count ++;
	}

	return $deleted_count;
}