PluginProbe ʕ •ᴥ•ʔ
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More / 4.0.8
Superb Addons: Blocks, Patterns, Pre-built Pages, Sliders, Popups, Free Forms, Animations & More v4.0.8
4.0.8 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 1 week ago form 1 week ago import 1 week ago popup 1 week ago templates 1 week ago class-gutenberg-block-styles.php 1 week ago class-gutenberg-cache-util.php 1 week ago class-gutenberg-conditions-controller.php 1 week ago class-gutenberg-controller.php 1 week ago class-gutenberg-dynamic-content-controller.php 1 week ago class-gutenberg-enhancements-controller.php 1 week ago class-gutenberg-social-icons-controller.php 1 week ago class-gutenberg-sticky-controller.php 1 week ago class-gutenberg-z-index-controller.php 1 week 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