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

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

479 lines 13.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace UiCoreElements;
3
4 use Elementor\Controls_Manager;
5 use Elementor\Group_Control_Border;
6 use Elementor\Group_Control_Box_Shadow;
7 use Elementor\Group_Control_Typography;
8 use Elementor\Group_Control_Background;
9 use UiCoreElements\UiCoreWidget;
10
11 use UiCore\Assets;
12 use UiCore\Portfolio;
13 use UiCore\Blog;
14 use UiCore\Helper;
15 use UiCoreElements\Controls\Post_Filter;
16 use UiCoreElements\Controls\Query;
17
18 defined('ABSPATH') || exit();
19
20 /**
21 * Post Grid
22 *
23 */
24
25 class PostGrid extends UiCoreWidget
26 {
27 private $_query;
28
29 public function __construct($data = [], $args = null)
30 {
31 parent::__construct($data, $args);
32 }
33 public function get_name()
34 {
35 return 'uicore-post-grid';
36 }
37 public function get_categories()
38 {
39 return ['uicore'];
40 }
41 public function get_title()
42 {
43 return __('Post Grid', 'uicore-elements');
44 }
45 public function get_icon()
46 {
47 return 'eicon-gallery-grid ui-e-widget';
48 }
49 public function get_keywords()
50 {
51 return ['post', 'grid', 'blog', 'recent', 'news'];
52 }
53 public function get_styles()
54 {
55 return [
56 'post-grid',
57 // get framework assets
58 'uicore-blog-st' => [
59 'external' => true,
60 ],
61 'uicore-portfolio-st' => [
62 'external' => true,
63 'condition' => [
64 'posts-filter_post_type' => 'portfolio',
65 ]
66 ]
67 ];
68 }
69 public function get_scripts()
70 {
71 return [];
72 }
73 public function has_widget_inner_wrapper(): bool {
74 // TODO: remove after 3.30, when the full deprecation of widget innet wrapper is ready
75 return ! \Elementor\Plugin::$instance->experiments->is_feature_active( 'e_optimized_markup' );
76 }
77
78 public function on_import($element)
79 {
80 if (!get_post_type_object($element['settings']['posts-filter_post_type'])) {
81 $element['settings']['posts-filter_post_type'] = 'post';
82 }
83
84 return $element;
85 }
86 public function on_export($element)
87 {
88 $element = Post_Filter::on_export_remove_setting_from_element($element, 'uicore-posts-filter');
89 return $element;
90 }
91
92 public function get_query()
93 {
94 return $this->_query;
95 }
96
97 protected function register_controls()
98 {
99
100 $default_columns = Helper::get_option('blog_col', 3);
101
102 $this->start_controls_section('section_post_grid_def', [
103 'label' => esc_html__('Query', 'uicore-elements'),
104 ]);
105
106 $this->add_group_control(Post_Filter::get_type(), [
107 'name' => 'posts-filter',
108 'label' => esc_html__('Posts', 'uicore-elements'),
109 ]);
110
111 $this->add_control('item_limit', [
112 'label' => esc_html__('Item Limit', 'uicore-elements'),
113 'type' => Controls_Manager::SLIDER,
114 'reder_type' => 'template',
115 'range' => [
116 'px' => [
117 'min' => 1,
118 'max' => 30,
119 ],
120 ],
121 'default' => [
122 'size' => 3,
123 ],
124 ]);
125 $this->add_control('col_number', [
126 'label' => esc_html__('Columns Number', 'uicore-elements'),
127 'type' => Controls_Manager::SLIDER,
128 'reder_type' => 'template',
129 'range' => [
130 'px' => [
131 'min' => 1,
132 'max' => 4,
133 ],
134 ],
135 'default' => [
136 'size' => $default_columns,
137 ],
138 ]);
139
140 $this->end_controls_section();
141
142 $this->start_controls_section('section_post_grid_layout', [
143 'label' => esc_html__('Layout', 'uicore-elements'),
144 ]);
145 $this->add_control(
146 'layout',
147 [
148 'label' => __( 'Item Style', 'uicore-elements' ),
149 'type' => Controls_Manager::SELECT,
150 'default' => 'default',
151 'options' => [
152 'default' => __( 'Default', 'uicore-elements' ),
153 'classic' => __( 'classic', 'uicore-elements' ),
154 'grid' => __( 'Grid', 'uicore-elements' ),
155 'horizontal' => __( 'Horizontal', 'uicore-elements' ),
156 'masonry' => __( 'Masonry', 'uicore-elements' ),
157 ],
158 'condition' => array(
159 'posts-filter_post_type!' => 'portfolio',
160 ),
161 ]
162 );
163
164 $this->add_control(
165 'box_style',
166 [
167 'label' => __( 'layout', 'uicore-elements' ),
168 'type' => Controls_Manager::SELECT,
169 'default' => 'default',
170 'options' => [
171 'default' => __( 'Default', 'uicore-elements' ),
172 'boxed' => __( 'Boxed', 'uicore-elements' ),
173 'boxed-creative' => __( 'Boxed Creative', 'uicore-elements' ),
174 'cover' => __( 'Cover', 'uicore-elements' ),
175 ],
176 'condition' => array(
177 'posts-filter_post_type!' => 'portfolio',
178 ),
179 ]
180 );
181
182 $this->add_control(
183 'box_ratio',
184 [
185 'label' => __( 'Image Ratio', 'uicore-elements' ),
186 'type' => Controls_Manager::SELECT,
187 'default' => 'default',
188 'options' => [
189 'default' => __( 'Default', 'uicore-elements' ),
190 'square' => __( 'Square', 'uicore-elements' ),
191 'landscape' => __( 'Landscape', 'uicore-elements' ),
192 'portrait' => __( 'Portrait', 'uicore-elements' ),
193 ],
194 'condition' => array(
195 'posts-filter_post_type!' => 'portfolio',
196 ),
197 ]
198 );
199 $this->add_control(
200 'extra_author',
201 [
202 'label' => __( 'Author', 'uicore-elements' ),
203 'type' => Controls_Manager::SWITCHER,
204 'return_value' => 'yes',
205 'default' => '',
206 'reder_type' => 'template',
207 'condition' => array(
208 'posts-filter_post_type!' => 'portfolio',
209 ),
210 ]
211 );
212 $this->add_control(
213 'extra_date',
214 [
215 'label' => __( 'Date', 'uicore-elements' ),
216 'type' => Controls_Manager::SWITCHER,
217 'return_value' => 'yes',
218 'default' => '',
219 'reder_type' => 'template',
220 'condition' => array(
221 'posts-filter_post_type!' => 'portfolio',
222 ),
223 ]
224 );
225 $this->add_control(
226 'extra_excerpt',
227 [
228 'label' => __( 'Excerpt', 'uicore-elements' ),
229 'type' => Controls_Manager::SWITCHER,
230 'return_value' => 'yes',
231 'default' => '',
232 'reder_type' => 'template',
233 'condition' => array(
234 'posts-filter_post_type!' => 'portfolio',
235 ),
236 ]
237 );
238 $this->add_control(
239 'extra_category',
240 [
241 'label' => __( 'Category', 'uicore-elements' ),
242 'type' => Controls_Manager::SWITCHER,
243 'return_value' => 'yes',
244 'default' => '',
245 'reder_type' => 'template',
246 'condition' => array(
247 'posts-filter_post_type!' => 'portfolio',
248 ),
249 ]
250 );
251
252 $this->end_controls_section();
253
254
255 $this->start_controls_section(
256 'section_style_typo',
257 [
258 'label' => __( 'Content Style', 'uicore-elements' ),
259 'tab' => Controls_Manager::TAB_STYLE,
260 ]
261 );
262
263 $this->add_control(
264 'post_heading_title',
265 [
266 'label' => esc_html__( 'Post Title', 'uicore-elements' ),
267 'type' => Controls_Manager::HEADING,
268 'separator' => 'before',
269 ]
270 );
271
272 $this->add_control(
273 'post_title_color',
274 [
275 'label' => esc_html__( 'Color', 'uicore-elements' ),
276 'type' => Controls_Manager::COLOR,
277 'default' => '',
278 'selectors' => [
279 '{{WRAPPER}} .uicore-post-title' => 'color: {{VALUE}};',
280 ],
281 ]
282 );
283
284 $this->add_group_control(
285 Group_Control_Typography::get_type(),
286 [
287 'name' => 'post_title_typography',
288 'selector' => '{{WRAPPER}} .uicore-post-title, {{WRAPPER}} .uicore-post-title',
289 ]
290 );
291
292
293 $this->add_control(
294 'extra_excerpt_heading',
295 [
296 'label' => esc_html__( 'Excerpt', 'uicore-elements' ),
297 'type' => Controls_Manager::HEADING,
298 'separator' => 'before',
299 ]
300 );
301 $this->add_responsive_control(
302 'extra_excerpt_bottom_space',
303 [
304 'label' => esc_html__( 'Spacing', 'uicore-elements' ),
305 'type' => Controls_Manager::SLIDER,
306 'range' => [
307 'px' => [
308 'min' => 0,
309 'max' => 100,
310 ],
311 ],
312 'selectors' => [
313 '{{WRAPPER}} .uicore-post-info-wrapper > p' => 'margin-top: {{SIZE}}{{UNIT}};',
314 ],
315 ]
316 );
317
318 $this->add_control(
319 'extra_excerpt_color',
320 [
321 'label' => esc_html__( 'Color', 'uicore-elements' ),
322 'type' => Controls_Manager::COLOR,
323 'default' => '',
324 'selectors' => [
325 '{{WRAPPER}} .uicore-post-info-wrapper > p' => 'color: {{VALUE}};',
326 ],
327 ]
328 );
329
330 $this->add_group_control(
331 Group_Control_Typography::get_type(),
332 [
333 'name' => 'extra_excerpt_typography',
334 'selector' => '{{WRAPPER}} .uicore-post-info-wrapper > p',
335 ]
336 );
337
338
339 $this->add_responsive_control(
340 'box_padding',
341 [
342 'label' => esc_html__( 'Content Padding', 'uicore-elements' ),
343 'type' => Controls_Manager::DIMENSIONS,
344 'size_units' => [ 'px', 'em', '%', 'rem' ],
345 'separator' => 'before',
346 'selectors' => [
347 '{{WRAPPER}} .uicore-blog-grid .uicore-post .uicore-post-info' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}!important;',
348 ],
349 ]
350 );
351
352 $this->add_group_control(
353 Group_Control_Background::get_type(),
354 [
355 'name' => 'box_background',
356 'selector' => '{{WRAPPER}} .uicore-blog-grid .uicore-post',
357 ]
358 );
359
360 $this->add_group_control(
361 Group_Control_Border::get_type(),
362 [
363 'name' => 'box_border',
364 'selector' => '{{WRAPPER}} .uicore-blog-grid .uicore-post',
365 'separator' => 'before',
366 ]
367 );
368
369 $this->add_control(
370 'box_border_radius',
371 [
372 'label' => esc_html__( 'Border Radius', 'uicore-elements' ),
373 'type' => Controls_Manager::SLIDER,
374 'range' => [
375 'px' => [
376 'min' => 0,
377 'max' => 100,
378 ],
379 ],
380 'selectors' => [
381 '{{WRAPPER}} .uicore-blog-grid .uicore-post' => '--uicore-blog--radius: {{SIZE}}{{UNIT}};',
382 ],
383 ]
384 );
385
386 $this->add_group_control(
387 Group_Control_Box_Shadow::get_type(),
388 [
389 'name' => 'box_shadow_style',
390 'selector' => '{{WRAPPER}} .uicore-blog-grid .uicore-post',
391 ]
392 );
393
394
395 $this->end_controls_section();
396 }
397
398 public function query_posts($posts_per_page, $type = null)
399 {
400 $query_args = Query::get_query_args('posts-filter', $this->get_settings());
401
402 if($type === 'portfolio') {
403 $query_args['orderby'] = 'menu_order date';
404 }
405
406 $query_args['posts_per_page'] = $posts_per_page;
407
408 $this->_query = new \WP_Query($query_args);
409 }
410
411 protected function render()
412 {
413 $settings = $this->get_settings();
414
415 $col = $settings['col_number']['size'];
416 $type = $settings['posts-filter_post_type'];
417
418 if($type != 'portfolio'){
419 $type = str_replace(' ', '-', $settings['box_style']);
420 }
421
422 $this->query_posts($settings['item_limit']['size'], $type);
423 $wp_query = $this->get_query();
424
425 if (!$wp_query->found_posts) {
426 echo 'No Posts Found!';
427 return;
428 }
429
430
431 if ($type === 'portfolio') {
432
433 if(!class_exists('\UiCore\Portfolio\Frontend')){
434 require_once UICORE_INCLUDES . '/portfolio/class-template.php';
435 require_once UICORE_INCLUDES . '/portfolio/class-frontend.php';
436 }
437 Portfolio\Frontend::frontend_css(true);
438 $portfolio = new Portfolio\Template('display');
439 $portfolio->portfolio_layout($wp_query, null, $col);
440
441 } else {
442 $layout = $settings['layout'] === 'default' ? null : $settings['layout'];
443 $style = $settings['box_style'] === 'default' ? null : $settings['box_style'];
444
445 if(isset($settings['box_ratio'])){
446 $ratio = $settings['box_ratio'] === 'default' ? null : $settings['box_ratio'];
447 }else{//Fallback for older versions
448 $ratio = null;
449 }
450 if(isset($settings['extra_author'])){
451 $extra = [
452 'author' => $this->is_option('extra_author', 'yes'),
453 'date' => $this->is_option('extra_date', 'yes'),
454 'excerpt' => $this->is_option('extra_excerpt', 'yes'),
455 'category' => $this->is_option('extra_category', 'yes')
456 ];
457 }else{ //Fallback for older versions
458 $extra = [
459 'author' => null,
460 'date' => null,
461 'excerpt' => null,
462 'category' => null
463 ];
464 }
465
466
467 if(!class_exists('\UiCore\Blog\Frontend')){
468 require_once UICORE_INCLUDES . '/blog/class-template.php';
469 require_once UICORE_INCLUDES . '/blog/class-frontend.php';
470 }
471 Blog\Frontend::frontend_css(true);
472 $blog = new Blog\Template('display');
473 $blog->blog_layout($wp_query, $layout, $col,null,$ratio,$extra, $style);
474 }
475
476 }
477 }
478 \Elementor\Plugin::instance()->widgets_manager->register(new PostGrid());
479