PluginProbe
Bricksable for Bricks Builder / 1.4.2
Bricksable for Bricks Builder v1.4.2
1.2.9 1.3.0 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.31 1.4.32 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 All 132 releases
bricksable / includes / elements / element-tilt-image.php

element-tilt-image.php in Bricksable for Bricks Builder 1.4.2, at includes/elements/element-tilt-image.php

748 lines 24.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit; // Exit if accessed directly.
5 }
6
7 class Bricksable_Tilt_Image extends \Bricks\Element {
8 public $category = 'bricksable';
9 public $name = 'ba-tilt-image';
10 public $icon = 'ti-image';
11 public $css_selector = '.ba-tilt-image-wrapper img';
12 public $scripts = array( 'bricksableTiltImage' );
13
14 public function get_label() {
15 return esc_html__( 'Tilt Image', 'bricksable' );
16 }
17 public function set_control_groups() {
18 $this->control_groups['image'] = array(
19 'title' => esc_html__( 'Image', 'bricksable' ),
20 'tab' => 'content',
21 );
22 $this->control_groups['tilt_settings'] = array(
23 'title' => esc_html__( 'Tilt Settings', 'bricksable' ),
24 'tab' => 'content',
25 );
26 $this->control_groups['tilt_alignment'] = array(
27 'title' => esc_html__( 'Alignment', 'bricksable' ),
28 'tab' => 'style',
29 );
30 $this->control_groups['overlay'] = array(
31 'title' => esc_html__( 'Overlay Content', 'bricksable' ),
32 'tab' => 'content',
33 );
34 $this->control_groups['overlay_style'] = array(
35 'title' => esc_html__( 'Overlay', 'bricksable' ),
36 'tab' => 'style',
37 );
38 unset( $this->control_groups['_typography'] );
39 }
40
41 public function set_controls() {
42 $this->controls['_gradient']['css'][0]['selector'] = '.ba-tilt-image-wrapper';
43 $this->controls['_border']['css'][] =
44 array(
45 'property' => 'border',
46 'selector' => '.ba-tilt-image-wrapper:before',
47 );
48 array(
49 'property' => 'border',
50 'selector' => '.ba-tilt-image-wrapper img',
51 );
52
53 $this->controls['image'] = array(
54 'tab' => 'content',
55 'group' => 'image',
56 'type' => 'image',
57 );
58 // Link To.
59 $this->controls['linkToSeparator'] = array(
60 'tab' => 'content',
61 'group' => 'image',
62 'type' => 'separator',
63 'label' => esc_html__( 'Link To', 'bricksable' ),
64 );
65
66 $this->controls['link'] = array(
67 'tab' => 'content',
68 'group' => 'image',
69 'type' => 'select',
70 'options' => array(
71 'lightbox' => esc_html__( 'Lightbox', 'bricksable' ),
72 'attachment' => esc_html__( 'Attachment Page', 'bricksable' ),
73 'media' => esc_html__( 'Media File', 'bricksable' ),
74 'url' => esc_html__( 'Other (URL)', 'bricksable' ),
75 ),
76 'placeholder' => esc_html__( 'None', 'bricksable' ),
77 );
78
79 $this->controls['url'] = array(
80 'tab' => 'content',
81 'group' => 'image',
82 'label' => esc_html__( 'Link type', 'bricksable' ),
83 'type' => 'link',
84 'required' => array( 'link', '=', 'url' ),
85 );
86
87 // Alignment.
88 $this->controls['tilt_textAlign'] = array(
89 'tab' => 'style',
90 'group' => 'tilt_alignment',
91 'label' => esc_html__( 'Text align', 'bricksable' ),
92 'type' => 'text-align',
93 'css' => array(
94 array(
95 'property' => 'text-align',
96 'selector' => '.ba-tilt-image-wrapper .image-overlay-content',
97 ),
98 array(
99 'property' => 'text-align',
100 'selector' => '.ba-tilt-image-wrapper .ba-tilt-image-overlay-caption',
101 ),
102 ),
103 'default' => 'center',
104 'placeholder' => esc_html__( 'Center', 'bricksable' ),
105 'inline' => true,
106 );
107
108 $this->controls['tilt_verticalAlign'] = array(
109 'tab' => 'style',
110 'group' => 'tilt_alignment',
111 'label' => esc_html__( 'Vertical align', 'bricksable' ),
112 'type' => 'align-items',
113 'exclude' => array(
114 'stretch',
115 ),
116 'css' => array(
117 array(
118 'property' => 'align-items',
119 'selector' => '.ba-tilt-image-wrapper .image-overlay-wrapper',
120 ),
121 ),
122 'inline' => true,
123 'default' => 'center',
124 'placeholder' => esc_html__( 'Center', 'bricksable' ),
125 );
126
127 // Overlay.
128 $this->controls['imageOverlayShowHover'] = array(
129 'tab' => 'content',
130 'group' => 'overlay',
131 'label' => esc_html__( 'Only show overlay on hover', 'bricksable' ),
132 'type' => 'checkbox',
133 'inline' => true,
134 'description' => esc_html__( 'Set your overlay in the style tab (Gradient/Overlay).', 'bricksable' ),
135 );
136
137 // Title & Caption.
138
139 $this->controls['title_caption_separator'] = array(
140 'tab' => 'content',
141 'group' => 'overlay',
142 'type' => 'separator',
143 'label' => esc_html__( 'Title & Caption', 'bricksable' ),
144 );
145
146 $this->controls['overlay_title'] = array(
147 'tab' => 'content',
148 'group' => 'overlay',
149 'label' => esc_html__( 'Title Type', 'bricksable' ),
150 'type' => 'select',
151 'options' => array(
152 'none' => esc_html__( 'No title', 'bricksable' ),
153 'attachment' => esc_html__( 'Attachment', 'bricksable' ),
154 'custom' => esc_html__( 'Custom', 'bricksable' ),
155 ),
156 'inline' => true,
157 'placeholder' => esc_html__( 'No title', 'bricksable' ),
158 );
159
160 $this->controls['overlay_title_custom'] = array(
161 'tab' => 'content',
162 'group' => 'overlay',
163 'label' => esc_html__( 'Overlay Title', 'bricksable' ),
164 'type' => 'text',
165 'spellcheck' => true,
166 'inlineEditing' => true,
167 'hasDynamicData' => 'text',
168 'required' => array( 'overlay_title', '=', 'custom' ),
169 );
170
171 $this->controls['overlay_title_tag'] = array(
172 'tab' => 'content',
173 'group' => 'overlay',
174 'label' => esc_html__( 'Title Tag', 'bricksable' ),
175 'type' => 'select',
176 'options' => array(
177 'h1' => esc_html__( 'Heading 1 (h1)', 'bricksable' ),
178 'h2' => esc_html__( 'Heading 2 (h2)', 'bricksable' ),
179 'h3' => esc_html__( 'Heading 3 (h3)', 'bricksable' ),
180 'h4' => esc_html__( 'Heading 4 (h4)', 'bricksable' ),
181 'h5' => esc_html__( 'Heading 5 (h5)', 'bricksable' ),
182 'h6' => esc_html__( 'Heading 6 (h6)', 'bricksable' ),
183 ),
184 'clearable' => false,
185 'pasteStyles' => false,
186 'default' => 'h3',
187 'inline' => true,
188 'required' => array( 'overlay_title', '!=', 'none' ),
189 );
190
191 $this->controls['overlay_caption'] = array(
192 'tab' => 'content',
193 'group' => 'overlay',
194 'label' => esc_html__( 'Caption Type', 'bricksable' ),
195 'type' => 'select',
196 'options' => array(
197 'none' => esc_html__( 'No caption', 'bricksable' ),
198 'attachment' => esc_html__( 'Attachment', 'bricksable' ),
199 'custom' => esc_html__( 'Custom', 'bricksable' ),
200 ),
201 'inline' => true,
202 'placeholder' => esc_html__( 'No caption', 'bricksable' ),
203 );
204
205 $this->controls['overlay_caption_custom'] = array(
206 'tab' => 'content',
207 'group' => 'overlay',
208 'label' => esc_html__( 'Custom caption', 'bricksable' ),
209 'type' => 'text',
210 'placeholder' => esc_html__( 'Here goes your caption ...', 'bricksable' ),
211 'required' => array( 'overlay_caption', '=', 'custom' ),
212 );
213
214 $this->controls['overlayShowHover'] = array(
215 'tab' => 'content',
216 'group' => 'overlay',
217 'label' => esc_html__( 'Only show on hover', 'bricksable' ),
218 'type' => 'checkbox',
219 'inline' => true,
220 );
221
222 $this->controls['overlay_icon_separator'] = array(
223 'tab' => 'content',
224 'group' => 'overlay',
225 'label' => esc_html__( 'Icon', 'bricksable' ),
226 'type' => 'separator',
227 'inline' => true,
228 'small' => true,
229 );
230
231 $this->controls['overlay_icon'] = array(
232 'tab' => 'content',
233 'group' => 'overlay',
234 'label' => esc_html__( 'Icon', 'bricksable' ),
235 'type' => 'icon',
236 'inline' => true,
237 'small' => true,
238 );
239
240 $this->controls['overlay_translatez'] = array(
241 'tab' => 'style',
242 'group' => 'overlay_style',
243 'label' => esc_html__( 'Overlay Content Distance', 'bricksable' ),
244 'type' => 'slider',
245 'css' => array(
246 array(
247 'property' => 'transform:translateZ',
248 'selector' => '.image-overlay-wrapper',
249 ),
250 ),
251 'units' => array(
252 'px' => array(
253 'min' => 1,
254 'max' => 200,
255 'step' => 1,
256 ),
257 ),
258 'default' => '50px',
259 'description' => esc_html__( 'Adjust the distance between the image and the overlay content.', 'bricksable' ),
260 );
261
262 $this->controls['overlay_title_typography'] = array(
263 'tab' => 'style',
264 'group' => 'overlay_style',
265 'label' => esc_html__( 'Title Typography', 'bricksable' ),
266 'type' => 'typography',
267 'css' => array(
268 array(
269 'property' => 'font',
270 'selector' => '.ba-tilt-image-overlay-title',
271 ),
272 ),
273 'inline' => true,
274 'small' => true,
275 'required' => array( 'overlay_title', '!=', '' ),
276 );
277
278 $this->controls['overlay_caption_typography'] = array(
279 'tab' => 'style',
280 'group' => 'overlay_style',
281 'label' => esc_html__( 'Caption Typography', 'bricksable' ),
282 'type' => 'typography',
283 'css' => array(
284 array(
285 'property' => 'font',
286 'selector' => '.ba-tilt-image-caption',
287 ),
288 ),
289 'inline' => true,
290 'small' => true,
291 'required' => array( 'overlay_title', '!=', '' ),
292 );
293
294 $this->controls['overlay_style_icon_separator'] = array(
295 'tab' => 'style',
296 'group' => 'overlay_style',
297 'label' => esc_html__( 'Icon', 'bricksable' ),
298 'type' => 'separator',
299 'inline' => true,
300 'small' => true,
301 );
302
303 $this->controls['overlay_icon_border'] = array(
304 'tab' => 'style',
305 'group' => 'overlay_style',
306 'label' => esc_html__( 'Icon border', 'bricksable' ),
307 'type' => 'border',
308 'css' => array(
309 array(
310 'property' => 'border',
311 'selector' => '.image-overlay-wrapper .overlay-icon',
312 ),
313 ),
314 'inline' => true,
315 'small' => true,
316 'required' => array( 'overlay_icon', '!=', '' ),
317 );
318
319 $this->controls['overlay_icon_boxshadow'] = array(
320 'tab' => 'style',
321 'group' => 'overlay_style',
322 'label' => esc_html__( 'Icon box shadow', 'bricksable' ),
323 'type' => 'box-shadow',
324 'css' => array(
325 array(
326 'property' => 'box-shadow',
327 'selector' => '.image-overlay-wrapper .overlay-icon',
328 ),
329 ),
330 'inline' => true,
331 'small' => true,
332 'required' => array( 'overlay_icon', '!=', '' ),
333 );
334
335 $this->controls['overlay_icon_height'] = array(
336 'tab' => 'style',
337 'group' => 'overlay_style',
338 'label' => esc_html__( 'Icon height', 'bricksable' ),
339 'type' => 'number',
340 'unit' => 'px',
341 'css' => array(
342 array(
343 'property' => 'line-height',
344 'selector' => '.image-overlay-wrapper .overlay-icon',
345 ),
346 ),
347 'inline' => true,
348 'small' => true,
349 'required' => array( 'overlay_icon', '!=', '' ),
350 );
351
352 $this->controls['overlay_icon_width'] = array(
353 'tab' => 'style',
354 'group' => 'overlay_style',
355 'label' => esc_html__( 'Icon width', 'bricksable' ),
356 'type' => 'number',
357 'unit' => 'px',
358 'css' => array(
359 array(
360 'property' => 'width',
361 'selector' => '.image-overlay-wrapper .overlay-icon',
362 ),
363 ),
364 'inline' => true,
365 'small' => true,
366 'required' => array( 'overlay_icon', '!=', '' ),
367 );
368
369 $this->controls['overlay_icon_typography'] = array(
370 'tab' => 'style',
371 'group' => 'overlay_style',
372 'label' => esc_html__( 'Icon typography', 'bricksable' ),
373 'type' => 'typography',
374 'exclude' => array(
375 'font-family',
376 'font-weight',
377 'text-align',
378 'text-transform',
379 'line-height',
380 'letter-spacing',
381 ),
382 'css' => array(
383 array(
384 'property' => 'font',
385 'selector' => '.image-overlay-wrapper .overlay-icon',
386 ),
387 ),
388 'inline' => true,
389 'small' => true,
390 'required' => array( 'overlay_icon', '!=', '' ),
391 );
392
393 // Tilt Settings.
394 $this->controls['tilt_reverse'] = array(
395 'tab' => 'content',
396 'group' => 'tilt_settings',
397 'label' => esc_html__( 'Reverse', 'bricksable' ),
398 'type' => 'checkbox',
399 'inline' => true,
400 'description' => esc_html__( 'Reverse the tilt direction.', 'bricksable' ),
401 );
402 $this->controls['tilt_max'] = array(
403 'tab' => 'content',
404 'group' => 'tilt_settings',
405 'label' => esc_html__( 'Tilt rotation', 'bricksable' ),
406 'type' => 'slider',
407 'unitless' => true,
408 'min' => 10,
409 'max' => 100,
410 'step' => '1',
411 'default' => 40,
412 );
413
414 $this->controls['tilt_speed'] = array(
415 'tab' => 'content',
416 'group' => 'tilt_settings',
417 'label' => esc_html__( 'Tilt Speed', 'bricksable' ),
418 'type' => 'slider',
419 'unitless' => true,
420 'min' => 200,
421 'max' => 2000,
422 'step' => '100',
423 'default' => 1000,
424 );
425
426 $this->controls['tilt_perspective'] = array(
427 'tab' => 'content',
428 'group' => 'tilt_settings',
429 'label' => esc_html__( 'Tilt Perspective', 'bricksable' ),
430 'type' => 'slider',
431 'unitless' => true,
432 'min' => 200,
433 'max' => 1200,
434 'step' => '100',
435 'default' => 1000,
436 );
437
438 $this->controls['tilt_scale'] = array(
439 'tab' => 'content',
440 'group' => 'tilt_settings',
441 'label' => esc_html__( 'Tilt Scale', 'bricksable' ),
442 'type' => 'number',
443 'unitless' => true,
444 'min' => 1,
445 'max' => 2,
446 'step' => '0.1',
447 'default' => 1,
448 );
449
450 $this->controls['tilt_glare'] = array(
451 'tab' => 'content',
452 'group' => 'tilt_settings',
453 'label' => esc_html__( 'Use glare', 'bricksable' ),
454 'type' => 'checkbox',
455 'inline' => true,
456 'description' => esc_html__( 'Setting this option will enable a glare effect.', 'bricksable' ),
457 );
458
459 $this->controls['tilt_max_glare'] = array(
460 'tab' => 'content',
461 'group' => 'tilt_settings',
462 'label' => esc_html__( 'Max Glare', 'bricksable' ),
463 'type' => 'number',
464 'unitless' => true,
465 'min' => 0.1,
466 'max' => 1,
467 'step' => '0.1',
468 'default' => 0.8,
469 'required' => array( 'tilt_glare', '=', true ),
470 );
471 }
472
473 public function enqueue_scripts() {
474 wp_enqueue_style( 'ba-tilt-image' );
475 wp_enqueue_script( 'ba-tilt-image' );
476 wp_localize_script(
477 'ba-tilt-image',
478 'bricksableTiltImageData',
479 array(
480 'tiltImageInstances' => array(),
481 )
482 );
483 }
484
485 public function get_normalized_image_settings( $settings ) {
486 if ( ! isset( $settings['image'] ) ) {
487 $settings['image'] = array(
488 'id' => 0,
489 'url' => '',
490 );
491 return $settings;
492 }
493
494 $image = $settings['image'];
495
496 if ( isset( $image['useDynamicData']['name'] ) ) {
497 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
498 $image['id'] = empty( $images ) ? 0 : $images[0];
499 } else {
500 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
501 }
502
503 // Image Size.
504 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
505
506 // Image URL.
507 if ( ! isset( $image['url'] ) ) {
508 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
509 }
510
511 $settings['image'] = $image;
512
513 return $settings;
514 }
515
516 public function render() {
517 $settings = $this->settings;
518 $settings = $this->get_normalized_image_settings( $settings );
519
520 $tilt_max = isset( $settings['tilt_max'] ) ? intval( $settings['tilt_max'] ) : 40;
521 $tilt_speed = isset( $settings['tilt_speed'] ) ? intval( $settings['tilt_speed'] ) : 1000;
522 $tilt_perspective = isset( $settings['tilt_perspective'] ) ? intval( $settings['tilt_perspective'] ) : 1000;
523 $tilt_scale = isset( $settings['tilt_scale'] ) ? round( $settings['tilt_scale'], 1 ) : 1;
524 $tilt_glare = isset( $settings['tilt_glare'] ) ? true : false;
525 $tilt_maxglare = isset( $settings['tilt_max_glare'] ) ? round( $settings['tilt_max_glare'], 1 ) : 1;
526 $tilt_reverse = isset( $settings['tilt_reverse'] ) ? true : false;
527
528 $tilt_options = array(
529 'max' => $tilt_max,
530 'speed' => $tilt_speed,
531 'perspective' => $tilt_perspective,
532 'scale' => $tilt_scale,
533 'glare' => $tilt_glare,
534 'max-glare' => $tilt_maxglare,
535 'reverse' => $tilt_reverse,
536 );
537
538 // Dynamic Data is empty.
539 if ( isset( $settings['image']['useDynamicData']['name'] ) ) {
540
541 if ( empty( $settings['image']['id'] ) ) {
542
543 if ( 'ACF' === $settings['image']['useDynamicData']['group'] && ! class_exists( 'ACF' ) ) {
544 $message = esc_html__( 'Can\'t render element, as the selected ACF field is not available. Please activate ACF or edit the element to select different data.', 'bricksable' );
545 } elseif ( '{featured_image}' === $settings['image']['useDynamicData']['name'] ) {
546 $message = esc_html__( 'No featured image set.', 'bricksable' );
547 } else {
548 /* translators: 1: Data 2: Dynamic Value */
549 $message = esc_html__( 'Dynamic Data %1$s (%2$s) is empty.', 'bricksable' );
550 }
551
552 $this->set_attribute( 'ba-no-image-wrapper', 'class', 'ba-tilt-image-wrapper' );
553 $this->set_attribute( 'ba-no-image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
554 $this->set_attribute( 'ba-no-image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
555
556 echo '<div ' . $this->render_attributes( 'ba-no-image-wrapper' ) . '>'; //phpcs:ignore
557
558 return $this->render_element_placeholder(
559 array(
560 'icon-class' => 'ti-image',
561 'text' => sprintf(
562 $message,
563 $settings['image']['useDynamicData']['label'],
564 $settings['image']['useDynamicData']['group']
565 ),
566 )
567 );
568 //phpcs:ignore
569 echo '</div>';
570
571 }
572 } else {
573 // Image id is empty or doesn't exist.
574 // No image.
575 if ( empty( $settings['image']['id'] ) ) {
576 $this->set_attribute( 'ba-no-image-wrapper', 'class', 'ba-tilt-image-wrapper' );
577 $this->set_attribute( 'ba-no-image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
578 $this->set_attribute( 'ba-no-image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
579
580 echo '<div ' . $this->render_attributes( 'ba-no-image-wrapper' ) . '>'; //phpcs:ignore
581
582 return $this->render_element_placeholder(
583 array(
584 'icon-class' => 'ti-image',
585 'text' => esc_html__( 'No image selected.', 'bricksable' ),
586 )
587 );
588 //phpcs:ignore
589 echo '</div>';
590 }
591
592 // Return if image ID does not exist.
593 if ( ! wp_get_attachment_image_src( $settings['image']['id'] ) ) {
594 return $this->render_element_placeholder(
595 array(
596 'icon-class' => 'ti-image',
597 /* translators: 1: Image ID */
598 'text' => sprintf( esc_html__( 'Image ID (%s) no longer exist. Please select another image.', 'bricksable' ), $settings['image']['id'] ),
599 )
600 );
601 }
602 }
603
604 // Render.
605 $image_atts = array();
606 $image_atts['id'] = 'image-' . $settings['image']['id'];
607
608 $image_wrapper_classes = array( 'ba-tilt-image-wrapper' );
609 $img_classes = array( 'post-thumbnail', 'css-filter' );
610
611 if ( isset( $settings['overlayShowHover'] ) ) {
612 $image_wrapper_classes[] = 'ba-tilt-image-show-hover';
613 }
614
615 if ( isset( $settings['imageOverlayShowHover'] ) ) {
616 $image_wrapper_classes[] = 'ba-tilt-image-overlay-hover';
617 }
618
619 if ( isset( $settings['link'] ) && 'lightbox' === $settings['link'] ) {
620 $image_wrapper_classes[] = 'bricks-lightbox';
621
622 $image_src = $settings['image']['id'] ? wp_get_attachment_image_src( $settings['image']['id'], 'full' ) : array(
623 \Bricks\Builder::get_template_placeholder_image(),
624 800,
625 600,
626 );
627 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-source="' . $image_src[0] . '"' );
628 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-width="' . $image_src[1] . '"' );
629 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-height="' . $image_src[2] . '"' );
630 }
631
632 $img_classes[] = 'size-' . $settings['image']['size'];
633 $image_atts['class'] = join( ' ', $img_classes );
634
635 // Title.
636 $show_title = isset( $settings['overlay_title'] ) ? $settings['overlay_title'] : 'none';
637
638 if ( 'none' === $show_title ) {
639 $image_title = false;
640 } elseif ( 'custom' === $show_title && isset( $settings['overlay_title_custom'] ) ) {
641 $image_title = trim( $settings['overlay_title_custom'] );
642 } else {
643 $image_data = get_post( $settings['image']['id'] );
644 $image_title = $image_data ? $image_data->post_title : '';
645 }
646
647 // Caption.
648 $show_caption = isset( $settings['overlay_caption'] ) ? $settings['overlay_caption'] : 'none';
649
650 if ( 'none' === $show_caption ) {
651 $image_caption = false;
652 } elseif ( 'custom' === $show_caption && isset( $settings['overlay_caption_custom'] ) ) {
653 $image_caption = trim( $settings['overlay_caption_custom'] );
654 } else {
655 $image_data = get_post( $settings['image']['id'] );
656 $image_caption = $image_data ? $image_data->post_excerpt : '';
657 }
658
659 $this->set_attribute( 'image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
660
661 $this->set_attribute( 'image-wrapper', 'class', $image_wrapper_classes );
662 $this->set_attribute( 'image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
663 $this->set_attribute( 'image-wrapper', 'data-tilt' );
664 $this->set_attribute( 'image-wrapper', 'data-tilt-max="' . $tilt_max . '"' );
665 $this->set_attribute( 'image-wrapper', 'data-tilt-speed="' . $tilt_speed . '"' );
666 $this->set_attribute( 'image-wrapper', 'data-tilt-perspective="' . $tilt_perspective . '"' );
667 $this->set_attribute( 'image-wrapper', 'data-tilt-scale="' . $tilt_scale . '"' );
668 $this->set_attribute( 'image-wrapper', true === $tilt_glare ? ' data-tilt-glare' : '' );
669 $this->set_attribute( 'image-wrapper', 'data-tilt-max-glare="' . $tilt_maxglare . '"' );
670 $this->set_attribute( 'image-wrapper', 'data-tilt-reverse="' . $tilt_reverse . '"' );
671
672 echo '<figure ' . $this->render_attributes( 'image-wrapper' ) . '>'; //phpcs:ignore
673
674 $close_a_tag = false;
675
676 if ( isset( $settings['link'] ) && 'media' === $settings['link'] ) {
677 $close_a_tag = true;
678
679 echo '<a href="' . esc_url( wp_get_attachment_url( $settings['image']['id'] ) ) . '" target="_blank">';
680 }
681
682 if ( isset( $settings['link'] ) && 'attachment' === $settings['link'] ) {
683 echo '<a href="' . esc_url( get_permalink( $settings['image']['id'] ) ) . '" target="_blank">';
684 }
685
686 if ( isset( $settings['link'] ) && 'url' === $settings['link'] && isset( $settings['url'] ) ) {
687 $close_a_tag = true;
688
689 // Link.
690 $this->set_link_attributes( 'a', $settings['url'] );
691
692 echo '<a ' . $this->render_attributes( 'a' ) . '>'; //phpcs:ignore
693 }
694
695 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
696 if ( isset( $settings['image']['id'] ) ) {
697 echo wp_get_attachment_image( $settings['image']['id'], $settings['image']['size'], false, $image_atts );
698 } elseif ( ! empty( $settings['image']['url'] ) ) {
699 echo '<img src="' . esc_url( $settings['image']['url'] ) . '">';
700 }
701
702 if ( 'none' !== $show_title || 'none' !== $show_caption || isset( $settings['overlay_icon']['icon'] ) ) {
703 $overlay_title_tag = isset( $settings['overlay_title_tag'] ) ? esc_html( $settings['overlay_title_tag'] ) : 'h3';
704 $overlay_title_classes = array(
705 'ba-tilt-image-overlay-title',
706 'bricks-heading',
707 'bricks-heading-' . $overlay_title_tag,
708 );
709 $this->set_attribute( 'overlay_title', $overlay_title_tag );
710 $this->set_attribute( 'overlay_title', 'class', $overlay_title_classes );
711 if ( isset( $settings['overlay_icon']['icon'] ) ) {
712 $icon_classes = array( 'overlay-icon', $settings['overlay_icon']['icon'], 'icon' );
713 $this->set_attribute( 'overlay-icon-wrapper', 'class', 'overlay-icon-wrapper' );
714 $this->set_attribute( 'overlay-icon', 'class', $icon_classes );
715 }
716
717 $overlay_title_output = '<' . $this->render_attributes( 'overlay_title' ) . '>' . esc_html( $image_title ) . '</' . $overlay_title_tag . '>';
718
719 $this->set_attribute( 'image-overlay-wrapper', 'class', 'image-overlay-wrapper' );
720 $this->set_attribute( 'image-overlay-content', 'class', 'image-overlay-content' );
721
722 echo '<div ' . $this->render_attributes( 'image-overlay-wrapper' ) . '>'; //phpcs:ignore
723 echo '<div ' . $this->render_attributes( 'image-overlay-content' ) . '>'; //phpcs:ignore
724 if ( isset( $settings['overlay_icon']['icon'] ) ) {
725 echo '<div ' . $this->render_attributes( 'overlay-icon-wrapper' ) . '>'; //phpcs:ignore
726 echo '<i ' . $this->render_attributes( 'overlay-icon' ) . '></i>'; //phpcs:ignore
727 echo '</div>';
728 }
729 if ( $image_title ) {
730 //phpcs:ignore
731 echo $overlay_title_output;
732 }
733 if ( $image_caption ) {
734 echo '<figcaption class="ba-tilt-image-overlay-caption">' . esc_html( $image_caption ) . '</figcaption>';
735 }
736 echo '</div>';
737 echo '</div>';
738 }
739
740 if ( $close_a_tag ) {
741 echo '</a>';
742 }
743
744 echo '</figure>';
745
746 }
747 }
748