Remove previous item from JetEngine stack. $prev_item = jet_engine()->listings->data->get_current_object(); if ( $prev_item !== $this->get_from_stack() ) { do_action( 'jet-engine/object-stack/decrease', $prev_item ); } } $this->processing_item = $item['_jet_engine_queried_object']; jet_engine()->listings->data->set_current_object( $item['_jet_engine_queried_object'] ); // Add item to stack. do_action( 'jet-engine/object-stack/increase', $item['_jet_engine_queried_object'] ); add_action( 'jet-engine/listings/frontend/object-done', array( $this, 'add_processing_item_to_stack' ), 20 ); } } public function add_processing_item_to_stack() { if ( $this->processing_item ) { do_action( 'jet-engine/object-stack/increase', $this->processing_item ); } } public function reset_item_object() { if ( ! $this->new_hooks ) { $this->old_reset_item_object(); return; } $this->processing_item = null; remove_action( 'jet-engine/listings/frontend/object-done', array( $this, 'add_processing_item_to_stack' ), 20 ); if ( ! $this->initial_object ) { return; } if ( $this->initial_object === jet_engine()->listings->data->get_current_object() ) { $this->initial_object = null; return; } // Remove last item from stack. $last_item = jet_engine()->listings->data->get_current_object(); do_action( 'jet-engine/object-stack/decrease', $last_item ); jet_engine()->listings->data->set_current_object( $this->initial_object ); $this->initial_object = null; } public function old_reset_item_object() { $this->processing_item = null; remove_action( 'jet-engine/listings/frontend/object-done', array( $this, 'add_processing_item_to_stack' ), 20 ); if ( ! $this->get_from_stack() ) { return; } if ( $this->get_from_stack() === jet_engine()->listings->data->get_current_object() ) { $this->remove_from_stack(); return; } // Remove last item from stack. $last_item = jet_engine()->listings->data->get_current_object(); do_action( 'jet-engine/object-stack/decrease', $last_item ); //Set JetEngine current object to object from the stack jet_engine()->listings->data->set_current_object( $this->get_from_stack() ); $this->remove_from_stack(); } public function query_items( $items, $control_name, $widget ) { if ( $this->is_control_supported( $widget->get_name(), $control_name ) && $this->query_enbaled( $control_name, $widget ) ) { $items = $this->get_queried_items( $control_name, $widget ); } return $items; } public function query_enbaled( $control_name, $widget ) { $is_active = $widget->get_settings( 'jet_engine_query_' . $control_name ); $query_id = $widget->get_settings( 'jet_engine_query_id_' . $control_name ); $control_val = $widget->get_settings( $control_name ); if ( ! $is_active || ! $query_id || empty( $control_val ) ) { return false; } else { return true; } } public function get_queried_items( $control_name, $widget ) { $query_id = $widget->get_settings( 'jet_engine_query_id_' . $control_name ); $items = array(); $query = Query_Builder_Manager::instance()->get_query_by_id( $query_id ); if ( ! $query ) { return $items; } $query->setup_query(); $query_items = $query->get_items(); if ( empty( $query_items ) ) { return $items; } $fields_map = $widget->get_settings( $control_name ); if ( empty( $fields_map ) ) { return $items; } $fields_map = $fields_map[0]; $this->initial_object = jet_engine()->listings->data->get_current_object(); foreach ( $query_items as $index => $item ) { jet_engine()->listings->data->set_current_object( $item ); $control = $widget->get_controls( $control_name ); $parsed_item = $widget->parse_dynamic_settings( $fields_map, $control['fields'], $fields_map ); $parsed_item['_jet_engine_queried_object'] = $item; $parsed_item['_id'] = ! empty( $parsed_item['_id'] ) ? $parsed_item['_id'] . '-' . $index : $control_name . '-' . $index; $items[] = $parsed_item; } $this->reset_item_object(); return $items; } public function is_control_supported( $widget_name, $control_name ) { if ( empty( $this->_controls_map[ $widget_name ] ) ) { return false; } return in_array( $control_name, $this->_controls_map[ $widget_name ] ); } public function jet_plugins_compatibility( $items, $control_name, $widget ) { if ( ! $this->new_hooks ) { return $this->old_jet_plugins_compatibility( $items, $control_name, $widget ); } return apply_filters( 'jet-engine-query-gateway/query', $items, $control_name, $widget ); } public function old_jet_plugins_compatibility( $items, $control_name, $widget ) { $current_object = jet_engine()->listings->data->get_current_object(); $items = apply_filters( 'jet-engine-query-gateway/query', $items, $control_name, $widget ); if ( ! empty( $items ) && $this->query_enbaled( $control_name, $widget ) ) { $this->add_to_stack( $current_object ); $this->increase_stack_depth(); //add action to decrease stack depth only if some items in widget loop //this is because a widget may have condition to stop rendering if no items present //also, add action to reset object add_action( 'jet-engine-query-gateway/reset-item', array( $this, 'decrease_stack_depth' ), 0 ); add_action( 'jet-engine-query-gateway/reset-item', array( $this, 'reset_item_object' ) ); } else { //if items empty we should ensure that stack depth is unchanged, otherwise stack depth will be wrong //also, no reset is needed in that case remove_action( 'jet-engine-query-gateway/reset-item', array( $this, 'decrease_stack_depth' ), 0 ); remove_action( 'jet-engine-query-gateway/reset-item', array( $this, 'reset_item_object' ) ); } return $items; } public function store_widget_data( $widget_name, $control_name ) { if ( empty( $this->_controls_map[ $widget_name ] ) ) { $this->_controls_map[ $widget_name ] = array(); } $this->_controls_map[ $widget_name ][] = $control_name; } public function register_controls( $widget, $control_name ) { $this->store_widget_data( $widget->get_name(), $control_name ); $widget->add_control( 'jet_engine_query_' . $control_name, array( 'label' => esc_html__( 'Use JetEngine query', 'jet-engine' ), 'description' => esc_html__( 'Select JetEngine query from Query Builder as source of content for this widget.', 'jet-engine' ), 'type' => \Elementor\Controls_Manager::SWITCHER, 'default' => '', 'separator' => 'before', ) ); $widget->add_control( 'jet_engine_query_id_' . $control_name, array( 'label' => __( 'Select Query', 'jet-engine' ), 'type' => \Elementor\Controls_Manager::SELECT, 'default' => '', 'options' => Query_Builder_Manager::instance()->get_queries_for_options(), 'condition' => array( 'jet_engine_query_' . $control_name => 'yes', ), ) ); $widget->add_control( 'jet_engine_query_instructions_' . $control_name, array( 'type' => \Elementor\Controls_Manager::RAW_HTML, 'raw' => $this->get_instructions_message(), 'condition' => array( 'jet_engine_query_' . $control_name => 'yes', ), ) ); } public function get_instructions_message() { $message = '' . __( 'Instructions', 'jet-engine' ) . '

'; $message .= ''; return $message; } }