PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.2.0
UiCore Elements – Free widgets and templates for Elementor v1.2.0
1.3.17 1.3.16 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 All 41 releases
uicore-elements / includes / widgets / advanced-post-carousel.php

advanced-post-carousel.php in UiCore Elements – Free widgets and templates for Elementor 1.2.0, at includes/widgets/advanced-post-carousel.php

251 lines 7.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace UiCoreElements;
4
5 use Elementor\Controls_Manager;
6 use UiCoreElements\UiCoreWidget;
7 use UiCoreElements\Utils\Carousel_Trait;
8 use UiCoreElements\Utils\Animation_Trait;
9 use UiCoreElements\Utils\Grid_Trait;
10 use uicoreElements\Utils\Post_Trait;
11 use uiCoreElements\Utils\Post_Filters_Trait;
12
13 defined('ABSPATH') || exit();
14
15 class AdvancedPostCarousel extends UiCoreWidget
16 {
17 use Carousel_Trait,
18 Animation_Trait,
19 Grid_Trait,
20 Post_Filters_Trait,
21 Post_Trait;
22
23 private $_query;
24
25 public function get_name()
26 {
27 return 'uicore-advanced-post-carousel';
28 }
29 public function get_categories()
30 {
31 return ['uicore'];
32 }
33 public function get_title()
34 {
35 return __('Advanced Post Carousel', 'uicore-elements');
36 }
37 public function get_icon()
38 {
39 return 'eicon-posts-carousel ui-e-widget';
40 }
41 public function get_keywords()
42 {
43 return ['post', 'carousel', 'slide', 'blog', 'recent', 'news'];
44 }
45 public function get_styles()
46 {
47 $styles = [
48 'advanced-post-carousel',
49 'carousel',
50 'post-meta',
51 'filters' => [
52 'condition' => [
53 'post_filtering' => 'yes',
54 ]
55 ],
56 'animation', // hover animations
57 'entrance', // entrance basic style
58 ];
59 if(!class_exists('\UiCore\Core') && !class_exists('\UiCoreAnimate\Base')){
60 $styles['e-animations'] = [ // entrance animations
61 'external' => true,
62 ];
63 }
64 return $styles;
65 }
66 public function get_scripts()
67 {
68 return $this->TRAIT_get_carousel_scripts();
69 }
70
71 private function filter_missing_taxonomies($settings)
72 {
73 $taxonomy_filter_args = [
74 'show_in_nav_menus' => true,
75 ];
76 if (!empty($settings['posts-filter_post_type'])) {
77 $taxonomy_filter_args['object_type'] = [$settings['posts-filter_post_type']];
78 }
79
80 $taxonomies = get_taxonomies($taxonomy_filter_args, 'objects');
81
82 foreach ($taxonomies as $taxonomy => $object) {
83 $controll_id = 'posts-filter_' . $taxonomy . '_ids';
84 //error_log($controll_id);
85 //error_log(print_r($settings[$controll_id], true));
86
87 if (!isset($settings[$controll_id]) || empty($settings[$controll_id])) {
88 continue;
89 }
90
91 //if is set check if this id still exists
92 $settings[$controll_id] = array_filter($settings[$controll_id], function ($term_id) use ($object) {
93 return term_exists($term_id, $object->name);
94 });
95
96 if (empty($settings[$controll_id])) {
97 $settings[$controll_id] = null;
98 }
99 }
100
101 return $settings;
102 }
103 public function on_import($element)
104 {
105 $element['settings'] = $this->filter_missing_taxonomies($element['settings']);
106 return $element;
107 }
108 function get_query()
109 {
110 return $this->_query;
111 }
112
113 protected function register_controls()
114 {
115
116 // Contents and Settings
117 $this->start_controls_section(
118 'section_layout',
119 [
120 'label' => esc_html__('Carousel', 'uicore-elements'),
121 ]
122 );
123 $this->TRAIT_register_carousel_additional_controls(); // Grid Layouts with old masonry control
124 $this->end_controls_section();
125
126 $this->start_controls_section(
127 'section_carousel_settings',
128 [
129 'label' => __('Carousel Settings', 'uicore-elements'),
130 ]
131 );
132 $this->TRAIT_register_carousel_settings_controls(); // Carousel settings
133 $this->end_controls_section();
134
135 $this->TRAIT_register_navigation_controls();
136 $this->TRAIT_register_post_item_controls();
137 $this->TRAIT_register_post_button_controls();
138 $this->TRAIT_register_post_meta_controls();
139 $this->TRAIT_register_post_query_controls();
140 $this->TRAIT_register_filter_controls();
141
142 // Styles
143 $this->TRAIT_register_post_item_style_controls(); // instead of using carousel item style controls, we use post item and only updates some default values after. Is a better approach because advanced post widgets inherits some APG legacy codes and methods, such as setting borders and paddings on <article> instead of 'ui-e-item'
144 $this->TRAIT_register_navigation_style_controls();
145 $this->TRAIT_register_post_content_style_controls();
146 $this->TRAIT_register_post_button_style_controls();
147 $this->TRAIT_register_post_meta_style_controls();
148 $this->TRAIT_register_filter_style_controls();
149
150 $this->start_controls_section(
151 'section_style_animations',
152 [
153 'label' => __('Animations', 'uicore-elements'),
154 'tab' => Controls_Manager::TAB_STYLE,
155 ]
156 );
157 $this->TRAIT_register_entrance_animations_controls();
158 $this->TRAIT_register_hover_animation_control(
159 'Item Hover Animation',
160 [],
161 ['underline'],
162 );
163 $this->TRAIT_register_post_animation_controls();
164 $this->end_controls_section();
165
166 // Update post component controls
167 $this->update_control('image_size', [
168 'condition' => [],
169 ]);
170 $this->update_control('content_padding', [
171 'default' => [
172 'top' => 20,
173 'right' => 20,
174 'bottom' => 20,
175 'left' => 20,
176 'unit' => 'px',
177 ],
178 ]);
179 $this->update_control('item_limit', [
180 'default' => [
181 'size' => 5,
182 ],
183 ]);
184 }
185
186 function content_template()
187 {
188 }
189
190 protected function render()
191 {
192
193 // Get query args, settings and post type slug
194 global $wp_query;
195 $default_query = $wp_query;
196 $settings = $this->get_settings();
197
198 // Get the quantity of items and creates a loop control
199 $items = $settings['item_limit']['size'];
200 $loops = 0;
201
202 // Check if should duplicate slides and update settings
203 if ( $this->TRAIT_should_duplicate_slides($items) ) {
204 $diff = abs($this->TRAIT_get_duplication_diff($items) + 1); // +1 to fix zero based index
205 $settings['item_limit']['size'] = $items + $diff;
206 }
207
208 // Build query
209 $this->TRAIT_query_posts( $settings, $wp_query->query );
210 $wp_query = $this->get_query();
211
212 // SVG icon experiment font-size adjustment
213 $this->TRAIT_set_meta_font_size_to_svg($settings);
214
215 $this->TRAIT_render_filters($settings);
216
217 // No posts found
218 if (!$wp_query->have_posts()) {
219 echo '<p style="text-align:center">' . esc_html__('No posts found.', 'uicore-elements') . '</p>';
220 } else {
221
222 ?>
223 <div class="ui-e-carousel swiper">
224 <div class='swiper-wrapper'>
225 <?php
226 while ($wp_query->have_posts()) {
227
228 // sticky posts disregards posts per page, so ending the loop if $items == $loop forces the query respects the users item limit
229 // if ($settings['sticky'] && $items == $loops) {
230 // break;
231 // }
232
233 $wp_query->the_post();
234 $this->TRAIT_render_item(true);
235
236 $loops++;
237 }
238 ?>
239 </div>
240 </div>
241 <?php $this->TRAIT_render_carousel_navigations(); ?>
242 <?php
243 }
244
245 //reset query
246 wp_reset_postdata();
247 $wp_query = $default_query;
248 }
249 }
250 \Elementor\Plugin::instance()->widgets_manager->register(new AdvancedPostCarousel());
251