lock' => false, 'multiple' => false, 'placeholder' => esc_html__( 'Choose', 'elementor-pro' ), 'condition' => [ 'select_date' => 'exact', 'post_type!' => [ 'by_id', 'current_query', ], ], 'description' => esc_html__( 'Setting a ‘Before’ date will show all the posts published until the chosen date (inclusive).', 'elementor-pro' ), ]; $fields['date_after'] = [ 'label' => esc_html__( 'After', 'elementor-pro' ), 'type' => Controls_Manager::DATE_TIME, 'post_type' => '', 'label_block' => false, 'multiple' => false, 'placeholder' => esc_html__( 'Choose', 'elementor-pro' ), 'condition' => [ 'select_date' => 'exact', 'post_type!' => [ 'by_id', 'current_query', ], ], 'description' => esc_html__( 'Setting an ‘After’ date will show all the posts published since the chosen date (inclusive).', 'elementor-pro' ), ]; $fields['orderby'] = [ 'label' => esc_html__( 'Order By', 'elementor-pro' ), 'type' => Controls_Manager::SELECT, 'default' => 'post_date', 'options' => [ 'post_date' => esc_html__( 'Date', 'elementor-pro' ), 'post_title' => esc_html__( 'Title', 'elementor-pro' ), 'menu_order' => esc_html__( 'Menu Order', 'elementor-pro' ), 'rand' => esc_html__( 'Random', 'elementor-pro' ), ], 'condition' => [ 'post_type!' => 'current_query', ], ]; $fields['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' ), ], 'condition' => [ 'post_type!' => 'current_query', ], ]; $fields['posts_per_page'] = [ 'label' => esc_html__( 'Posts Per Page', 'elementor-pro' ), 'type' => Controls_Manager::NUMBER, 'default' => 3, 'condition' => [ 'post_type!' => 'current_query', ], ]; $fields['ignore_sticky_posts'] = [ 'label' => esc_html__( 'Ignore Sticky Posts', 'elementor-pro' ), 'type' => Controls_Manager::SWITCHER, 'default' => 'yes', 'condition' => [ 'post_type' => 'post', ], 'description' => esc_html__( 'Sticky-posts ordering is visible on frontend only', 'elementor-pro' ), ]; $fields['query_id'] = [ 'label' => esc_html__( 'Query ID', 'elementor-pro' ), 'type' => Controls_Manager::TEXT, 'default' => '', 'description' => esc_html__( 'Give your Query a custom unique id to allow server side filtering', 'elementor-pro' ), 'separator' => 'before', ]; static::init_presets(); return $fields; } /** * Presets: filter controls subsets to be be used by the specific Group_Control_Query instance. * * Possible values: * 'full' : (default) all presets * 'include' : the 'include' tab - by id, by taxonomy, by author * 'exclude': the 'exclude' tab - by id, by taxonomy, by author * 'advanced_exclude': extend the 'exclude' preset with 'avoid-duplicates' & 'offset' * 'date': date query controls * 'pagination': posts per-page * 'order': sort & ordering controls * 'query_id': allow saving a specific query for future usage. * * Usage: * full: build a Group_Controls_Query with all possible controls, * when 'full' is passed, the Group_Controls_Query will ignore all other preset values. * $this->add_group_control( * Group_Control_Query::get_type(), * [ * ... * 'presets' => [ 'full' ], * ... * ] ); * * Subset: build a Group_Controls_Query with subset of the controls, * in the following example, the Query controls will set only the 'include' & 'date' query args. * $this->add_group_control( * Group_Control_Query::get_type(), * [ * ... * 'presets' => [ 'include', 'date' ], * ... * ] ); */ protected static function init_presets() { $tabs = [ 'query_args', 'query_include', 'query_exclude', ]; static::$presets['include'] = array_merge( $tabs, [ 'include', 'include_ids', 'include_term_ids', 'include_authors', ] ); static::$presets['exclude'] = array_merge( $tabs, [ 'exclude', 'exclude_ids', 'exclude_term_ids', 'exclude_authors', ] ); static::$presets['advanced_exclude'] = array_merge( static::$presets['exclude'], [ 'avoid_duplicates', 'offset', ] ); static::$presets['date'] = [ 'select_date', 'date_before', 'date_after', ]; static::$presets['pagination'] = [ 'posts_per_page', 'ignore_sticky_posts', ]; static::$presets['order'] = [ 'orderby', 'order', ]; static::$presets['query_id'] = [ 'query_id', ]; } private function filter_by_presets( $presets, $fields ) { if ( in_array( 'full', $presets, true ) ) { return $fields; } $control_ids = []; foreach ( static::$presets as $key => $preset ) { $control_ids = array_merge( $control_ids, $preset ); } foreach ( $presets as $preset ) { if ( array_key_exists( $preset, static::$presets ) ) { $control_ids = array_diff( $control_ids, static::$presets[ $preset ] ); } } foreach ( $control_ids as $remove ) { unset( $fields[ $remove ] ); } return $fields; } protected function prepare_fields( $fields ) { $args = $this->get_args(); if ( ! empty( $args['presets'] ) ) { $fields = $this->filter_by_presets( $args['presets'], $fields ); } $post_type_args = []; if ( ! empty( $args['post_type'] ) ) { $post_type_args['post_type'] = $args['post_type']; } $post_types = Utils::get_public_post_types( $post_type_args ); $fields['post_type']['options'] = array_merge( $post_types, $fields['post_type']['options'] ); $fields['post_type']['default'] = key( $post_types ); $fields['posts_ids']['object_type'] = array_keys( $post_types ); //skip parent, go directly to grandparent return Group_Control_Base::prepare_fields( $fields ); } protected function get_child_default_args() { $args = parent::get_child_default_args(); $args['presets'] = [ 'full' ]; return $args; } protected function get_default_options() { return [ 'popover' => false, ]; } }