if (!empty($query_arguments['tax_query']['include'])) { $query_arguments['tax_query']['include']['relation'] = 'or'; } if (!empty($query_arguments['tax_query']['exclude'])) { $query_arguments['tax_query']['exclude']['relation'] = 'or'; } if (!empty($query_arguments['tax_query'])) { $query_arguments['tax_query']['relation'] = 'and'; } } } /** * Create Tags query arguments * @param $query_arguments * @param $tags * @param $exclude_tags * @param $all_products */ function setTagsQueryArguments(&$query_arguments, $tags, $exclude_tags, $all_products) { $this->removeDuplicateValuesInArray($tags, $exclude_tags); if (!empty($tags) && empty($all_products)) { $tags = array_map('absint', $tags); $query_arguments['tax_query']['include'][] = array( 'taxonomy' => 'product_tag', 'terms' => $tags, 'field' => 'term_id', 'operator' => 'IN', ); } if (!empty($exclude_tags)) { $exclude_tags = array_map('absint', $exclude_tags); $query_arguments['tax_query']['exclude'][] = array( 'taxonomy' => 'product_tag', 'terms' => $exclude_tags, 'field' => 'term_id', 'operator' => 'NOT IN', ); } } /** * Create Tags query arguments * @param $query_arguments * @param $taxonomies * @param $exclude_taxonomies * @param $all_products */ function setCustomTaxonomyQueryArguments(&$query_arguments, $taxonomies, $exclude_taxonomies, $all_products) { $this->removeDuplicateValuesInArray($taxonomies, $exclude_taxonomies); if (!empty($taxonomies) && empty($all_products)) { foreach ($taxonomies as $taxonomy => $values) { $values = array_map('absint', $values); $query_arguments['tax_query']['include'][] = array( 'taxonomy' => $taxonomy, 'terms' => $values, 'field' => 'term_id', 'operator' => 'IN', ); } } if (!empty($exclude_taxonomies)) { foreach ($exclude_taxonomies as $taxonomy => $values) { $values = array_map('absint', $values); $query_arguments['tax_query']['include'][] = array( 'taxonomy' => $taxonomy, 'terms' => $values, 'field' => 'term_id', 'operator' => 'NOT IN', ); } } } /** * Create Category query arguments * @param $query_arguments * @param $categories * @param $exclude_categories * @param $all_products */ function setCategoriesQueryArguments(&$query_arguments, $categories, $exclude_categories, $all_products) { $this->removeDuplicateValuesInArray($categories, $exclude_categories); if (!empty($categories) && empty($all_products)) { $categories = array_map('absint', $categories); $query_arguments['tax_query']['include'][] = array( 'taxonomy' => 'product_cat', 'terms' => $categories, 'field' => 'term_id', 'operator' => 'IN', 'include_children' => true ); } if (!empty($exclude_categories)) { $exclude_categories = array_map('absint', $exclude_categories); $query_arguments['tax_query']['exclude'][] = array( 'taxonomy' => 'product_cat', 'terms' => $exclude_categories, 'field' => 'term_id', 'operator' => 'NOT IN', 'include_children' => true ); } } /** * Remove duplicate value by comparing 2 different array * @param $array_1 * @param $array_2 * @param int $remove_from */ function removeDuplicateValuesInArray(&$array_1, &$array_2, $remove_from = 2) { $duplicate_values = array_intersect($array_1, $array_2); if ($remove_from == 2) { $array_2 = array_diff($array_2, $duplicate_values); } else { $array_1 = array_diff($array_1, $duplicate_values); } } /** * Set attributes query args. * @param $query_arguments * @param $attributes * @param $exclude_attributes * @param $all_products */ protected function setAttributesQueryArguments(&$query_arguments, $attributes, $exclude_attributes, $all_products) { if (!empty($attributes) && empty($all_products)) { $attributes = array_map('absint', $attributes); foreach ($attributes as $attribute) { $data = get_term($attribute); if (!empty($data)) { $taxonomy = $data->taxonomy; $query_arguments['tax_query']['include'][$taxonomy] = array( 'taxonomy' => $taxonomy, 'field' => 'term_id', 'operator' => 'IN' ); $query_arguments['tax_query']['include'][$taxonomy]['terms'][] = $attribute; } } } if (!empty($exclude_attributes)) { $exclude_attributes = array_map('absint', $exclude_attributes); foreach ($exclude_attributes as $attribute) { $data = get_term($attribute); if (!empty($data)) { $taxonomy = $data->taxonomy; $query_arguments['tax_query']['exclude'][$taxonomy] = array( 'taxonomy' => $taxonomy, 'field' => 'term_id', 'operator' => 'NOT IN' ); $query_arguments['tax_query']['exclude'][$taxonomy]['terms'][] = $attribute; } } } } function modifyFilterArguments(&$query_arguments, $order_by) { switch ($order_by) { default: $meta_key = NULL; $order = 'asc'; $order_by = 'title'; break; case 'popularity': $meta_key = ''; $order = 'asc'; $order_by = 'post_views'; break; case 'price': case 'low_to_high': $meta_key = '_price'; $order = 'asc'; $order_by = 'meta_value_num'; break; case 'price-desc': case 'high_to_low': $meta_key = '_price'; $order = 'desc'; $order_by = 'meta_value_num'; break; case 'date': case 'newness': $meta_key = NULL; $order = 'desc'; $order_by = 'date'; break; case 'rating': $meta_key = NULL; $order = 'desc'; $order_by = 'rating'; break; } $query_arguments['orderby'] = $order_by; $query_arguments['order'] = $order; if (!empty($meta_key)) { $query_arguments['meta_key'] = $meta_key; } } /** * Show sale items by short code * @param $short_code_attributes * @return string */ function saleItemsList($short_code_attributes) { if (!empty(self::$available_rules)) { global $woocommerce_loop; $short_code_attributes = shortcode_atts(array( 'per_page' => 12, 'columns' => 3, 'orderby' => 'title', 'do_pagination' => 1, 'order' => 'asc' ), $short_code_attributes); $paged = $this->input->get('product-page', 1); $order_by = $this->input->get('orderby', 'title'); ob_start(); $onsale_list = OnSaleShortCode::getOnSaleList(); if(!empty($onsale_list)){ $query_arguments = array( 'post_type' => 'product', 'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => $short_code_attributes['per_page'], 'orderby' => $short_code_attributes['orderby'], 'order' => $short_code_attributes['order'], ); if($onsale_list['has_store_wide']){ if (!empty($onsale_list['list'])) { $query_arguments['post__not_in'] = $onsale_list['list']; } } else { if (!empty($onsale_list['list'])) { $query_arguments['post__in'] = $onsale_list['list']; } } // Exclude_out_of_stock_products_for_on_sale_page $exclude_out_of_stock_products_for_on_sale_page = self::$config->getConfig('exclude_out_of_stock_products_for_on_sale_page', apply_filters('advanced_woo_discount_rules_exclude_out_of_stock_product_on_sale_page', 0)); if(!empty($exclude_out_of_stock_products_for_on_sale_page)){ $exclude_out_of_stock = array('meta_query' => array( array( 'key' => '_stock_status', 'value' => 'instock' ), array( 'key' => '_backorders', 'value' => 'no' ), )); $query_arguments = array_merge($query_arguments, $exclude_out_of_stock); } } else { $query_arguments = array(); } $products = new \WP_Query($query_arguments); $columns = absint($short_code_attributes['columns']); $woocommerce_loop['columns'] = $columns; if ($products->have_posts()) { self::$woocommerce_helper->setLoopProperties('is_shortcode', true); self::$woocommerce_helper->setLoopProperties('is_paginated', (!empty($short_code_attributes['do_pagination']))); self::$woocommerce_helper->setLoopProperties('per_page', $short_code_attributes['per_page']); self::$woocommerce_helper->setLoopProperties('current_page', $paged); $total = $products->found_posts; self::$woocommerce_helper->setLoopProperties('total', $total); $total_pages = ceil($total / $short_code_attributes['per_page']); self::$woocommerce_helper->setLoopProperties('total_pages', $total_pages); do_action('woocommerce_before_shop_loop'); self::$woocommerce_helper->productLoopStart(); while ($products->have_posts()) { $products->the_post(); wc_get_template_part('content', 'product'); } self::$woocommerce_helper->productLoopEnd(); do_action('woocommerce_after_shop_loop'); // woocommerce_pagination(); wp_reset_postdata(); } else { do_action('woocommerce_no_products_found'); } return '
' . ob_get_clean() . '
'; } return NULL; } /** * Show sale items by short code * @param $short_code_attributes * @return string */ function saleItemsList_old($short_code_attributes) { if (!empty(self::$available_rules)) { global $woocommerce_loop; $short_code_attributes = shortcode_atts(array( 'per_page' => 12, 'columns' => 3, 'orderby' => 'title', 'do_pagination' => 1, 'order' => 'asc' ), $short_code_attributes); $paged = $this->input->get('product-page', 1); $order_by = $this->input->get('orderby', 'title'); $exclude_categories = $exclude_products = $exclude_tags = $exclude_attributes = $exclude_skus = $exclude_custom_taxonomies = array(); $categories = $products = $tags = $attributes = $skus = $custom_taxonomies = array(); $all_products = $on_sale_products = ''; $query_arguments = array( 'post_type' => 'product', 'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => $short_code_attributes['per_page'], 'orderby' => $short_code_attributes['orderby'], 'order' => $short_code_attributes['order'], ); $this->modifyFilterArguments($query_arguments, $order_by); foreach (self::$available_rules as $rule) { $discount_type = $rule->getRuleDiscountType(); if($discount_type == 'wdr_buy_x_get_y_discount'){ $get_y = $rule->getBuyXGetYAdjustment(); $type = (isset($get_y->type) && !empty($get_y->type)) ? $get_y->type : ''; $parent_id = array(); foreach ($get_y->ranges as $range){ $get_y_products = isset($range->products) ? $range->products : array(); $get_y_parent_ids = isset($range->product_variants_for_sale_badge) ? $range->product_variants_for_sale_badge : array(); foreach ($get_y_parent_ids as $get_y_parent_id){ $get_y_parent_id_array = isset($get_y_parent_id) ? $get_y_parent_id : array(); $parent_id = array_merge($parent_id, $get_y_parent_id_array); } if(!empty($type)){ if($type == 'bxgy_product' && isset($range->products) && !empty($range->products)){ if(!empty($parent_id)){ $get_y_products = array_merge($get_y_products, $parent_id); } $products = array_merge($products, $get_y_products); $products = array_unique($products); } if($type == 'bxgy_category' && isset($range->categories) && !empty($range->categories)){ $categories = array_merge($categories, $range->categories); } } } } $filters = $rule->getFilter(); foreach ($filters as $filter) { $type = $rule->getFilterType($filter); $values = (array)$rule->getFilterOptionValue($filter); $parent_product_id = (array)$rule->getFilterOptionParentValue($filter); $method = $rule->getFilterMethod($filter); switch ($type) { case "all_products": $all_products = 'yes'; break; case "product_on_sale": $on_sale_products = $method; break; case "product_category": if ($method == "in_list") { $categories = array_merge($categories, $values); $categories = array_unique($categories); } else { $exclude_categories = array_merge($exclude_categories, $values); } break; case "products": if ($method == "in_list") { if(!empty($parent_product_id)){ $values = array_merge($values, $parent_product_id); } $products = array_merge($products, $values); $products = array_unique($products); } else { $exclude_products = array_merge($exclude_products, $values); } break; case "product_tags": if ($method == "in_list") { $tags = array_merge($tags, $values); } else { $exclude_tags = array_merge($exclude_tags, $values); } break; case "product_attributes": if ($method == "in_list") { $attributes = array_merge($attributes, $values); } else { $exclude_attributes = array_merge($exclude_attributes, $values); } break; case "product_sku": if ($method == "in_list") { $skus = array_merge($skus, $values); } else { $exclude_skus = array_merge($exclude_skus, $values); } break; default: if ($method == "in_list") { $custom_taxonomies[$type] = isset($custom_taxonomies[$type]) ? array_merge($custom_taxonomies[$type], $values) : $values; } else { $exclude_custom_taxonomies[$type] = isset($exclude_custom_taxonomies[$type]) ? array_merge($exclude_custom_taxonomies[$type], $values) : $values; } break; } } } $this->setCategoriesQueryArguments($query_arguments, $categories, $exclude_categories, $all_products); $this->setTagsQueryArguments($query_arguments, $tags, $exclude_tags, $all_products); $this->setAttributesQueryArguments($query_arguments, $attributes, $exclude_attributes, $all_products); $this->setSkuQueryArguments($query_arguments, $skus, $exclude_skus, $all_products); $this->setOnSaleQueryArguments($query_arguments, $on_sale_products, $all_products); $this->setCustomTaxonomyQueryArguments($query_arguments, $custom_taxonomies, $exclude_custom_taxonomies, $all_products); $this->setProductsQueryArguments($query_arguments, $products, $exclude_products, $all_products); $this->setQueryRelationship($query_arguments); ob_start(); $products = new \WP_Query($query_arguments); $columns = absint($short_code_attributes['columns']); $woocommerce_loop['columns'] = $columns; if ($products->have_posts()) { self::$woocommerce_helper->setLoopProperties('is_shortcode', true); self::$woocommerce_helper->setLoopProperties('is_paginated', (!empty($short_code_attributes['do_pagination']))); self::$woocommerce_helper->setLoopProperties('per_page', $short_code_attributes['per_page']); self::$woocommerce_helper->setLoopProperties('current_page', $paged); $total = $products->found_posts; self::$woocommerce_helper->setLoopProperties('total', $total); $total_pages = ceil($total / $short_code_attributes['per_page']); self::$woocommerce_helper->setLoopProperties('total_pages', $total_pages); do_action('woocommerce_before_shop_loop'); self::$woocommerce_helper->productLoopStart(); while ($products->have_posts()) { $products->the_post(); wc_get_template_part('content', 'product'); } self::$woocommerce_helper->productLoopEnd(); do_action('woocommerce_after_shop_loop'); // woocommerce_pagination(); wp_reset_postdata(); } else { do_action('woocommerce_no_products_found'); } return '
' . ob_get_clean() . '
'; } return NULL; } function bannerContent(){ echo ""; /*$awdr_banner_editer = self::$config->getConfig('awdr_banner_editor', ''); if(!empty($awdr_banner_editer) && $awdr_banner_editer != ''){ $awdr_banner_editer = $this->getCleanHtml($awdr_banner_editer); echo "
".$awdr_banner_editer."
"; }else{ echo "
"._e('No Banner Content', 'woo-discount-rules');".
"; }*/ } }