Check custom condition (attribute + category)

Validate a custom condition involving attributes and categories.

add_filter('advanced_woo_discount_rules_is_conditions_passed', function($result, $rule_object, $current_rule_object){
	//rule id 51 -> you can change yours
	if(in_array($rule_object->getId(),array(51)) && class_exists('\Wdr\App\Helpers\Woocommerce') && class_exists('\Wdr\App\Helpers\Filter')){
		$cart_items = \Wdr\App\Helpers\Woocommerce::getCart();
		$conditions = $rule_object->getConditions();
		
		foreach ($cart_items as $cart_item) {
			 $product = isset($cart_item['data']) ? $cart_item['data'] : array();
			 $get_product_category_id = \Wdr\App\Helpers\Woocommerce::getProductCategories($product);
			 $status = array();
			 foreach ($conditions as $condition) {
                $type = isset($condition->type) ? $condition->type : NULL;
                $options = isset($condition->options) ? $condition->options : array();
				$operator = isset($options->operator) ? $options->operator : array();
				$rule_selected_value = isset($options->value) ? $options->value : array();
				$cartqty = isset($options->cartqty) ? $options->cartqty : array();
				$qty = isset($options->qty) ? $options->qty : array();
				if(!empty($type) && $type == 'cart_item_product_category'){
					  $is_product_in_category = count(array_intersect($get_product_category_id, $rule_selected_value)) > 0;
					if ('in_list' === $operator) {
						$status[] =  ($is_product_in_category) ? 'true' : 'false';
					} elseif ('not_in_list' === $operator) {
						$status[] = (!$is_product_in_category) ? 'true' : 'false';
					}else{
						$status[] = 'false';
					}
				 }
				 if(!empty($type) && $type == 'cart_item_product_attributes'){
					 
					 $attrs = \Wdr\App\Helpers\Woocommerce::getProductAttributes($product);
        			 $attr_ids = array();
					 if (\Wdr\App\Helpers\Woocommerce::productTypeIs($product, 'variation')) {
						if (count(array_filter($attrs)) < count($attrs)) {
							if (isset($cart_item['variation'])) {
								$attrs = array();
								foreach ($cart_item['variation'] as $attribute_name => $value) {
									$attrs[str_replace('attribute_', '', $attribute_name)] = $value;
								}
							}
					    }
						$product_variation = \Wdr\App\Helpers\Woocommerce::getProduct(\Wdr\App\Helpers\Woocommerce::getProductParentId($product));
						foreach ($attrs as $taxonomy => $value) {
							if ($value) {
								$taxonomy = urldecode($taxonomy);
								$term_obj = get_term_by('slug', $value, $taxonomy);
								if (!is_wp_error($term_obj) && $term_obj && $term_obj->name) {
									$attr_ids = array_merge($attr_ids, (array)($term_obj->term_id));
								}
							} else {
								$attrs_variation = \Wdr\App\Helpers\Woocommerce::getProductAttributes($product_variation);
								foreach ($attrs_variation as $attr) {
									if ($taxonomy == \Wdr\App\Helpers\Woocommerce::getAttributeName($attr))
										$attr_ids = array_merge($attr_ids, \Wdr\App\Helpers\Woocommerce::getAttributeOption($attr));
								}
							}
						}
						if(!empty($product_variation)){
							$attributes_parent = \Wdr\App\Helpers\Woocommerce::getProductAttributes($product_variation);
							foreach ($attributes_parent as $attributes){
								if(!empty($attributes) && is_object($attributes)){
									$variation = \Wdr\App\Helpers\Woocommerce::getAttributeVariation($attributes);
									if(!(int)$variation){
										$options = \Wdr\App\Helpers\Woocommerce::getAttributeOption($attributes);

										if(!empty($options) && is_array($options)){
											$attr_ids = array_merge($attr_ids, $options);
										}
									}
								} else {
									$options = \Wdr\App\Helpers\Woocommerce::getAttributeOption($attributes);
									if(!empty($options) && is_array($options)){
										$attr_ids = array_merge($attr_ids, $options);
									}
								}
							}
						}
					} else {
						foreach ($attrs as $attr) {
							$attr_ids = array_merge($attr_ids, \Wdr\App\Helpers\Woocommerce::getAttributeOption($attr));
						}
					}
					 
					$attr_ids = array_unique($attr_ids);
					$is_product_has_attrs = count(array_intersect($attr_ids, $rule_selected_value)) > 0;
					
					if ('in_list' === $operator) {
						$status[] =  ($is_product_has_attrs) ? 'true' : 'false';
					} elseif ('not_in_list' === $operator) {
						$status[] = (!$is_product_has_attrs) ? 'true' : 'false';
					}else{
						$status[] = 'false';
					}
					 
				 }
			}
			if (count(array_unique($status)) === 1 && end($status) === 'true') {
				return true;
			}
		}
	}
	return $result;
}, 10, 3);