PluginProbe
ShopBuilder – WooCommerce Builder For Elementor / 2.6.4
ShopBuilder – WooCommerce Builder For Elementor v2.6.4
3.4.2 3.4.1 3.4.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 All 63 releases
shopbuilder / app / Elementor / Widgets / Controls / LayoutFields.php

LayoutFields.php in ShopBuilder – WooCommerce Builder For Elementor 2.6.4, at app/Elementor/Widgets/Controls/LayoutFields.php

1,073 lines 35.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Elementor Layout Fields Class.
4 *
5 * This class contains all the common fields for Layout tab.
6 *
7 * @package RadiusTheme\SB
8 */
9
10 namespace RadiusTheme\SB\Elementor\Widgets\Controls;
11
12 use RadiusTheme\SB\Helpers\Fns;
13 use RadiusTheme\SB\Elementor\Helper\ControlHelper;
14
15 // Do not allow directly accessing this file.
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 'This script cannot be accessed directly.' );
18 }
19
20 /**
21 * Elementor Layout Fields Class.
22 */
23 class LayoutFields {
24 /**
25 * Tab name.
26 *
27 * @access private
28 * @static
29 *
30 * @var array
31 */
32 private static $tab = 'layout';
33
34 /**
35 * Grid Layout section
36 *
37 * @param object $obj Reference object.
38 *
39 * @return array
40 */
41 public static function grid_layout( $obj ) {
42 $fields['layout_section'] = $obj->start_section(
43 esc_html__( 'Presentation', 'shopbuilder' ),
44 self::$tab
45 );
46
47 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
48
49 $fields['layout'] = [
50 'type' => 'rtsb-image-selector',
51 'options' => ControlHelper::grid_layouts(),
52 'default' => 'grid-layout1',
53 ];
54
55 $fields = array_merge( $fields, self::structure( $obj ) );
56 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
57
58 $fields['layout_section_end'] = $obj->end_section();
59
60 return apply_filters( 'rtsb/elements/elementor/grid_layout_control', $fields, $obj );
61 }
62
63 /**
64 * List Layout section
65 *
66 * @param object $obj Reference object.
67 *
68 * @return array
69 */
70 public static function list_layout( $obj ) {
71 $fields['layout_section'] = $obj->start_section(
72 esc_html__( 'Layouts', 'shopbuilder' ),
73 self::$tab
74 );
75
76 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
77
78 $fields['layout'] = [
79 'type' => 'rtsb-image-selector',
80 'options' => ControlHelper::list_layouts(),
81 'default' => 'list-layout1',
82 ];
83
84 $fields = array_merge( $fields, self::structure( $obj ) );
85 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
86
87 unset( $fields['action_btn_preset'] );
88 unset( $fields['action_btn_position'] );
89
90 $fields['layout_section_end'] = $obj->end_section();
91
92 return apply_filters( 'rtsb/elements/elementor/list_layout_control', $fields, $obj );
93 }
94
95 /**
96 * Slider Layout section
97 *
98 * @param object $obj Reference object.
99 *
100 * @return array
101 */
102 public static function slider_layout( $obj ) {
103 $fields['layout_section'] = $obj->start_section(
104 esc_html__( 'Slider Layouts', 'shopbuilder' ),
105 self::$tab
106 );
107
108 $fields['layout_note'] = $obj->el_heading( esc_html__( 'Predefined Layouts', 'shopbuilder' ) );
109
110 $fields['layout'] = [
111 'type' => 'rtsb-image-selector',
112 'options' => ControlHelper::slider_layouts(),
113 'default' => 'slider-layout1',
114 ];
115
116 $fields = array_merge( $fields, self::structure_slider( $obj ) );
117 $fields = array_merge( $fields, self::action_btn_presets( $obj ) );
118
119 $fields['layout_section_end'] = $obj->end_section();
120
121 return apply_filters( 'rtsb/elements/elementor/slider_layout_control', $fields, $obj );
122 }
123
124 /**
125 * Category Layout section
126 *
127 * @param object $obj Reference object.
128 *
129 * @return array
130 */
131 public static function category_layout( $obj ) {
132 $fields['layout_section'] = $obj->start_section(
133 esc_html__( 'Layouts', 'shopbuilder' ),
134 self::$tab
135 );
136
137 $fields['layout'] = [
138 'type' => 'rtsb-image-selector',
139 'options' => ControlHelper::category_layouts(),
140 'default' => 'category-layout1',
141 ];
142
143 $fields = array_merge( $fields, self::structure( $obj ) );
144
145 if ( 'rtsb-product-categories-general' === $obj->rtsb_base ) {
146 $fields['cols']['render_type'] = 'template';
147 }
148
149 $fields['cat_height'] = [
150 'type' => 'slider',
151 'mode' => 'responsive',
152 'label' => esc_html__( 'Element Height', 'shopbuilder' ),
153 'size_units' => [ 'px', '%' ],
154 'range' => [
155 'px' => [
156 'min' => 0,
157 'max' => 1500,
158 'step' => 1,
159 ],
160 '%' => [
161 'min' => 0,
162 'max' => 100,
163 'step' => 1,
164 ],
165 ],
166 'description' => esc_html__( 'Please select the element height.', 'shopbuilder' ),
167 'selectors' => [
168 $obj->selectors['category_multi_layout']['cat_height'] => 'height: {{SIZE}}{{UNIT}};',
169 ],
170 ];
171
172 $fields['layout_section_end'] = $obj->end_section();
173
174 return apply_filters( 'rtsb/elements/elementor/cat_layout_control', $fields, $obj );
175 }
176
177 /**
178 * Category Layout section
179 *
180 * @param object $obj Reference object.
181 *
182 * @return array
183 */
184 public static function category_single_layout( $obj ) {
185 $fields['layout_section'] = $obj->start_section(
186 esc_html__( 'Layouts', 'shopbuilder' ),
187 self::$tab
188 );
189
190 $fields['layout'] = [
191 'type' => 'rtsb-image-selector',
192 'options' => ControlHelper::single_category_layouts(),
193 'default' => 'category-single-layout1',
194 ];
195
196 $fields['cat_alignment'] = [
197 'mode' => 'responsive',
198 'type' => 'choose',
199 'label' => esc_html__( 'Element Alignment', 'shopbuilder' ),
200 'options' => [
201 'left' => [
202 'title' => esc_html__( 'Left', 'shopbuilder' ),
203 'icon' => 'eicon-text-align-left',
204 ],
205 'center' => [
206 'title' => esc_html__( 'Center', 'shopbuilder' ),
207 'icon' => 'eicon-text-align-center',
208 ],
209 'right' => [
210 'title' => esc_html__( 'Right', 'shopbuilder' ),
211 'icon' => 'eicon-text-align-right',
212 ],
213 ],
214 'selectors' => [
215 $obj->selectors['category_single_layout']['cat_alignment']['text_align'] => 'text-align: {{VALUE}};',
216 $obj->selectors['category_single_layout']['cat_alignment']['justify_content'] => 'justify-content: {{VALUE}};',
217 ],
218 ];
219
220 $fields['cat_height'] = [
221 'type' => 'slider',
222 'mode' => 'responsive',
223 'label' => esc_html__( 'Element Height', 'shopbuilder' ),
224 'size_units' => [ 'px', '%' ],
225 'range' => [
226 'px' => [
227 'min' => 0,
228 'max' => 1500,
229 'step' => 1,
230 ],
231 '%' => [
232 'min' => 0,
233 'max' => 100,
234 'step' => 1,
235 ],
236 ],
237 'description' => esc_html__( 'Please select the element height.', 'shopbuilder' ),
238 'selectors' => [
239 $obj->selectors['category_single_layout']['cat_height'] => 'height: {{SIZE}}{{UNIT}};',
240 ],
241 ];
242
243 $fields['layout_section_end'] = $obj->end_section();
244
245 return apply_filters( 'rtsb/elements/elementor/cat_layout_control', $fields, $obj );
246 }
247
248 /**
249 * Action button preset section
250 *
251 * @param object $obj Reference object.
252 *
253 * @return array
254 */
255 public static function action_btn_presets( $obj ) {
256 $fields['action_btn_note'] = $obj->el_heading( esc_html__( 'Action Button Layouts', 'shopbuilder' ), 'before' );
257
258 $fields['action_btn_preset'] = [
259 'type' => 'rtsb-image-selector',
260 'description' => esc_html__( 'Please choose your preferred action buttons preset.', 'shopbuilder' ),
261 'options' => ControlHelper::action_btn_presets(),
262 'default' => 'preset1',
263 ];
264
265 $fields['action_btn_position'] = [
266 'type' => 'select2',
267 'label' => esc_html__( 'Action Buttons Position', 'shopbuilder' ),
268 'description' => esc_html__( 'Please select the action buttons position.', 'shopbuilder' ),
269 'options' => [
270 'above' => esc_html__( 'Floating Above Image', 'shopbuilder' ),
271 'after' => esc_html__( 'After Content', 'shopbuilder' ),
272 ],
273 'default' => 'above',
274 'label_block' => true,
275 'condition' => [
276 'action_btn_preset' => [ 'preset1', 'preset5' ],
277 'layout!' => [ 'grid-layout2', 'slider-layout2' ],
278 ],
279 ];
280
281 $fields['action_btn_gap'] = [
282 'type' => 'slider',
283 'mode' => 'responsive',
284 'label' => esc_html__( 'Action Buttons Gap / Spacing (px)', 'shopbuilder' ),
285 'size_units' => [ 'px' ],
286 'range' => [
287 'px' => [
288 'min' => 0,
289 'max' => 100,
290 'step' => 1,
291 ],
292 ],
293 'description' => esc_html__( 'Please select the action buttons gap in px.', 'shopbuilder' ),
294 'selectors' => [
295 $obj->selectors['action_buttons']['action_btn_gap'] => 'gap: {{SIZE}}{{UNIT}} !important;',
296 ],
297 ];
298
299 $fields['action_btn_alignment'] = [
300 'type' => 'choose',
301 'label' => esc_html__( 'Action Buttons Alignment', 'shopbuilder' ),
302 'description' => esc_html__( 'Please select the action buttons alignment.', 'shopbuilder' ),
303 'options' => [
304 'flex-start' => [
305 'title' => esc_html__( 'Left', 'shopbuilder' ),
306 'icon' => 'eicon-text-align-left',
307 ],
308 'center' => [
309 'title' => esc_html__( 'Center', 'shopbuilder' ),
310 'icon' => 'eicon-text-align-center',
311 ],
312 'flex-end' => [
313 'title' => esc_html__( 'Right', 'shopbuilder' ),
314 'icon' => 'eicon-text-align-right',
315 ],
316 ],
317 'toggle' => true,
318 'condition' => [
319 'action_btn_position' => [ 'after' ],
320 'action_btn_preset' => [ 'preset1' ],
321 ],
322 'selectors' => [
323 $obj->selectors['action_buttons']['action_btn_alignment'] => 'justify-content: {{VALUE}};',
324 ],
325 ];
326
327 $fields['action_btn_tooltip_position'] = [
328 'label' => esc_html__( 'Tooltip Position', 'shopbuilder' ),
329 'type' => 'choose',
330 'description' => esc_html__( 'Please choose the tooltip position', 'shopbuilder' ),
331 'options' => [
332 'top' => [
333 'title' => esc_html__( 'Top', 'shopbuilder' ),
334 'icon' => ' eicon-arrow-up',
335 ],
336 'right' => [
337 'title' => esc_html__( 'Right', 'shopbuilder' ),
338 'icon' => ' eicon-arrow-right',
339 ],
340 'bottom' => [
341 'title' => esc_html__( 'Bottom', 'shopbuilder' ),
342 'icon' => ' eicon-arrow-down',
343 ],
344 'left' => [
345 'title' => esc_html__( 'Left', 'shopbuilder' ),
346 'icon' => ' eicon-arrow-left',
347 ],
348 ],
349 'default' => 'top',
350 ];
351
352 return $fields;
353 }
354
355 /**
356 * Columns section
357 *
358 * @param object $obj Reference object.
359 *
360 * @return array
361 */
362 public static function structure( $obj ) {
363 $fields['cols'] = [
364 'type' => 'select2',
365 'mode' => 'responsive',
366 'label' => esc_html__( 'Number of Columns', 'shopbuilder' ),
367 'description' => esc_html__( 'Please select the number of columns to show per row.', 'shopbuilder' ),
368 'options' => ControlHelper::layout_columns(),
369 'label_block' => true,
370 'render_type' => 'template',
371 'default' => '0',
372 'tablet_default' => '2',
373 'mobile_default' => '1',
374 'required' => true,
375 'separator' => rtsb()->has_pro() ? 'default' : 'default elementor-control-separator-after',
376 'selectors' => [
377 $obj->selectors['columns']['cols'] => 'grid-template-columns: repeat({{VALUE}}, minmax(0, 1fr));',
378 $obj->selectors['columns']['masonry'] => '--rtsb-masonry-columns: {{VALUE}};',
379 $obj->selectors['columns']['list_masonry'] => '--rtsb-masonry-list-columns: {{VALUE}};',
380 ],
381 ];
382
383 $fields['grid_style'] = [
384 'type' => 'select2',
385 'label' => esc_html__( 'Layout Grid Style', 'shopbuilder' ),
386 'options' => [
387 'even' => esc_html__( 'Default', 'shopbuilder' ),
388 'masonry' => esc_html__( 'Masonry', 'shopbuilder' ),
389 'equal' => esc_html__( 'Equal Height', 'shopbuilder' ),
390 ],
391 'label_block' => true,
392 'default' => 'even',
393 'description' => esc_html__( 'Please select the layout grid style.', 'shopbuilder' ),
394 'classes' => $obj->pro_class(),
395 ];
396
397 $fields['image_width'] = [
398 'type' => 'slider',
399 'mode' => 'responsive',
400 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
401 'size_units' => [ 'px','%' ],
402 'range' => [
403 '%' => [
404 'min' => 0,
405 'max' => 100,
406 'step' => 1,
407 ],
408 ],
409 'default' => [
410 'unit' => '%',
411 'size' => 32,
412 ],
413 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
414 'separator' => rtsb()->has_pro() ? 'default' : 'before',
415 'selectors' => [
416 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
417 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
418 ],
419 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
420 ];
421
422 $fields['image_gap'] = [
423 'type' => 'slider',
424 'mode' => 'responsive',
425 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
426 'size_units' => [ 'px' ],
427 'range' => [
428 'px' => [
429 'min' => 0,
430 'max' => 100,
431 'step' => 1,
432 ],
433 ],
434 'default' => [
435 'unit' => 'px',
436 'size' => 30,
437 ],
438 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
439 'selectors' => [
440 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
441 ],
442 'condition' => [ 'layout' => [ 'list-layout1', 'list-layout2', 'list-layout3', 'list-layout4','list-layout5','list-layout6','list-layout7' ] ],
443 ];
444
445 $fields['v_action_btn_width'] = [
446 'type' => 'slider',
447 'mode' => 'responsive',
448 'label' => esc_html__( 'Vertical Action Buttons Width (px)', 'shopbuilder' ),
449 'size_units' => [ 'px' ],
450 'range' => [
451 'px' => [
452 'min' => 0,
453 'max' => 500,
454 'step' => 1,
455 ],
456 ],
457 'description' => esc_html__( 'Please select the vertical action buttons width in px.', 'shopbuilder' ),
458 'selectors' => [
459 $obj->selectors['columns']['v_action_btn_width'] => 'flex-basis: {{SIZE}}{{UNIT}};',
460 ],
461 'condition' => [ 'layout' => [ 'list-layout3' ] ],
462 ];
463
464 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
465 }
466
467 /**
468 * Columns section
469 *
470 * @param object $obj Reference object.
471 *
472 * @return array
473 */
474 public static function structure_slider( $obj ) {
475 $fields['cols'] = [
476 'type' => 'select2',
477 'mode' => 'responsive',
478 'label' => esc_html__( 'Number of Slides (Columns) Per View', 'shopbuilder' ),
479 'description' => esc_html__( 'Please select the number of slides to show per view.', 'shopbuilder' ),
480 'options' => ControlHelper::layout_columns(),
481 'label_block' => true,
482 'default' => '0',
483 'tablet_default' => '2',
484 'mobile_default' => '1',
485 'required' => true,
486 'separator' => 'default elementor-control-separator-after',
487 ];
488
489 $fields['rows'] = [
490 'type' => 'select2',
491 'label' => esc_html__( 'Number of Product Rows', 'shopbuilder' ),
492 'description' => rtsb()->has_pro() ? esc_html__( 'Please select the number of slide rows. Slide Rows represents how many rows of slides will be displayed at once.', 'shopbuilder' ) : esc_html__( 'Please select the number of slide rows.', 'shopbuilder' ),
493 'options' => [
494 1 => esc_html__( 'Layout Default (1 Row)', 'shopbuilder' ),
495 2 => esc_html__( '2 Rows', 'shopbuilder' ),
496 3 => esc_html__( '3 Rows', 'shopbuilder' ),
497 4 => esc_html__( '4 Rows', 'shopbuilder' ),
498 5 => esc_html__( '5 Rows', 'shopbuilder' ),
499 ],
500 'label_block' => true,
501 'default' => '1',
502 'tablet_default' => '1',
503 'mobile_default' => '1',
504 'required' => true,
505 'classes' => $obj->pro_class(),
506 ];
507
508 $fields['cols_group'] = [
509 'type' => 'select2',
510 'mode' => 'responsive',
511 'label' => esc_html__( 'Number of Slides Per Group', 'shopbuilder' ),
512 'description' => rtsb()->has_pro() ? esc_html__( 'Please select the number of slides to show per group. Slides Per Group indicates how many slides will be transitioned at a time.', 'shopbuilder' ) : esc_html__( 'Please select the number of slides to show per group.', 'shopbuilder' ),
513 'options' => ControlHelper::layout_columns(),
514 'label_block' => true,
515 'default' => '0',
516 'tablet_default' => '2',
517 'mobile_default' => '1',
518 'required' => true,
519 'classes' => $obj->pro_class(),
520 ];
521
522 $fields['grid_style'] = [
523 'type' => 'select',
524 'label' => esc_html__( 'Layout Grid Style', 'shopbuilder' ),
525 'options' => [
526 'even' => esc_html__( 'Default', 'shopbuilder' ),
527 ],
528 'label_block' => true,
529 'default' => 'even',
530 'description' => esc_html__( 'Please select the layout grid style.', 'shopbuilder' ),
531 ];
532
533 $fields['image_width'] = [
534 'type' => 'slider',
535 'mode' => 'responsive',
536 'label' => esc_html__( 'Image Width', 'shopbuilder' ),
537 'size_units' => [ 'px','%' ],
538 'range' => [
539 '%' => [
540 'min' => 0,
541 'max' => 100,
542 'step' => 1,
543 ],
544 ],
545 'default' => [
546 'unit' => '%',
547 'size' => 32,
548 ],
549 'description' => esc_html__( 'Please select the image width in %.', 'shopbuilder' ),
550 'selectors' => [
551 $obj->selectors['columns']['image_width']['image'] => 'flex-basis: {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}} !important;',
552 // $obj->selectors['columns']['image_width']['content'] => 'flex-basis: calc(100% - {{SIZE}}{{UNIT}}); max-width: calc(100% - {{SIZE}}{{UNIT}});',
553 ],
554 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
555 ];
556
557 $fields['image_gap'] = [
558 'type' => 'slider',
559 'mode' => 'responsive',
560 'label' => esc_html__( 'Image Gap (px)', 'shopbuilder' ),
561 'size_units' => [ 'px' ],
562 'range' => [
563 'px' => [
564 'min' => 0,
565 'max' => 100,
566 'step' => 1,
567 ],
568 ],
569 'default' => [
570 'unit' => 'px',
571 'size' => 30,
572 ],
573 'description' => esc_html__( 'Please select the image gap in px.', 'shopbuilder' ),
574 'selectors' => [
575 $obj->selectors['columns']['image_gap'] => 'gap: {{SIZE}}{{UNIT}};',
576 ],
577 'condition' => [ 'layout' => [ 'slider-layout5' ] ],
578 ];
579
580 return apply_filters( 'rtsb/elements/elementor/columns_control', $fields, $obj );
581 }
582
583 /**
584 * Query section
585 *
586 * @param object $obj Reference object.
587 *
588 * @return array
589 */
590 public static function query( $obj ) {
591 $fields['query_section'] = $obj->start_section(
592 esc_html__( 'Query', 'shopbuilder' ),
593 self::$tab
594 );
595
596 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
597
598 $fields['include_posts'] = [
599 'type' => 'rt-select2',
600 'label' => esc_html__( 'Include Products', 'shopbuilder' ),
601 'description' => esc_html__( 'Please select the products to show. Leave it blank to include all products.', 'shopbuilder' ),
602 'source_name' => 'post_type',
603 'source_type' => 'product',
604 'multiple' => true,
605 'label_block' => true,
606 ];
607
608 $fields['exclude_posts'] = [
609 'type' => 'rt-select2',
610 'label' => esc_html__( 'Exclude Products', 'shopbuilder' ),
611 'description' => esc_html__( 'Please select the products to show. Leave it blank to exclude none.', 'shopbuilder' ),
612 'source_name' => 'post_type',
613 'source_type' => 'product',
614 'multiple' => true,
615 'label_block' => true,
616 ];
617
618 $fields['posts_limit'] = [
619 'type' => 'number',
620 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
621 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
622 'default' => 12,
623 ];
624
625 $fields['posts_offset'] = [
626 'type' => 'number',
627 'label' => esc_html__( 'Products Offset', 'shopbuilder' ),
628 'description' => esc_html__( 'Number of products to skip.', 'shopbuilder' ),
629 ];
630
631 $fields['category_note'] = $obj->el_heading( esc_html__( 'Taxonomy Filters', 'shopbuilder' ), 'before' );
632
633 $fields['filter_categories'] = [
634 'type' => 'rt-select2',
635 'label' => esc_html__( 'Filter By Categories', 'shopbuilder' ),
636 'description' => esc_html__( 'Select the categories you want to filter, Leave it blank for all categories.', 'shopbuilder' ),
637 'source_name' => 'taxonomy',
638 'source_type' => 'product_cat',
639 'multiple' => true,
640 'label_block' => true,
641 'minimum_input_length' => 1,
642 ];
643
644 $fields['filter_tags'] = [
645 'type' => 'rt-select2',
646 'label' => esc_html__( 'Filter By Tags', 'shopbuilder' ),
647 'description' => esc_html__( 'Select the tags you want to filter, Leave it blank for all tags.', 'shopbuilder' ),
648 'source_name' => 'taxonomy',
649 'source_type' => 'product_tag',
650 'multiple' => true,
651 'label_block' => true,
652 'minimum_input_length' => 1,
653 ];
654 $fields['filter_brands'] = [
655 'type' => 'rt-select2',
656 'label' => esc_html__( 'Filter By Brand', 'shopbuilder' ),
657 'description' => esc_html__( 'Select the tags you want to filter, Leave it blank for all brands.', 'shopbuilder' ),
658 'source_name' => 'taxonomy',
659 'source_type' => 'product_brand',
660 'multiple' => true,
661 'label_block' => true,
662 'minimum_input_length' => 1,
663 ];
664
665 $fields['filter_attributes'] = [
666 'type' => 'select2',
667 'label' => esc_html__( 'Filter By Attributes', 'shopbuilder' ),
668 'description' => esc_html__( 'Select the attributes you want to filter, Leave it blank for all attributes.', 'shopbuilder' ),
669 'options' => Fns::get_all_attributes(),
670 'multiple' => true,
671 'label_block' => true,
672 ];
673
674 $fields['tax_relation'] = [
675 'type' => 'select2',
676 'label' => esc_html__( 'Taxonomy relation', 'shopbuilder' ),
677 'options' => [
678 'OR' => 'Show All Products (OR)',
679 'AND' => 'Show Common Products (AND)',
680 ],
681 'default' => 'AND',
682 'description' => esc_html__( 'Select the taxonomies relationship. It is applicable if you select more than one taxonomy.', 'shopbuilder' ),
683 'label_block' => true,
684 ];
685
686 $fields['advanced_note'] = $obj->el_heading( esc_html__( 'Advanced Filters', 'shopbuilder' ), 'before' );
687
688 $fields['filter_author'] = [
689 'type' => 'rt-select2',
690 'label' => esc_html__( 'Filter By Author', 'shopbuilder' ),
691 'description' => esc_html__( 'Select the author you want to filter, Leave it blank for all author.', 'shopbuilder' ),
692 'source_name' => 'user',
693 'multiple' => true,
694 'label_block' => true,
695 'minimum_input_length' => 1,
696 'separator' => rtsb()->has_pro() ? 'default' : 'default elementor-control-separator-after',
697 ];
698
699 $fields['products_filter'] = [
700 'type' => 'select2',
701 'label' => esc_html__( 'Display Products By:', 'shopbuilder' ),
702 'options' => ControlHelper::filter_products(),
703 'default' => rtsb()->has_pro() ? 'recent' : 'best-selling',
704 'description' => esc_html__( 'Please select the conditional display of products.', 'shopbuilder' ),
705 'label_block' => true,
706 'classes' => $obj->pro_class(),
707 ];
708
709 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
710
711 $fields['posts_order_by'] = [
712 'type' => 'select2',
713 'label' => esc_html__( 'Order By', 'shopbuilder' ),
714 'options' => ControlHelper::posts_order_by(),
715 'default' => 'date',
716 ];
717
718 if ( rtsb()->has_pro() ) {
719 $fields['products_filter']['condition'] = [ 'ajax_filter_type' => [ 'taxonomy' ] ];
720 $fields['posts_order_by']['condition'] = [
721 'ajax_filter_type' => [ 'taxonomy' ],
722 'products_filter' => 'recent',
723 ];
724 }
725
726 $fields['posts_order'] = [
727 'type' => 'select2',
728 'label' => esc_html__( 'Order', 'shopbuilder' ),
729 'options' => ControlHelper::posts_order(),
730 'default' => 'DESC',
731 ];
732
733 $fields['query_section_end'] = $obj->end_section();
734
735 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
736 }
737
738 /**
739 * Query section
740 *
741 * @param object $obj Reference object.
742 *
743 * @return array
744 */
745 public static function additional_query( $obj ) {
746 $fields['query_section'] = $obj->start_section(
747 esc_html__( 'Query', 'shopbuilder' ),
748 self::$tab
749 );
750
751 $fields['query_note'] = $obj->el_heading( esc_html__( 'Common Filters', 'shopbuilder' ) );
752
753 $fields['posts_limit'] = [
754 'type' => 'number',
755 'label' => esc_html__( 'Products Limit', 'shopbuilder' ),
756 'description' => esc_html__( 'The number of products to show. Set empty to show all products.', 'shopbuilder' ),
757 'default' => 12,
758 ];
759
760 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
761
762 $fields['posts_order_by'] = [
763 'type' => 'select2',
764 'label' => esc_html__( 'Order By', 'shopbuilder' ),
765 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
766 'options' => ControlHelper::posts_order_by(),
767 'default' => 'date',
768 ];
769
770 $fields['posts_order'] = [
771 'type' => 'select2',
772 'label' => esc_html__( 'Order', 'shopbuilder' ),
773 'description' => esc_html__( 'Please choose to reorder products.', 'shopbuilder' ),
774 'options' => ControlHelper::posts_order(),
775 'default' => 'DESC',
776 ];
777
778 $fields['query_section_end'] = $obj->end_section();
779
780 return apply_filters( 'rtsb/elements/elementor/query_control', $fields, $obj );
781 }
782
783 /**
784 * Category Query section
785 *
786 * @param object $obj Reference object.
787 *
788 * @return array
789 */
790 public static function cat_single_query( $obj ) {
791 $all_tag_list = Fns::get_tax_list();
792 unset( $all_tag_list['product_attr'] );
793 $fields['query_section'] = $obj->start_section(
794 esc_html__( 'Query', 'shopbuilder' ),
795 self::$tab
796 );
797
798 $fields['select_source'] = [
799 'type' => 'select2',
800 'label' => esc_html__( 'Select Taxonomy', 'shopbuilder' ),
801 'options' => $all_tag_list,
802 'description' => esc_html__( 'Please select the taxonomy.', 'shopbuilder' ),
803 'label_block' => true,
804 'default' => 'product_cat',
805 ];
806
807 $fields['select_cat'] = [
808 'type' => 'rt-select2',
809 'label' => esc_html__( 'Choose Category', 'shopbuilder' ),
810 'source_name' => 'taxonomy',
811 'source_type' => 'product_cat',
812 'description' => esc_html__( 'Please select the category to show.', 'shopbuilder' ),
813 'label_block' => true,
814 'minimum_input_length' => 1,
815 'condition' => [
816 'select_source' => [ 'product_cat' ],
817 ],
818 ];
819
820 $fields['select_tag'] = [
821 'type' => 'rt-select2',
822 'label' => esc_html__( 'Choose Tag', 'shopbuilder' ),
823 'source_name' => 'taxonomy',
824 'source_type' => 'product_tag',
825 'description' => esc_html__( 'Please select the tag to show.', 'shopbuilder' ),
826 'label_block' => true,
827 'minimum_input_length' => 1,
828 'condition' => [
829 'select_source' => [ 'product_tag' ],
830 ],
831 ];
832 $fields['select_brand'] = [
833 'type' => 'rt-select2',
834 'label' => esc_html__( 'Choose Brand', 'shopbuilder' ),
835 'source_name' => 'taxonomy',
836 'source_type' => 'product_brand',
837 'description' => esc_html__( 'Please select the brand to show.', 'shopbuilder' ),
838 'label_block' => true,
839 'minimum_input_length' => 1,
840 'condition' => [
841 'select_source' => [ 'product_brand' ],
842 ],
843 ];
844
845 $fields['query_section_end'] = $obj->end_section();
846
847 return apply_filters( 'rtsb/elements/elementor/cat_single_query_control', $fields, $obj );
848 }
849
850 /**
851 * Category Query section
852 *
853 * @param object $obj Reference object.
854 *
855 * @return array
856 */
857 public static function cat_query( $obj ) {
858 $fields['query_section'] = $obj->start_section(
859 esc_html__( 'Query', 'shopbuilder' ),
860 self::$tab
861 );
862
863 $fields['query_note'] = $obj->el_heading( esc_html__( 'Filter', 'shopbuilder' ) );
864
865 $fields['display_cat_by'] = [
866 'type' => 'select2',
867 'label' => esc_html__( 'Display Categories By:', 'shopbuilder' ),
868 'options' => Fns::get_cat_list(),
869 'description' => esc_html__( 'Please select what categories will be displayed.', 'shopbuilder' ),
870 'label_block' => true,
871 'default' => 'all',
872 ];
873
874 $fields['select_parent_cat'] = [
875 'type' => 'rt-select2',
876 'label' => esc_html__( 'Select Parent Category', 'shopbuilder' ),
877 'source_name' => 'taxonomy',
878 'source_type' => 'product_cat',
879 'minimum_input_length' => 1,
880 'description' => esc_html__( 'Please select the parent category to show.', 'shopbuilder' ),
881 'label_block' => true,
882 'default' => Fns::get_terms( 'product_cat', true, true ),
883 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
884 ];
885
886 $fields['include_cats'] = [
887 'type' => 'rt-select2',
888 'label' => esc_html__( 'Select Categories', 'shopbuilder' ),
889 'source_name' => 'taxonomy',
890 'source_type' => 'product_cat',
891 'description' => esc_html__( 'Please select the categories to show.', 'shopbuilder' ),
892 'label_block' => true,
893 'multiple' => true,
894 'minimum_input_length' => 1,
895 'condition' => [ 'display_cat_by' => [ 'selection' ] ],
896 ];
897
898 $fields['include_cat_ids'] = [
899 'type' => 'text',
900 'label' => esc_html__( 'Enter Category IDs', 'shopbuilder' ),
901 'description' => esc_html__( 'Please enter the category IDs separated by comma.', 'shopbuilder' ),
902 'label_block' => true,
903 'condition' => [ 'display_cat_by' => [ 'cat_ids' ] ],
904 ];
905
906 $fields['exclude_cats'] = [
907 'type' => 'rt-select2',
908 'label' => esc_html__( 'Exclude Categories', 'shopbuilder' ),
909 'source_name' => 'taxonomy',
910 'source_type' => 'product_cat',
911 'description' => esc_html__( 'Please select the categories to exclude. Leave it blank to exclude none.', 'shopbuilder' ),
912 'multiple' => true,
913 'minimum_input_length' => 1,
914 'label_block' => true,
915 'condition' => [ 'display_cat_by' => [ 'all' ] ],
916 ];
917
918 $fields['cats_limit'] = [
919 'type' => 'number',
920 'label' => esc_html__( 'Categories Limit', 'shopbuilder' ),
921 'description' => esc_html__( 'The number of categories to show. Set empty to show all categories.', 'shopbuilder' ),
922 'condition' => [ 'display_cat_by!' => [ 'selection' ] ],
923 ];
924
925 $fields['show_top_level_cats'] = [
926 'type' => 'switch',
927 'label' => __( 'Show only Top Level <br /> Sub-Categories?', 'shopbuilder' ),
928 'description' => esc_html__( 'Switch on to display only first level sub-categories.', 'shopbuilder' ),
929 'label_on' => esc_html__( 'On', 'shopbuilder' ),
930 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
931 'condition' => [ 'display_cat_by' => [ 'specific_parent' ] ],
932 ];
933
934 $fields['show_empty'] = [
935 'type' => 'switch',
936 'label' => esc_html__( 'Show Empty Categories?', 'shopbuilder' ),
937 'description' => esc_html__( 'Switch on to display empty categories.', 'shopbuilder' ),
938 'label_on' => esc_html__( 'On', 'shopbuilder' ),
939 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
940 'default' => 'yes',
941 ];
942
943 $fields['show_uncategorized'] = [
944 'type' => 'switch',
945 'label' => __( 'Show Uncategorized <br />(Or Default Category)?', 'shopbuilder' ),
946 'description' => esc_html__( 'Switch on to display uncategorized.', 'shopbuilder' ),
947 'label_on' => esc_html__( 'On', 'shopbuilder' ),
948 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
949 'default' => 'yes',
950 'condition' => [ 'display_cat_by' => [ 'all' ] ],
951 ];
952
953 $fields['show_subcats'] = [
954 'type' => 'switch',
955 'label' => esc_html__( 'Show Sub-Categories?', 'shopbuilder' ),
956 'description' => esc_html__( 'Switch on to display subcategories.', 'shopbuilder' ),
957 'label_on' => esc_html__( 'On', 'shopbuilder' ),
958 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
959 'default' => 'yes',
960 'condition' => [ 'display_cat_by' => [ 'all' ] ],
961 ];
962
963 $fields['sorting_note'] = $obj->el_heading( esc_html__( 'Sorting', 'shopbuilder' ), 'before' );
964
965 $fields['cats_order_by'] = [
966 'type' => 'select2',
967 'label' => esc_html__( 'Order By', 'shopbuilder' ),
968 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
969 'options' => ControlHelper::cats_order_by(),
970 'default' => 'name',
971 ];
972
973 $fields['cats_order'] = [
974 'type' => 'select2',
975 'label' => esc_html__( 'Order', 'shopbuilder' ),
976 'description' => esc_html__( 'Please choose to reorder categories.', 'shopbuilder' ),
977 'options' => ControlHelper::posts_order(),
978 'default' => 'ASC',
979 ];
980
981 $fields['query_section_end'] = $obj->end_section();
982
983 return apply_filters( 'rtsb/elements/elementor/cat_query_control', $fields, $obj );
984 }
985
986 /**
987 * Pagination section
988 *
989 * @param object $obj Reference object.
990 *
991 * @return array
992 */
993 public static function pagination( $obj ) {
994 $fields['pagination_section'] = $obj->start_section(
995 esc_html__( 'Pagination', 'shopbuilder' ),
996 self::$tab,
997 [],
998 rtsb()->has_pro() ? [ 'tax_filter!' => [ 'yes' ] ] : []
999 );
1000
1001 $fields['show_pagination'] = [
1002 'type' => 'switch',
1003 'label' => esc_html__( 'Enable Pagination?', 'shopbuilder' ),
1004 'description' => esc_html__( 'Switch on to enable pagination.', 'shopbuilder' ),
1005 'label_on' => esc_html__( 'On', 'shopbuilder' ),
1006 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
1007 ];
1008
1009 $fields['pagination_per_page'] = [
1010 'type' => 'number',
1011 'label' => esc_html__( 'Number of Posts Per Page', 'shopbuilder' ),
1012 'default' => 8,
1013 'description' => esc_html__( 'Please enter the number of products per page to show.', 'shopbuilder' ),
1014 'condition' => [ 'show_pagination' => [ 'yes' ] ],
1015 ];
1016
1017 $pagination_description = esc_html__( 'Please choose the pagination type', 'shopbuilder' );
1018
1019 if ( ! rtsb()->has_pro() ) {
1020 $upgrade_link = '<span class="elementor-pro-notice"><a target="_blank" href="' . esc_url( rtsb()->pro_version_link() ) . '">Upgrade to PRO</a> to unlock Load More and Ajax Pagination.</span>';
1021 $pagination_description .= $upgrade_link;
1022 }
1023
1024 $fields['pagination_type'] = [
1025 'type' => 'select',
1026 'label' => esc_html__( 'Pagination Type', 'shopbuilder' ),
1027 'description' => $pagination_description,
1028 'options' => ControlHelper::pagination_options(),
1029 'default' => 'pagination',
1030 'label_block' => true,
1031 'condition' => [ 'show_pagination' => [ 'yes' ] ],
1032 ];
1033
1034 $fields['pagination_section_end'] = $obj->end_section();
1035
1036 return apply_filters( 'rtsb/elementor/pagination_control', $fields, $obj );
1037 }
1038
1039 /**
1040 * Filter section
1041 *
1042 * @param object $obj Reference object.
1043 *
1044 * @return array
1045 */
1046 public static function filter( $obj ) {
1047 $fields['filter_section'] = $obj->start_section(
1048 esc_html__( 'Ajax Tab Filters', 'shopbuilder' ),
1049 self::$tab,
1050 );
1051
1052 $fields['filter_note'] = [
1053 'type' => 'html',
1054 'raw' => '',
1055 'content_classes' => 'elementor-panel-heading-title',
1056 ];
1057
1058 $fields['tax_filter'] = [
1059 'type' => 'switch',
1060 'label' => esc_html__( 'Enable Ajax Tab Filter Buttons?', 'shopbuilder' ),
1061 'description' => esc_html__( 'Switch on to enable Ajax tab filter buttons.', 'shopbuilder' ),
1062 'label_on' => esc_html__( 'On', 'shopbuilder' ),
1063 'label_off' => esc_html__( 'Off', 'shopbuilder' ),
1064 'separator' => $obj->pro_class(),
1065 'classes' => $obj->pro_class(),
1066 ];
1067
1068 $fields['filter_section_end'] = $obj->end_section();
1069
1070 return apply_filters( 'rtsb/elementor/filter_control', $fields, $obj );
1071 }
1072 }
1073