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