PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / extensions / blocks / cookie-consent / cookie-consent.php
jetpack / extensions / blocks / cookie-consent Last commit date
cookie-consent.php 7 months ago
cookie-consent.php
203 lines
1 <?php
2 /**
3 * Cookie-consent Block.
4 *
5 * @since 12.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\CookieConsent;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit( 0 );
17 }
18
19 const COOKIE_NAME = 'eucookielaw';
20
21 /**
22 * Should the block be registered?
23 * In wp-admin, we only want to show the block in the site editor.
24 *
25 * @since 12.0
26 *
27 * @return bool
28 */
29 function should_register_block() {
30 global $pagenow;
31
32 // Always register the widget if we're on the front end
33 if ( ! is_admin() ) {
34 return true;
35 }
36
37 if ( is_admin() && $pagenow === 'site-editor.php' ) {
38 return true;
39 }
40 }
41
42 /**
43 * Registers the block for use in Gutenberg
44 * This is done via an action so that we can disable
45 * registration if we need to.
46 */
47 function register_block() {
48 if ( ! should_register_block() ) {
49 return;
50 }
51
52 Blocks::jetpack_register_block(
53 __DIR__,
54 array(
55 'render_callback' => __NAMESPACE__ . '\load_assets',
56 'attributes' => array(
57 'render_from_template' => array(
58 'default' => false,
59 'type' => 'boolean',
60 ),
61 ),
62 )
63 );
64 }
65 add_action( 'init', __NAMESPACE__ . '\register_block' );
66
67 /**
68 * Cookie-consent block registration/dependency declaration.
69 *
70 * @param array $attr Array containing the Cookie-consent block attributes.
71 * @param string $content String containing the Cookie-consent block content.
72 *
73 * @return string
74 */
75 function load_assets( $attr, $content ) {
76 // We want to bust the cache even if the cookie isn't set.
77 // This is needed for when the cookie expires,
78 // and we should send fresh HTML with the cookie block in it.
79 notify_batcache_that_content_changed();
80
81 if (
82 /**
83 * Filters the display of the Cookie-consent Block e.g by GDPR CMP banner on WordAds sites.
84 *
85 * @since 13.2
86 *
87 * @param bool $disable_cookie_consent_block Whether to disable the Cookie-consent Block.
88 */
89 apply_filters( 'jetpack_disable_cookie_consent_block', false )
90 ) {
91 return '';
92 }
93
94 // If the user has already accepted the cookie consent, don't show the block.
95 if ( isset( $_COOKIE[ COOKIE_NAME ] ) ) {
96 return '';
97 }
98
99 $option = get_option( 'cookie_consent_template' );
100 if ( ! empty( $option ) && empty( $attr['render_from_template'] ) ) {
101 return '';
102 }
103
104 /*
105 * Enqueue necessary scripts and styles.
106 */
107 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
108
109 /*
110 * Add a fallback color to block styles.
111 */
112 $content = add_css_fallback_values( $content );
113
114 return sprintf(
115 '<div class="%1$s">%2$s</div>',
116 esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
117 $content
118 );
119 }
120
121 /**
122 * Batcache busting: since the cookie consent is part of the cached response HTML, it can still render even when the cookie is set (when it shouldn't).
123 * Because, by default, the cache doesn't vary around the cookie's value. This makes the cookie value part of the cache key.
124 *
125 * See: https://github.com/Automattic/batcache/blob/d4f617b335e9772a61b6d03ad3498b55c8137592/advanced-cache.php#L29
126 */
127 function notify_batcache_that_content_changed() {
128 if ( function_exists( 'vary_cache_on_function' ) ) {
129 vary_cache_on_function( 'return isset( $_COOKIE[ "' . COOKIE_NAME . '" ] );' );
130 }
131 }
132
133 /**
134 * Render the cookie consent template.
135 *
136 * @since 12.4
137 */
138 function render_cookie_consent_template() {
139
140 if ( is_admin() ) {
141 return;
142 }
143
144 // Check whether block theme functions exist.
145 if ( ! function_exists( 'parse_blocks' ) ) {
146 return;
147 }
148
149 $template = get_option( 'cookie_consent_template' );
150
151 if ( empty( $template ) ) {
152 return;
153 }
154
155 $parsed = parse_blocks( $template );
156 if ( ! empty( $parsed[0] ) ) {
157 $parsed[0]['attrs']['render_from_template'] = true;
158 echo render_block( $parsed[0] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
159 }
160 }
161 add_action( 'wp_footer', __NAMESPACE__ . '\render_cookie_consent_template' );
162
163 /**
164 * Register cookie_consent_template setting
165 *
166 * @since 12.4
167 */
168 function cookie_consent_register_settings() {
169 register_setting(
170 'general',
171 'cookie_consent_template',
172 array(
173 'type' => 'string',
174 'show_in_rest' => true,
175 )
176 );
177 }
178
179 add_action( 'rest_api_init', __NAMESPACE__ . '\cookie_consent_register_settings' );
180
181 /**
182 * Add a fallback color to block styles.
183 *
184 * @since 15.1
185 *
186 * @param string $content The block content.
187 * @return string The content with fallback values added to CSS custom properties.
188 */
189 function add_css_fallback_values( $content ) {
190 // Define the CSS custom properties and their fallback values.
191 $css_fallbacks = array(
192 'var(--wp--preset--color--contrast)' => 'var(--wp--preset--color--contrast, #000000)',
193 'var(--wp--preset--color--tertiary)' => 'var(--wp--preset--color--tertiary, #f0f0f0)',
194 );
195
196 // Replace CSS custom properties with their fallback versions.
197 foreach ( $css_fallbacks as $original => $with_fallback ) {
198 $content = str_replace( $original, $with_fallback, $content );
199 }
200
201 return $content;
202 }
203