PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.0.8
UiCore Elements – Free widgets and templates for Elementor v1.0.8
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-grid.php

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

272 lines 8.0 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\Pagination_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 /**
16 * Scripts and Styles Class
17 *
18 */
19 class AdvancedPostGrid extends UiCoreWidget
20 {
21 use Pagination_Trait,
22 Animation_Trait,
23 Grid_Trait,
24 Post_Filters_Trait,
25 Post_Trait;
26
27 private $_query;
28
29 public function get_name()
30 {
31 return 'uicore-advanced-post-grid';
32 }
33 public function get_categories()
34 {
35 return ['uicore'];
36 }
37 public function get_title()
38 {
39 return __('Advanced Post Grid', 'uicore-elements');
40 }
41 public function get_icon()
42 {
43 return 'eicon-gallery-grid ui-e-widget';
44 }
45 public function get_keywords()
46 {
47 return ['post', 'grid', 'blog', 'recent', 'news'];
48 }
49 public function get_styles()
50 {
51 $styles = [
52 'advanced-post-grid',
53 'animation', // hover animations
54 'entrance', // entrance basic style
55 ];
56 if(!class_exists('\UiCore\Core') && !class_exists('\UiCoreAnimate\Base')){
57 $styles['e-animations'] = [ // entrance animations
58 'external' => true,
59 ];
60 }
61 return $styles;
62 }
63 public function get_scripts()
64 {
65 return [
66 'advanced-post-grid',
67 'entrance' => [
68 'condition' => [
69 'animate_items' => 'ui-e-grid-animate'
70 ],
71 ],
72 'ajax-request' => [
73 'condition' => [
74 'pagination_type' => 'load_more'
75 ]
76 ]
77 ];
78 }
79
80 private function filter_missing_taxonomies($settings)
81 {
82 $taxonomy_filter_args = [
83 'show_in_nav_menus' => true,
84 ];
85 if (!empty($settings['posts-filter_post_type'])) {
86 $taxonomy_filter_args['object_type'] = [$settings['posts-filter_post_type']];
87 }
88
89 $taxonomies = get_taxonomies($taxonomy_filter_args, 'objects');
90
91 foreach ($taxonomies as $taxonomy => $object) {
92 $controll_id = 'posts-filter_' . $taxonomy . '_ids';
93 \error_log($controll_id);
94 \error_log(print_r($settings[$controll_id], true));
95
96 if (!isset($settings[$controll_id]) || empty($settings[$controll_id])) {
97 continue;
98 }
99
100 //if is set check if this id still exists
101 $settings[$controll_id] = array_filter($settings[$controll_id], function ($term_id) use ($object) {
102 return term_exists($term_id, $object->name);
103 });
104
105 if (empty($settings[$controll_id])) {
106 $settings[$controll_id] = null;
107 }
108 }
109
110 return $settings;
111 }
112 public function on_import($element)
113 {
114 $element['settings'] = $this->filter_missing_taxonomies($element['settings']);
115 return $element;
116 }
117 function get_query()
118 {
119 return $this->_query;
120 }
121
122 protected function register_controls()
123 {
124 // Query(curent/custom/related/manual)
125
126 // /Pagination (filtering?)
127 // /Aditional (no posts)
128
129 // Contents and Settings
130 $this->start_controls_section(
131 'section_layout',
132 [
133 'label' => esc_html__('Grid', 'uicore-elements'),
134 ]
135 );
136 $this->TRAIT_register_grid_layout_controls();
137 $this->end_controls_section();
138
139 $this->TRAIT_register_post_item_controls();
140 $this->TRAIT_register_post_button_controls();
141 $this->TRAIT_register_post_meta_controls();
142 $this->TRAIT_register_post_query_controls();
143 $this->TRAIT_register_filter_controls();
144 $this->TRAIT_register_pagination_controls();
145
146 // Styles
147 $this->TRAIT_register_post_item_style_controls();
148 $this->TRAIT_register_post_content_style_controls();
149 $this->TRAIT_register_post_button_style_controls();
150 $this->TRAIT_register_post_meta_style_controls();
151 $this->TRAIT_register_filter_style_controls();
152 $this->TRAIT_register_pagination_style_controls();
153
154 $this->start_controls_section(
155 'section_style_animations',
156 [
157 'label' => __('Animations', 'uicore-elements'),
158 'tab' => Controls_Manager::TAB_STYLE,
159 ]
160 );
161 $this->TRAIT_register_entrance_animations_controls();
162 $this->TRAIT_register_hover_animation_control(
163 'Item Hover Animation',
164 [],
165 ['underline'],
166 'anim_item'
167 );
168 $this->TRAIT_register_post_animation_controls();
169 $this->end_controls_section();
170
171 // Update masonry from component to a legacy version
172 $this->update_control('masonry', [
173 'label' => __( 'Masonry', 'uicore-elements' ),
174 'type' => Controls_Manager::SWITCHER,
175 'frontend_available' => true,
176 'default' => 'no',
177 'return_value' => 'ui-e-maso',
178 // reset values from component
179 'prefix_class' => '',
180 'condition' => [],
181 'selectors' => [],
182 ]);
183 }
184
185 function content_template()
186 {
187 }
188
189 /**
190 * Renders the widget content using AJAX.
191 *
192 * This method retrieves the query arguments and widget settings, sets up the query, and renders each post item.
193 * If no posts are found, it returns false. After rendering, it resets the query and returns the output.
194 *
195 * @return string|false The rendered widget content or false if no posts are found.
196 */
197 public function render_ajax()
198 {
199 // Get query args and widget settings
200 global $wp_query;
201 $default_query = $wp_query;
202 $settings = $this->get_settings();
203 $this->TRAIT_query_posts($settings);
204 $wp_query = $this->get_query();
205
206 //return false if no post found
207 if (!$wp_query->have_posts()) {
208 return false;
209 }
210
211 \ob_start();
212 while ($wp_query->have_posts()) {
213 $wp_query->the_post();
214 $this->TRAIT_render_item(false, true);
215 }
216 wp_reset_query();
217 $wp_query = $default_query;
218 return \ob_get_clean();
219 }
220
221 protected function render()
222 {
223
224 // Get query args and widget settings
225 global $wp_query;
226 $default_query = $wp_query;
227 $settings = $this->get_settings();
228 $this->TRAIT_query_posts($settings);
229 $wp_query = $this->get_query();
230
231 // Store widget settings in a transient
232 $ID = strval($this->get_ID());
233 set_transient('ui_elements_widgetdata_' . $ID, $settings, \MONTH_IN_SECONDS);
234
235 // Get the quantity of items and creates a loop control
236 $items = $settings['item_limit']['size'];
237 $loops = 0;
238
239 $this->TRAIT_render_filters();
240
241 // No posts found
242 if (!$wp_query->have_posts()) {
243 echo '<p style="text-align:center">' . __('No posts found.', 'uicore-elements') . '</p>';
244 } else {
245
246 ?>
247 <div class="ui-e-adv-grid">
248 <?php
249 while ($wp_query->have_posts()) {
250
251 if ($settings['sticky'] && $items == $loops) {
252 break; // sticky posts disregards posts per page, so ending the loop if $items == $loop forces the query respects the users item limit
253 }
254
255 $wp_query->the_post();
256 $this->TRAIT_render_item(false, true);
257
258 $loops++;
259 }
260 ?>
261 </div>
262 <?php
263 $this->TRAIT_render_pagination();
264 }
265
266 //reset query
267 wp_reset_query();
268 $wp_query = $default_query;
269 }
270 }
271 \Elementor\Plugin::instance()->widgets_manager->register(new AdvancedPostGrid());
272