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 / modules / widgets / class-jetpack-eu-cookie-law-widget.php
jetpack / modules / widgets Last commit date
authors 7 months ago contact-info 7 months ago eu-cookie-law 7 months ago facebook-likebox 11 years ago flickr 7 months ago gallery 7 months ago goodreads 7 months ago google-translate 1 year ago image-widget 7 months ago instagram 4 months ago internet-defense-league 1 year ago milestone 4 months ago my-community 7 months ago social-icons 4 months ago social-media-icons 7 months ago top-posts 7 months ago wordpress-post-widget 2 weeks ago authors.php 7 months ago blog-stats.php 7 months ago class-jetpack-eu-cookie-law-widget.php 1 month ago class-jetpack-instagram-widget.php 6 months ago contact-info.php 1 month ago customizer-controls.css 7 months ago customizer-utils.js 1 year ago facebook-likebox.php 1 month ago flickr.php 7 months ago gallery.php 1 month ago goodreads.php 1 month ago google-translate.php 1 month ago gravatar-profile.css 7 months ago gravatar-profile.php 1 month ago image-widget.php 7 months ago internet-defense-league.php 7 months ago mailchimp.php 7 months ago milestone.php 7 months ago my-community.php 1 month ago rsslinks-widget.php 2 weeks ago simple-payments.php 7 months ago social-icons.php 1 month ago social-media-icons.php 7 months ago top-posts.php 1 month ago twitter-timeline-admin.js 1 year ago twitter-timeline.php 2 weeks ago upcoming-events.php 7 months ago wordpress-post-widget.php 7 months ago
class-jetpack-eu-cookie-law-widget.php
353 lines
1 <?php
2 /**
3 * Main class file for EU Cookie Law Widget.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Assets;
9
10 /**
11 * Disable direct access/execution to/of the widget code.
12 */
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit( 0 );
15 }
16
17 if ( ! class_exists( 'Jetpack_EU_Cookie_Law_Widget' ) ) {
18 /**
19 * EU Cookie Law Widget
20 *
21 * Display the EU Cookie Law banner in the bottom part of the screen.
22 */
23 class Jetpack_EU_Cookie_Law_Widget extends WP_Widget {
24 /**
25 * EU Cookie Law cookie name.
26 *
27 * @var string
28 */
29 public static $cookie_name = 'eucookielaw';
30
31 /**
32 * Default hide options.
33 *
34 * @var array
35 */
36 private $hide_options = array(
37 'button',
38 'scroll',
39 'time',
40 );
41
42 /**
43 * Default text options.
44 *
45 * @var array
46 */
47 private $text_options = array(
48 'default',
49 'custom',
50 );
51
52 /**
53 * Default color scheme options.
54 *
55 * @var array
56 */
57 private $color_scheme_options = array(
58 'default',
59 'negative',
60 );
61
62 /**
63 * Default policy URL options.
64 *
65 * @var array
66 */
67 private $policy_url_options = array(
68 'default',
69 'custom',
70 );
71
72 /**
73 * Widget position options.
74 *
75 * @var array
76 */
77 private $position_options = array(
78 'bottom',
79 'top',
80 );
81
82 /**
83 * Constructor.
84 */
85 public function __construct() {
86 parent::__construct(
87 'eu_cookie_law_widget',
88 /** This filter is documented in modules/widgets/facebook-likebox.php */
89 apply_filters( 'jetpack_widget_name', esc_html__( 'Cookies & Consents Banner', 'jetpack' ) ),
90 array(
91 'description' => esc_html__( 'Display a banner for EU Cookie Law and GDPR compliance.', 'jetpack' ),
92 'customize_selective_refresh' => true,
93 ),
94 array()
95 );
96 }
97
98 /**
99 * Enqueue scripts and styles.
100 */
101 public function enqueue_frontend_scripts() {
102 wp_enqueue_style( 'eu-cookie-law-style', plugins_url( 'eu-cookie-law/style.css', __FILE__ ), array(), JETPACK__VERSION );
103
104 if ( ! class_exists( 'Jetpack_AMP_Support' ) || ! Jetpack_AMP_Support::is_amp_request() ) {
105 wp_enqueue_script(
106 'eu-cookie-law-script',
107 Assets::get_file_url_for_environment(
108 '_inc/build/widgets/eu-cookie-law/eu-cookie-law.min.js',
109 'modules/widgets/eu-cookie-law/eu-cookie-law.js'
110 ),
111 array(),
112 '20180522',
113 true
114 );
115 }
116 }
117
118 /**
119 * Return an associative array of default values.
120 *
121 * These values are used in new widgets.
122 *
123 * @return array Default values for the widget options.
124 */
125 public function defaults() {
126 return array(
127 'hide' => $this->hide_options[0],
128 'hide-timeout' => 30,
129 'consent-expiration' => 180,
130 'text' => $this->text_options[0],
131 'customtext' => '',
132 'color-scheme' => $this->color_scheme_options[0],
133 'policy-url' => get_option( 'wp_page_for_privacy_policy' ) ? $this->policy_url_options[1] : $this->policy_url_options[0],
134 'default-policy-url' => 'https://automattic.com/cookies/',
135 'custom-policy-url' => get_option( 'wp_page_for_privacy_policy' ) ? get_permalink( (int) get_option( 'wp_page_for_privacy_policy' ) ) : '',
136 'position' => $this->position_options[0],
137 'policy-link-text' => esc_html__( 'Cookie Policy', 'jetpack' ),
138 'button' => esc_html__( 'Close and accept', 'jetpack' ),
139 'default-text' => esc_html__(
140 'Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use.
141
142 To find out more, including how to control cookies, see here:',
143 'jetpack'
144 ),
145 );
146 }
147
148 /**
149 * Front-end display of the widget.
150 *
151 * @html-template-var array $instance
152 * @html-template-var array<string,string> $classes
153 *
154 * @param array $args Widget arguments.
155 * @param array $instance Saved values from database.
156 */
157 public function widget( $args, $instance ) {
158 /**
159 * Filters the display of the EU Cookie Law widget.
160 *
161 * @since 6.1.1
162 *
163 * @param bool true Should the EU Cookie Law widget be disabled. Default to false.
164 */
165 if ( apply_filters( 'jetpack_disable_eu_cookie_law_widget', false ) ) {
166 return;
167 }
168
169 // Enqueue front end assets.
170 $this->enqueue_frontend_scripts();
171
172 $instance = wp_parse_args( $instance, $this->defaults() );
173
174 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
175 require __DIR__ . '/eu-cookie-law/widget-amp.php';
176 return;
177 }
178
179 $classes = array();
180 $classes['hide'] = 'hide-on-' . esc_attr( $instance['hide'] );
181 if ( 'negative' === $instance['color-scheme'] ) {
182 $classes['negative'] = 'negative';
183 }
184
185 if ( 'top' === $instance['position'] ) {
186 $classes['top'] = 'top';
187 }
188
189 if ( Jetpack::is_module_active( 'wordads' ) ) {
190 $classes['ads'] = 'ads-active';
191 $classes['hide'] = 'hide-on-button';
192 }
193
194 /**
195 * Check if widget is loaded in widgets.php.
196 *
197 * @return string widget Static version of the widget for better preview.
198 */
199 global $pagenow;
200 if ( 'widgets.php' === $pagenow ) {
201 // To prevent the widget from being added as a pop-up
202 // we do not echo the before and after $args. Instead we wrap
203 // it in a dummy `div` and return before the `widget_view` is
204 // added to stats.
205 echo '<div id="eu-cookie-law" style="padding: 0;margin: 5px">';
206 require_once __DIR__ . '/eu-cookie-law/widget.php';
207 echo '</div>';
208 return;
209 }
210
211 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
212 require_once __DIR__ . '/eu-cookie-law/widget.php';
213 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
214
215 /** This action is already documented in modules/widgets/gravatar-profile.php */
216 do_action( 'jetpack_stats_extra', 'widget_view', 'eu_cookie_law' );
217 }
218
219 /**
220 * Back-end widget form.
221 *
222 * @html-template-var array $instance
223 *
224 * @param array $instance Previously saved values from database.
225 * @return string|void
226 */
227 public function form( $instance ) {
228 $instance = wp_parse_args( $instance, $this->defaults() );
229 if ( Jetpack::is_module_active( 'wordads' ) ) {
230 $instance['hide'] = 'button';
231 }
232
233 wp_enqueue_script(
234 'eu-cookie-law-widget-admin',
235 Assets::get_file_url_for_environment(
236 '_inc/build/widgets/eu-cookie-law/eu-cookie-law-admin.min.js',
237 'modules/widgets/eu-cookie-law/eu-cookie-law-admin.js'
238 ),
239 array( 'jquery' ),
240 20180417,
241 false
242 );
243
244 require __DIR__ . '/eu-cookie-law/form.php';
245 }
246
247 /**
248 * Sanitize widget form values as they are saved.
249 *
250 * @param array $new_instance Values just sent to be saved.
251 * @param array $old_instance Previously saved values from database.
252 * @return array Updated safe values to be saved.
253 */
254 public function update( $new_instance, $old_instance ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
255 $instance = array();
256 $defaults = $this->defaults();
257
258 $instance['hide'] = $this->filter_value( $new_instance['hide'] ?? '', $this->hide_options );
259 $instance['text'] = $this->filter_value( $new_instance['text'] ?? '', $this->text_options );
260 $instance['color-scheme'] = $this->filter_value( $new_instance['color-scheme'] ?? '', $this->color_scheme_options );
261 $instance['policy-url'] = $this->filter_value( $new_instance['policy-url'] ?? '', $this->policy_url_options );
262 $instance['position'] = $this->filter_value( $new_instance['position'] ?? '', $this->position_options );
263
264 if ( isset( $new_instance['hide-timeout'] ) ) {
265 // Time can be a value between 3 and 1000 seconds.
266 $instance['hide-timeout'] = min( 1000, max( 3, (int) $new_instance['hide-timeout'] ) );
267 }
268
269 if ( isset( $new_instance['consent-expiration'] ) ) {
270 // Time can be a value between 1 and 365 days.
271 $instance['consent-expiration'] = min( 365, max( 1, (int) $new_instance['consent-expiration'] ) );
272 }
273
274 if ( isset( $new_instance['customtext'] ) ) {
275 $instance['customtext'] = mb_substr( wp_kses( $new_instance['customtext'], array() ), 0, 4096 );
276 } else {
277 $instance['text'] = $this->text_options[0];
278 }
279
280 if ( isset( $new_instance['policy-url'] ) ) {
281 $instance['policy-url'] = 'custom' === $new_instance['policy-url']
282 ? 'custom'
283 : 'default';
284 } else {
285 $instance['policy-url'] = $this->policy_url_options[0];
286 }
287
288 if ( 'custom' === $instance['policy-url'] && isset( $new_instance['custom-policy-url'] ) ) {
289 $instance['custom-policy-url'] = esc_url( $new_instance['custom-policy-url'], array( 'http', 'https' ) );
290
291 if ( strlen( $instance['custom-policy-url'] ) < 10 ) {
292 unset( $instance['custom-policy-url'] );
293 global $wp_customize;
294 if ( ! isset( $wp_customize ) ) {
295 $instance['policy-url'] = $this->policy_url_options[0];
296 }
297 }
298 }
299
300 if ( isset( $new_instance['policy-link-text'] ) ) {
301 $instance['policy-link-text'] = trim( mb_substr( wp_kses( $new_instance['policy-link-text'], array() ), 0, 100 ) );
302 }
303
304 if ( empty( $instance['policy-link-text'] ) || $instance['policy-link-text'] === $defaults['policy-link-text'] ) {
305 unset( $instance['policy-link-text'] );
306 }
307
308 if ( isset( $new_instance['button'] ) ) {
309 $instance['button'] = trim( mb_substr( wp_kses( $new_instance['button'], array() ), 0, 100 ) );
310 }
311
312 if ( empty( $instance['button'] ) || $instance['button'] === $defaults['button'] ) {
313 unset( $instance['button'] );
314 }
315
316 // Show the banner again if a setting has been changed.
317 // Sometimes plugins send headers already, so we can't set a cookie and any attempt will throw a warning.
318 if ( ! headers_sent() ) {
319 setcookie( self::$cookie_name, '', time() - 86400, '/', COOKIE_DOMAIN, is_ssl(), false ); // phpcs:ignore Jetpack.Functions.SetCookie -- Fine to have accessible.
320 }
321
322 return $instance;
323 }
324
325 /**
326 * Check if the value is allowed and not empty.
327 *
328 * @param string $value Value to check.
329 * @param array $allowed Array of allowed values.
330 *
331 * @return string $value if pass the check or first value from allowed values.
332 */
333 public function filter_value( $value, $allowed = array() ) {
334 $allowed = (array) $allowed;
335 if ( empty( $value ) || ( ! empty( $allowed ) && ! in_array( $value, $allowed, true ) ) ) {
336 $value = $allowed[0];
337 }
338 return $value;
339 }
340 }
341
342 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move these functions to some other file.
343
344 /**
345 * Register Jetpack_EU_Cookie_Law_Widget widget.
346 */
347 function jetpack_register_eu_cookie_law_widget() {
348 register_widget( 'Jetpack_EU_Cookie_Law_Widget' );
349 }
350
351 add_action( 'widgets_init', 'jetpack_register_eu_cookie_law_widget' );
352 }
353