query; } protected function register_skins() { $this->add_skin( new Skins\Skin_Classic( $this ) ); } protected function register_controls() { $this->deprecated_notice( Plugin::get_title(), '2.0.10', '', esc_html__( 'Products', 'elementor-pro' ) ); $this->start_controls_section( 'section_layout', [ 'label' => esc_html__( 'Layout', 'elementor-pro' ), 'tab' => Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'posts_per_page', [ 'label' => esc_html__( 'Products Count', 'elementor-pro' ), 'type' => Controls_Manager::NUMBER, 'default' => '4', ] ); $this->end_controls_section(); $this->start_controls_section( 'section_filter', [ 'label' => esc_html__( 'Query', 'elementor-pro' ), 'tab' => Controls_Manager::TAB_CONTENT, ] ); $this->add_group_control( Group_Control_Posts::get_type(), [ 'name' => 'posts', 'post_type' => 'product', ] ); $this->add_control( 'advanced', [ 'label' => esc_html__( 'Advanced', 'elementor-pro' ), 'type' => Controls_Manager::HEADING, ] ); $this->add_control( 'filter_by', [ 'label' => esc_html__( 'Filter By', 'elementor-pro' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => [ '' => esc_html__( 'None', 'elementor-pro' ), 'featured' => esc_html__( 'Featured', 'elementor-pro' ), 'sale' => esc_html__( 'Sale', 'elementor-pro' ), ], ] ); $this->add_control( 'orderby', [ 'label' => esc_html__( 'Order By', 'elementor-pro' ), 'type' => Controls_Manager::SELECT, 'default' => 'date', 'options' => [ 'date' => esc_html__( 'Date', 'elementor-pro' ), 'title' => esc_html__( 'Title', 'elementor-pro' ), 'price' => esc_html__( 'Price', 'elementor-pro' ), 'popularity' => esc_html__( 'Popularity', 'elementor-pro' ), 'rating' => esc_html__( 'Rating', 'elementor-pro' ), 'rand' => esc_html__( 'Random', 'elementor-pro' ), 'menu_order' => esc_html__( 'Menu Order', 'elementor-pro' ), ], ] ); $this->add_control( 'order', [ 'label' => esc_html__( 'Order', 'elementor-pro' ), 'type' => Controls_Manager::SELECT, 'default' => 'desc', 'options' => [ 'asc' => esc_html__( 'ASC', 'elementor-pro' ), 'desc' => esc_html__( 'DESC', 'elementor-pro' ), ], ] ); $this->add_control( 'exclude', [ 'label' => esc_html__( 'Exclude', 'elementor-pro' ), 'type' => Controls_Manager::SELECT2, 'multiple' => true, 'options' => [ 'current_post' => esc_html__( 'Current Post', 'elementor-pro' ), 'manual_selection' => esc_html__( 'Manual Selection', 'elementor-pro' ), ], 'label_block' => true, ] ); $this->add_control( 'exclude_ids', [ 'label' => esc_html__( 'Search & Select', 'elementor-pro' ), 'type' => Module::QUERY_CONTROL_ID, 'autocomplete' => [ 'object' => Module::QUERY_OBJECT_POST, ], 'options' => [], 'label_block' => true, 'multiple' => true, 'condition' => [ 'exclude' => 'manual_selection', ], ] ); $this->add_control( 'avoid_duplicates', [ 'label' => esc_html__( 'Avoid Duplicates', 'elementor-pro' ), 'type' => Controls_Manager::SWITCHER, 'default' => '', 'description' => esc_html__( 'Set to Yes to avoid duplicate posts from showing up on the page. This only affects the frontend.', 'elementor-pro' ), ] ); $this->end_controls_section(); parent::register_controls(); } public function query_posts() { $settings = $this->get_settings(); /** @var Module $query_module */ $query_module = Module::instance(); $query_args = $query_module->get_query_args( 'posts', $settings ); // 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']; if ( ! empty( $ordering_args['meta_key'] ) ) { $query_args['meta_key'] = $ordering_args['meta_key']; } if ( 'sale' === $settings['filter_by'] ) { // From WooCommerce `sale_products` shortcode $query_args['post__in'] = array_merge( [ 0 ], wc_get_product_ids_on_sale() ); } if ( version_compare( WC()->version, '3.0.0', '>=' ) ) { $query_args = $this->get_wc_visibility_parse_query( $query_args ); } else { $query_args = $this->get_wc_legacy_visibility_parse_query( $query_args ); } $this->query = new \WP_Query( $query_args ); } private function get_wc_visibility_parse_query( $query_args ) { $settings = $this->get_settings(); $product_visibility_term_ids = wc_get_product_visibility_term_ids(); if ( 'featured' === $settings['filter_by'] ) { $query_args['tax_query'][] = [ 'taxonomy' => 'product_visibility', 'field' => 'term_taxonomy_id', 'terms' => $product_visibility_term_ids['featured'], ]; } return $query_args; } private function get_wc_legacy_visibility_parse_query( $query_args ) { $settings = $this->get_settings(); $query_args['meta_query'] = [ [ 'key' => '_visibility', 'value' => [ 'catalog', 'visible' ], 'compare' => 'IN', ], ]; if ( 'featured' === $settings['filter_by'] ) { // From WooCommerce `featured_products` shortcode $query_args['meta_query'][] = [ 'key' => '_featured', 'value' => 'yes', ]; } return $query_args; } public function render_plain_content() {} public function get_group_name() { return 'woocommerce'; } }