PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.0.3
Jetpack – WP Security, Backup, Speed, & Growth v15.0.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 1 year ago
cookie-consent.php
175 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 return sprintf(
110 '<div class="%1$s">%2$s</div>',
111 esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
112 $content
113 );
114 }
115
116 /**
117 * 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).
118 * Because, by default, the cache doesn't vary around the cookie's value. This makes the cookie value part of the cache key.
119 *
120 * See: https://github.com/Automattic/batcache/blob/d4f617b335e9772a61b6d03ad3498b55c8137592/advanced-cache.php#L29
121 */
122 function notify_batcache_that_content_changed() {
123 if ( function_exists( 'vary_cache_on_function' ) ) {
124 vary_cache_on_function( 'return isset( $_COOKIE[ "' . COOKIE_NAME . '" ] );' );
125 }
126 }
127
128 /**
129 * Render the cookie consent template.
130 *
131 * @since 12.4
132 */
133 function render_cookie_consent_template() {
134
135 if ( is_admin() ) {
136 return;
137 }
138
139 // Check whether block theme functions exist.
140 if ( ! function_exists( 'parse_blocks' ) ) {
141 return;
142 }
143
144 $template = get_option( 'cookie_consent_template' );
145
146 if ( empty( $template ) ) {
147 return;
148 }
149
150 $parsed = parse_blocks( $template );
151 if ( ! empty( $parsed[0] ) ) {
152 $parsed[0]['attrs']['render_from_template'] = true;
153 echo render_block( $parsed[0] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
154 }
155 }
156 add_action( 'wp_footer', __NAMESPACE__ . '\render_cookie_consent_template' );
157
158 /**
159 * Register cookie_consent_template setting
160 *
161 * @since 12.4
162 */
163 function cookie_consent_register_settings() {
164 register_setting(
165 'general',
166 'cookie_consent_template',
167 array(
168 'type' => 'string',
169 'show_in_rest' => true,
170 )
171 );
172 }
173
174 add_action( 'rest_api_init', __NAMESPACE__ . '\cookie_consent_register_settings' );
175