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);