204 lines
6.5 KiB
PHP
204 lines
6.5 KiB
PHP
<?php
|
|
namespace ElementorPro\Modules\LoopBuilder\Skins;
|
|
|
|
use ElementorPro\Modules\DynamicTags\Tags\Base\Tag_Trait;
|
|
use ElementorPro\Modules\LoopBuilder\Documents\Loop as LoopDocument;
|
|
use ElementorPro\Modules\LoopBuilder\Module;
|
|
use ElementorPro\Modules\LoopBuilder\Providers\Taxonomy_Loop_Provider;
|
|
use ElementorPro\Modules\LoopBuilder\Widgets\Base as Loop_Widget_Base;
|
|
use ElementorPro\Modules\LoopFilter\Traits\Taxonomy_Filter_Trait;
|
|
use ElementorPro\Modules\QueryControl\Controls\Group_Control_Taxonomy;
|
|
use ElementorPro\Plugin;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly
|
|
}
|
|
|
|
abstract class Skin_Loop_Taxonomy_Base extends Skin_Loop_Base {
|
|
|
|
use Taxonomy_Filter_Trait;
|
|
use Tag_Trait;
|
|
|
|
protected $provider;
|
|
|
|
protected function init_parent( $widget ) {
|
|
$this->parent = $widget;
|
|
}
|
|
|
|
protected function init_provider() {
|
|
$this->provider = new Taxonomy_Loop_Provider( $this->get_id(), $this->get_default_source_option() );
|
|
}
|
|
|
|
public function render() {
|
|
$template_id = $this->parent->get_settings_for_display( 'template_id' );
|
|
$is_edit_mode = Plugin::elementor()->editor->is_edit_mode();
|
|
$current_document = Plugin::elementor()->documents->get_current();
|
|
|
|
if ( $template_id ) {
|
|
$this->prepare_template_loop( $this->get_terms(), $template_id );
|
|
} elseif ( $is_edit_mode ) {
|
|
$this->render_empty_view();
|
|
}
|
|
|
|
if ( $current_document ) {
|
|
Plugin::elementor()->documents->switch_to_document( $current_document );
|
|
}
|
|
}
|
|
|
|
protected function prepare_template_loop( $terms, $template_id ) {
|
|
global $wp_query;
|
|
$wp_query->is_loop_taxonomy = ! empty( $terms );
|
|
|
|
$this->render_before_loop( $template_id );
|
|
$this->render_loop_content( $terms, $template_id );
|
|
$this->render_loop_end();
|
|
|
|
$wp_query->is_loop_taxonomy = false;
|
|
}
|
|
|
|
protected function render_before_loop( $template_id ) {
|
|
$widget = $this->parent;
|
|
|
|
$this->enqueue_loop_document_css_meta( $template_id );
|
|
$this->maybe_add_load_more_wrapper_class();
|
|
$widget->before_skin_render();
|
|
$this->render_loop_header();
|
|
}
|
|
|
|
protected function render_loop_content( $terms, $template_id ) {
|
|
global $wp_query;
|
|
|
|
foreach ( $terms as $term ) {
|
|
$wp_query->loop_term = $term;
|
|
$this->render_post();
|
|
$wp_query->loop_term = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render Post
|
|
*
|
|
* Uses the chosen custom template to render Loop posts.
|
|
*
|
|
* @since 3.8.0
|
|
*/
|
|
protected function render_post() {
|
|
$template_id = $this->parent->get_settings_for_display( 'template_id' );
|
|
|
|
/** @var LoopDocument $document */
|
|
$document = Plugin::elementor()->documents->get( $template_id );
|
|
|
|
if ( ! $document ) {
|
|
return;
|
|
}
|
|
|
|
$this->print_dynamic_css( $this->get_data_id_from_taxonomy_loop_query(), $template_id );
|
|
$document->print_content();
|
|
}
|
|
|
|
protected function render_loop_end() {
|
|
/** @var Loop_Widget_Base $widget */
|
|
$widget = $this->parent;
|
|
|
|
$this->render_loop_footer();
|
|
$widget->after_skin_render();
|
|
}
|
|
|
|
/**
|
|
* Register Query Controls
|
|
*
|
|
* Registers the controls for the query used by the Loop.
|
|
*
|
|
* @since 3.8.0
|
|
*/
|
|
public function register_query_controls( Loop_Widget_Base $widget ) {
|
|
$this->init_parent( $widget );
|
|
$this->init_provider();
|
|
$post_type_options = $this->get_taxonomy_options( ( Taxonomy_Loop_Provider::get_supported_cpts( $this->post_type ) ) );
|
|
$default_source_type = $this->get_default_source_option();
|
|
|
|
$this->add_group_control(
|
|
Group_Control_Taxonomy::get_type(),
|
|
[
|
|
'name' => Taxonomy_Loop_Provider::QUERY_CONTROL_GROUP_NAME,
|
|
Taxonomy_Loop_Provider::POST_TYPE => Taxonomy_Loop_Provider::get_default_source_type( $this->get_id() ),
|
|
'presets' => [ 'include', 'exclude' ],
|
|
'fields_options' => [
|
|
Taxonomy_Loop_Provider::POST_TYPE => [
|
|
'default' => $default_source_type,
|
|
'options' => $post_type_options,
|
|
],
|
|
Taxonomy_Loop_Provider::FILTER_BY => $this->provider->get_control_args( Taxonomy_Loop_Provider::FILTER_BY, false ),
|
|
Taxonomy_Loop_Provider::INCLUDE_TAB => $this->provider->get_control_args( Taxonomy_Loop_Provider::INCLUDE_TAB, false ),
|
|
Taxonomy_Loop_Provider::EXCLUDE_TAB => $this->provider->get_control_args( Taxonomy_Loop_Provider::EXCLUDE_TAB, false ),
|
|
],
|
|
'exclude' => [
|
|
'include',
|
|
'exclude',
|
|
],
|
|
],
|
|
);
|
|
|
|
// Filtering controls
|
|
$this->add_query_control( Taxonomy_Loop_Provider::PARENT, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::INCLUDE, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::EXCLUDE, true );
|
|
|
|
// Order controls
|
|
$this->add_query_control( Taxonomy_Loop_Provider::ORDER_BY, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::ORDER, true );
|
|
|
|
// Result exclusion controls
|
|
$this->add_query_control( Taxonomy_Loop_Provider::AVOID_DUPLICATES, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::HIDE_EMPTY, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::OFFSET, true );
|
|
|
|
// Hierarchical controls
|
|
$this->add_query_control( Taxonomy_Loop_Provider::HIERARCHICAL, true );
|
|
$this->add_query_control( Taxonomy_Loop_Provider::QUERY_DEPTH, true );
|
|
|
|
// Result inclusion controls
|
|
$this->add_query_control( Taxonomy_Loop_Provider::QUERY_ID, true );
|
|
}
|
|
|
|
/**
|
|
* Returns desired taxonomy items.
|
|
*
|
|
* Uses control values from get_settings_for_display.
|
|
*/
|
|
protected function get_terms() {
|
|
$display_settings = $this->parent->get_settings_for_display();
|
|
$settings = $this->provider->get_query_settings( $display_settings );
|
|
|
|
add_filter( 'elementor/loop_taxonomy/args', [ $this, 'filter_loop_taxonomy_args' ], 10, 3 );
|
|
|
|
$terms = $this->get_filtered_taxonomies( $settings, $settings );
|
|
|
|
remove_filter( 'elementor/loop_taxonomy/args', [ $this, 'filter_loop_taxonomy_args' ] );
|
|
|
|
Module::add_to_taxonomies_avoid_list( wp_list_pluck( $terms, 'term_id' ) );
|
|
|
|
return $terms;
|
|
}
|
|
|
|
public function filter_loop_taxonomy_args( $args, $settings, $display_settings ) {
|
|
$avoid_duplicates_key = $this->provider->get_property_name( 'avoid_duplicates' );
|
|
$current_settings = $this->parent->get_settings_for_display();
|
|
|
|
$should_avoid_duplicates = isset( $current_settings[ $avoid_duplicates_key ] ) &&
|
|
'yes' === $current_settings[ $avoid_duplicates_key ];
|
|
|
|
if ( $should_avoid_duplicates ) {
|
|
$exclude = isset( $args['exclude'] ) && is_array( $args['exclude'] ) ? $args['exclude'] : [];
|
|
$exclude = array_merge( $exclude, Module::get_taxonomies_avoid_list_ids() );
|
|
$args['exclude'] = $exclude;
|
|
}
|
|
|
|
return $args;
|
|
}
|
|
|
|
private function add_query_control( $control_id, $is_prefixed ) {
|
|
$this->add_control( $control_id, $this->provider->get_control_args( $control_id, $is_prefixed ) );
|
|
}
|
|
}
|