PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 4.0.0
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v4.0.0
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 trunk 1.0.0 2.0.0 2.0.1 2.0.2 2.0.3 3.0 3.0.1 3.0.2 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.2 3.1.3 3.2.0 3.2.1 3.2.2 3.2.4 3.2.5 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.4.5 3.4.6 3.5.0 3.5.1 3.5.2 3.5.3 3.5.4 3.5.6 3.5.7 3.5.8 3.5.9 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1
superb-blocks / src / gutenberg / class-gutenberg-sticky-controller.php
superb-blocks / src / gutenberg Last commit date
block-api 2 months ago form 2 months ago import 2 months ago popup 2 months ago templates 2 months ago class-gutenberg-block-styles.php 2 months ago class-gutenberg-cache-util.php 2 months ago class-gutenberg-conditions-controller.php 2 months ago class-gutenberg-controller.php 2 months ago class-gutenberg-dynamic-content-controller.php 2 months ago class-gutenberg-enhancements-controller.php 2 months ago class-gutenberg-social-icons-controller.php 2 months ago class-gutenberg-sticky-controller.php 2 months ago class-gutenberg-z-index-controller.php 2 months ago
class-gutenberg-sticky-controller.php
100 lines
1 <?php
2
3 namespace SuperbAddons\Gutenberg\Controllers;
4
5 defined('ABSPATH') || exit();
6
7 use WP_HTML_Tag_Processor;
8
9 class GutenbergStickyController
10 {
11 const FRONTEND_SCRIPT_HANDLE = 'superbaddons-sticky';
12
13 public static function Initialize()
14 {
15 add_filter('render_block', array(__CLASS__, 'FilterStickyRender'), 9, 2);
16 }
17
18 public static function FilterStickyRender($block_content, $block)
19 {
20 if (empty($block_content)) {
21 return $block_content;
22 }
23
24 if (isset($block['blockName']) && $block['blockName'] === 'superb-addons/popup') {
25 return $block_content;
26 }
27
28 $attrs = isset($block['attrs']) && is_array($block['attrs']) ? $block['attrs'] : array();
29 if (empty($attrs['spbaddStickyEnabled'])) {
30 return $block_content;
31 }
32
33 $position = isset($attrs['spbaddStickyPosition']) ? $attrs['spbaddStickyPosition'] : 'top';
34 if (!in_array($position, array('top', 'bottom'), true)) {
35 $position = 'top';
36 }
37
38 $scope = isset($attrs['spbaddStickyScope']) ? $attrs['spbaddStickyScope'] : 'screen';
39 if (!in_array($scope, array('screen', 'parent', 'top-level'), true)) {
40 $scope = 'screen';
41 }
42
43 $offset = self::SanitizeOffset(isset($attrs['spbaddStickyOffset']) ? $attrs['spbaddStickyOffset'] : '0px');
44
45 $disable_on = array();
46 if (isset($attrs['spbaddStickyDisableOn']) && is_array($attrs['spbaddStickyDisableOn'])) {
47 $disable_on = array_values(array_intersect(
48 $attrs['spbaddStickyDisableOn'],
49 array('desktop', 'tablet', 'mobile')
50 ));
51 }
52
53 $processor = new WP_HTML_Tag_Processor($block_content);
54 if (!$processor->next_tag()) {
55 return $block_content;
56 }
57
58 $processor->set_attribute('data-spbadd-sticky', 'true');
59 $processor->set_attribute('data-spbadd-sticky-position', $position);
60 $processor->set_attribute('data-spbadd-sticky-scope', $scope);
61
62 if (!empty($disable_on)) {
63 $processor->set_attribute('data-spbadd-sticky-disable', implode(',', $disable_on));
64 }
65
66 $existing_style = $processor->get_attribute('style');
67 $existing_style = is_string($existing_style) ? $existing_style : '';
68 if ($existing_style !== '' && substr($existing_style, -1) !== ';') {
69 $existing_style .= ';';
70 }
71 $existing_style .= '--spbadd-sticky-offset:' . $offset . ';--spbadd-sticky-z:10;';
72 $processor->set_attribute('style', $existing_style);
73
74 wp_enqueue_script(
75 self::FRONTEND_SCRIPT_HANDLE,
76 SUPERBADDONS_ASSETS_PATH . '/js/dynamic-blocks/sticky.js',
77 array(),
78 SUPERBADDONS_VERSION,
79 true
80 );
81
82 return $processor->get_updated_html();
83 }
84
85 private static function SanitizeOffset($raw)
86 {
87 $raw = is_string($raw) ? trim($raw) : (string) $raw;
88 if ($raw === '') {
89 return '0px';
90 }
91 if (preg_match('/^-?\d*\.?\d+$/', $raw)) {
92 return $raw . 'px';
93 }
94 if (preg_match('/^-?\d*\.?\d+(px|rem|em|vh|%)$/i', $raw)) {
95 return strtolower($raw);
96 }
97 return '0px';
98 }
99 }
100