isset( $settings['slides_to_show'] ) ? absint( $settings['slides_to_show'] ) : 4, 'slidesToScroll' => isset( $settings['slides_to_scroll'] ) ? absint( $settings['slides_to_scroll'] ) : 1, 'autoplaySpeed' => isset( $settings['autoplay_speed'] ) ? absint( $settings['autoplay_speed'] ) : 5000, 'autoplay' => ( isset( $settings['autoplay'] ) && 'yes' === $settings['autoplay'] ), 'infinite' => ( isset( $settings['infinite'] ) && 'yes' === $settings['infinite'] ), 'pauseOnHover' => ( isset( $settings['pause_on_hover'] ) && 'yes' === $settings['pause_on_hover'] ), 'speed' => isset( $settings['transition_speed'] ) ? absint( $settings['transition_speed'] ) : 500, 'arrows' => $show_arrows, 'dots' => $show_dots, 'rtl' => $is_rtl, 'prevArrow' => '', 'nextArrow' => '', ); if ( $settings['slides_to_show_tablet'] || $settings['slides_to_show_mobile'] ) { $slick_options['responsive'] = array(); if ( ! empty( $settings['slides_to_show_tablet'] ) ) { $tablet_show = absint( $settings['slides_to_show_tablet'] ); $tablet_scroll = ( ! empty( $settings['slides_to_scroll_tablet'] ) ) ? absint( $settings['slides_to_scroll_tablet'] ) : $tablet_show; $slick_options['responsive'][] = array( 'breakpoint' => 1024, 'settings' => array( 'slidesToShow' => $tablet_show, 'slidesToScroll' => $tablet_scroll, ), ); } if ( ! empty( $settings['slides_to_show_mobile'] ) ) { $mobile_show = absint( $settings['slides_to_show_mobile'] ); $mobile_scroll = ( ! empty( $settings['slides_to_scroll_mobile'] ) ) ? absint( $settings['slides_to_scroll_mobile'] ) : $mobile_show; $slick_options['responsive'][] = array( 'breakpoint' => 767, 'settings' => array( 'slidesToShow' => $mobile_show, 'slidesToScroll' => $mobile_scroll, ), ); } } $this->add_render_attribute( 'wrapper', array( 'data-woo_slider' => wp_json_encode( $slick_options ), ) ); } /** * Render Query. * * @since 1.1.0 */ public function render_query() { $this->query_posts(); } /** * Get query products based on settings. * * Written in PHP and used to generate the final HTML. * * @since 0.0.1 * @access public */ public function query_posts() { $settings = self::$settings; if ( 'main' === $settings['query_type'] ) { global $wp_query; $main_query = clone $wp_query; self::$query = $main_query; } elseif ( 'related' === $settings['query_type'] ) { if ( is_product() ) { global $product; $product_id = $product->get_id(); $product_visibility_term_ids = wc_get_product_visibility_term_ids(); $query_args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'paged' => 1, 'post__not_in' => array(), ); if ( 'grid' === $settings['products_layout_type'] ) { if ( $settings['products_per_page'] > 0 ) { $query_args['posts_per_page'] = $settings['products_per_page']; } if ( '' !== $settings['pagination_type'] ) { $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : '1'; if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'uael-product-nonce' ) ) { if ( isset( $_POST['page_number'] ) && '' !== $_POST['page_number'] ) { $paged = sanitize_text_field( $_POST['page_number'] ); } } $query_args['paged'] = $paged; } } else { if ( $settings['slider_products_per_page'] > 0 ) { $query_args['posts_per_page'] = $settings['slider_products_per_page']; } } // Get current post categories and pass to filter. $product_cat = array(); $product_categories = wp_get_post_terms( $product_id, 'product_cat' ); if ( ! empty( $product_categories ) ) { foreach ( $product_categories as $key => $category ) { $product_cat[] = $category->slug; } } if ( ! empty( $product_cat ) ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $product_cat, 'operator' => 'IN', ); } // Exclude current product. $query_args['post__not_in'][] = $product_id; if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['outofstock'], 'operator' => 'NOT IN', ); } if ( ! empty( $product_visibility_term_ids['exclude-from-catalog'] ) ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['exclude-from-catalog'], 'operator' => 'NOT IN', ); } // Default ordering args. $ordering_args = WC()->query->get_catalog_ordering_args( $settings['orderby'], $settings['order'] ); $query_args['orderby'] = $ordering_args['orderby']; $query_args['order'] = $ordering_args['order']; $query_args = apply_filters( 'uael_woo_product_query_args', $query_args, $settings ); self::$query = new \WP_Query( $query_args ); } else { $query_args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'paged' => 1, 'post__in' => array( 0 ), ); $query_args = apply_filters( 'uael_woo_product_query_args', $query_args, $settings ); self::$query = new \WP_Query( $query_args ); } } else { global $post; $product_visibility_term_ids = wc_get_product_visibility_term_ids(); $query_args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => -1, 'paged' => 1, 'post__not_in' => array(), ); if ( 'grid' === $settings['products_layout_type'] ) { if ( $settings['products_per_page'] > 0 ) { $query_args['posts_per_page'] = $settings['products_per_page']; } if ( '' !== $settings['pagination_type'] ) { $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : '1'; if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'uael-product-nonce' ) ) { if ( isset( $_POST['page_number'] ) && '' !== $_POST['page_number'] ) { $paged = sanitize_text_field( $_POST['page_number'] ); } } $query_args['paged'] = $paged; } } else { if ( $settings['slider_products_per_page'] > 0 ) { $query_args['posts_per_page'] = $settings['slider_products_per_page']; } } if ( 'price' === $settings['orderby'] || 'popularity' === $settings['orderby'] || 'rating' === $settings['orderby'] ) { if ( 'price' === $settings['orderby'] ) { $query_args['meta_key'] = '_price'; } elseif ( 'popularity' === $settings['orderby'] ) { $query_args['meta_key'] = 'total_sales'; } elseif ( 'rating' === $settings['orderby'] ) { $query_args['meta_key'] = '_wc_average_rating'; } $query_args['orderby'] = 'meta_value_num'; $query_args['order'] = $settings['order']; } else { $ordering_args = WC()->query->get_catalog_ordering_args( $settings['orderby'], $settings['order'] ); $query_args['orderby'] = $ordering_args['orderby']; $query_args['order'] = $ordering_args['order']; } if ( 'sale' === $settings['filter_by'] ) { $query_args['post__in'] = array_merge( array( 0 ), wc_get_product_ids_on_sale() ); } elseif ( 'featured' === $settings['filter_by'] ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['featured'], ); } if ( 'custom' === $settings['query_type'] ) { if ( ! empty( $settings['category_filter'] ) ) { $cat_operator = $settings['category_filter_rule']; $query_args['tax_query'][] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $settings['category_filter'], 'operator' => $cat_operator, ); } if ( ! empty( $settings['tag_filter'] ) ) { $tag_operator = $settings['tag_filter_rule']; $query_args['tax_query'][] = array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $settings['tag_filter'], 'operator' => $tag_operator, ); } if ( 0 < $settings['offset'] ) { /** * Offset break the pagination. Using WordPress's work around * * @see https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination */ $query_args['offset_to_fix'] = $settings['offset']; } } if ( 'manual' === $settings['query_type'] ) { $manual_ids = $settings['query_manual_ids']; $query_args['post__in'] = $manual_ids; } if ( 'manual' !== $settings['query_type'] && 'main' !== $settings['query_type'] ) { if ( '' !== $settings['query_exclude_ids'] ) { $exclude_ids = $settings['query_exclude_ids']; $query_args['post__not_in'] = $exclude_ids; // Exclude from on sale products. if ( 'sale' === $settings['filter_by'] ) { $query_args['post__in'] = array_diff( $query_args['post__in'], $query_args['post__not_in'] ); } } if ( 'yes' === $settings['query_exclude_current'] ) { $query_args['post__not_in'][] = $post->ID; } } if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['outofstock'], 'operator' => 'NOT IN', ); } if ( ! empty( $product_visibility_term_ids['exclude-from-catalog'] ) ) { $query_args['tax_query'][] = array( 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['exclude-from-catalog'], 'operator' => 'NOT IN', ); } $query_args = apply_filters( 'uael_woo_product_query_args', $query_args, $settings ); self::$query = new \WP_Query( $query_args ); } } /** * Render loop required arguments. * * @since 1.1.0 */ public function render_loop_args() { $query = $this->get_query(); global $woocommerce_loop; $settings = self::$settings; if ( 'grid' === $settings['products_layout_type'] ) { $woocommerce_loop['columns'] = (int) $settings['products_columns']; if ( 'main' !== $settings['query_type'] ) { if ( 0 < $settings['products_per_page'] && '' !== $settings['pagination_type'] ) { /* Pagination */ $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), 'uael-product-nonce' ) ) { if ( isset( $_POST['page_number'] ) && '' !== $_POST['page_number'] ) { $paged = sanitize_text_field( $_POST['page_number'] ); } } $woocommerce_loop['paged'] = $paged; $woocommerce_loop['total'] = $query->found_posts; $woocommerce_loop['post_count'] = $query->post_count; $woocommerce_loop['per_page'] = $settings['products_per_page']; $woocommerce_loop['total_pages'] = ceil( $query->found_posts / $settings['products_per_page'] ); $woocommerce_loop['current_page'] = $paged; } } $this->add_render_attribute( 'inner', array( 'class' => array( ' columns-' . $woocommerce_loop['columns'], ), ) ); } else { if ( in_array( $settings['navigation'], array( 'dots', 'both' ), true ) ) { $this->add_render_attribute( 'inner', array( 'class' => array( 'uael-slick-dotted', ), ) ); } } } /** * Pagination Structure. * * @since 1.1.0 */ public function render_pagination_structure() { $settings = self::$settings; if ( '' !== $settings['pagination_type'] ) { add_filter( 'wc_get_template', array( $this, 'woo_pagination_template' ), 10, 5 ); add_filter( 'uael_woocommerce_pagination_args', array( $this, 'woo_pagination_options' ) ); woocommerce_pagination(); remove_filter( 'uael_woocommerce_pagination_args', array( $this, 'woo_pagination_options' ) ); remove_filter( 'wc_get_template', array( $this, 'woo_pagination_template' ), 10, 5 ); } } /** * Render wrapper start. * * @since 1.1.0 */ public function render_wrapper_start() { $settings = self::$settings; $skin_slug = str_replace( '_', '-', self::$skin ); $page_id = 0; if ( null !== \Elementor\Plugin::$instance->documents->get_current() ) { $page_id = \Elementor\Plugin::$instance->documents->get_current()->get_main_id(); } $this->set_slider_attr(); $this->add_render_attribute( 'wrapper', array( 'class' => array( 'uael-woocommerce', 'uael-woo-products-' . $settings['products_layout_type'], 'uael-woo-skin-' . $skin_slug, 'uael-woo-query-' . $settings['query_type'], ), 'data-page' => $page_id, 'data-skin' => self::$skin, ) ); echo '