Completed
Push — add/gdpr-ads-compliance ( 6d1e7f...65c5dd )
by
unknown
18:08 queued 04:13
created

Jetpack_EU_Cookie_Law_Widget::widget()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 12
nc 4
nop 2
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Disable direct access/execution to/of the widget code.
5
 */
6
if ( ! defined( 'ABSPATH' ) ) {
7
	exit;
8
}
9
10
if ( ! class_exists( 'Jetpack_EU_Cookie_Law_Widget' ) ) {
11
	/**
12
	 * EU Cookie Law Widget
13
	 *
14
	 * Display the EU Cookie Law banner in the bottom part of the screen.
15
	 */
16
	class Jetpack_EU_Cookie_Law_Widget extends WP_Widget {
17
		/**
18
		 * EU Cookie Law cookie name.
19
		 *
20
		 * @var string
21
		 */
22
		public static $cookie_name = 'eucookielaw';
23
24
		/**
25
		 * Default hide options.
26
		 *
27
		 * @var array
28
		 */
29
		private $hide_options = array(
30
			'button',
31
			'scroll',
32
			'time',
33
		);
34
35
		/**
36
		 * Default text options.
37
		 *
38
		 * @var array
39
		 */
40
		private $text_options = array(
41
			'default',
42
			'custom',
43
		);
44
45
		/**
46
		 * Default color scheme options.
47
		 *
48
		 * @var array
49
		 */
50
		private $color_scheme_options = array(
51
			'default',
52
			'negative',
53
		);
54
55
		/**
56
		 * Default policy URL options.
57
		 *
58
		 * @var array
59
		 */
60
		private $policy_url_options = array(
61
			'default',
62
			'custom',
63
		);
64
65
		/**
66
		 * Constructor.
67
		 */
68
		function __construct() {
69
			parent::__construct(
70
				'eu_cookie_law_widget',
71
				/** This filter is documented in modules/widgets/facebook-likebox.php */
72
				apply_filters( 'jetpack_widget_name', esc_html__( 'EU Cookie Law Banner', 'jetpack' ) ),
73
				array(
74
					'description' => esc_html__( 'Display a banner for compliance with the EU Cookie Law.', 'jetpack' ),
75
					'customize_selective_refresh' => true,
76
				),
77
				array()
78
			);
79
80 View Code Duplication
			if ( is_active_widget( false, false, $this->id_base ) || is_customize_preview() ) {
81
				add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_scripts' ) );
82
			}
83
		}
84
85
		/**
86
		 * Enqueue scripts and styles.
87
		 */
88
		function enqueue_frontend_scripts() {
89
			wp_enqueue_style( 'eu-cookie-law-style', plugins_url( 'eu-cookie-law/style.css', __FILE__ ), array(), '20170403' );
90
			wp_enqueue_script(
91
				'eu-cookie-law-script',
92
				Jetpack::get_file_url_for_environment(
93
					'_inc/build/widgets/eu-cookie-law/eu-cookie-law.min.js',
94
					'modules/widgets/eu-cookie-law/eu-cookie-law.js'
95
				),
96
				array( 'jquery' ),
97
				'20170404',
98
				true
99
			);
100
		}
101
102
		/**
103
		 * Return an associative array of default values.
104
		 *
105
		 * These values are used in new widgets.
106
		 *
107
		 * @return array Default values for the widget options.
108
		 */
109
		public function defaults() {
110
			return array(
111
				'hide'               => $this->hide_options[0],
112
				'hide-timeout'       => 30,
113
				'consent-expiration' => 180,
114
				'text'               => $this->text_options[0],
115
				'customtext'         => '',
116
				'color-scheme'       => $this->color_scheme_options[0],
117
				'policy-url'         => $this->policy_url_options[0],
118
				'default-policy-url' => 'https://jetpack.com/support/cookies/',
119
				'custom-policy-url'  => '',
120
				'policy-link-text'   => esc_html__( 'Our Cookie Policy', 'jetpack' ),
121
				'button'             => esc_html__( 'Close and accept', 'jetpack' ),
122
				'default-text'       => esc_html__( 'Privacy & Cookies: This site uses cookies.', 'jetpack' ),
123
			);
124
		}
125
126
		/**
127
		 * Front-end display of the widget.
128
		 *
129
		 * @param array $args     Widget arguments.
130
		 * @param array $instance Saved values from database.
131
		 */
132
		public function widget( $args, $instance ) {
133
			$instance = wp_parse_args( $instance, $this->defaults() );
134
135
			$classes = array();
136
			$classes[] = 'hide-on-' . esc_attr( $instance['hide'] );
137
			if ( 'negative' === $instance['color-scheme'] ) {
138
				$classes[] = 'negative';
139
			}
140
			if ( Jetpack::is_module_active( 'wordads' ) ) {
141
				$classes[] = 'ads-active';
142
			}
143
144
			echo $args['before_widget'];
145
			require( dirname( __FILE__ ) . '/eu-cookie-law/widget.php' );
146
			echo $args['after_widget'];
147
			/** This action is already documented in modules/widgets/gravatar-profile.php */
148
			do_action( 'jetpack_stats_extra', 'widget_view', 'eu_cookie_law' );
149
		}
150
151
		/**
152
		 * Back-end widget form.
153
		 *
154
		 * @param array $instance Previously saved values from database.
155
		 */
156
		public function form( $instance ) {
157
			$instance = wp_parse_args( $instance, $this->defaults() );
158
			require( dirname( __FILE__ ) . '/eu-cookie-law/form.php' );
159
		}
160
161
		/**
162
		 * Sanitize widget form values as they are saved.
163
		 *
164
		 * @param  array $new_instance Values just sent to be saved.
165
		 * @param  array $old_instance Previously saved values from database.
166
		 * @return array Updated safe values to be saved.
167
		 */
168
		public function update( $new_instance, $old_instance ) {
169
			$instance = array();
170
			$defaults = $this->defaults();
171
172
			$instance['hide']           = $this->filter_value( $new_instance['hide'], $this->hide_options );
173
			$instance['text']           = $this->filter_value( $new_instance['text'], $this->text_options );
174
			$instance['color-scheme']   = $this->filter_value( $new_instance['color-scheme'], $this->color_scheme_options );
175
			$instance['policy-url']     = $this->filter_value( $new_instance['policy-url'], $this->policy_url_options );
176
177 View Code Duplication
			if ( isset( $new_instance['hide-timeout'] ) ) {
178
				// Time can be a value between 3 and 1000 seconds.
179
				$instance['hide-timeout'] = min( 1000, max( 3, intval( $new_instance['hide-timeout'] ) ) );
180
			}
181
182 View Code Duplication
			if ( isset( $new_instance['consent-expiration'] ) ) {
183
				// Time can be a value between 1 and 365 days.
184
				$instance['consent-expiration'] = min( 365, max( 1, intval( $new_instance['consent-expiration'] ) ) );
185
			}
186
187
			if ( isset( $new_instance['customtext'] ) ) {
188
				$instance['customtext'] = mb_substr( wp_kses( $new_instance['customtext'], array() ), 0, 4096 );
189
			} else {
190
				$instance['text'] = $this->text_options[0];
191
			}
192
193
			if ( isset( $new_instance['policy-url'] ) ) {
194
				$instance['policy-url'] = 'custom' === $new_instance['policy-url']
195
					? 'custom'
196
					: 'default';
197
			} else {
198
				$instance['policy-url'] = $this->policy_url_options[0];
199
			}
200
201
			if ( 'custom' === $instance['policy-url'] && isset( $new_instance['custom-policy-url'] ) ) {
202
				$instance['custom-policy-url'] = esc_url( $new_instance['custom-policy-url'], array( 'http', 'https' ) );
203
204
				if ( strlen( $instance['custom-policy-url'] ) < 10 ) {
205
					unset( $instance['custom-policy-url'] );
206
					global $wp_customize;
207
					if ( ! isset( $wp_customize ) ) {
208
						$instance['policy-url'] = $this->policy_url_options[0];
209
					}
210
				}
211
			}
212
213
			if ( isset( $new_instance['policy-link-text'] ) ) {
214
				$instance['policy-link-text'] = trim( mb_substr( wp_kses( $new_instance['policy-link-text'], array() ), 0, 100 ) );
215
			}
216
217
			if ( empty( $instance['policy-link-text'] ) || $instance['policy-link-text'] == $defaults['policy-link-text'] ) {
218
				unset( $instance['policy-link-text'] );
219
			}
220
221
			if ( isset( $new_instance['button'] ) ) {
222
				$instance['button'] = trim( mb_substr( wp_kses( $new_instance['button'], array() ), 0, 100 ) );
223
			}
224
225
			if ( empty( $instance['button'] ) || $instance['button'] == $defaults['button'] ) {
226
				unset( $instance['button'] );
227
			}
228
229
			// Show the banner again if a setting has been changed.
230
			setcookie( self::$cookie_name, '', time() - 86400, '/' );
231
232
			return $instance;
233
		}
234
235
		/**
236
		 * Check if the value is allowed and not empty.
237
		 *
238
		 * @param  string $value Value to check.
239
		 * @param  array  $allowed Array of allowed values.
240
		 *
241
		 * @return string $value if pass the check or first value from allowed values.
242
		 */
243
		function filter_value( $value, $allowed = array() ) {
244
			$allowed = (array) $allowed;
245
			if ( empty( $value ) || ( ! empty( $allowed ) && ! in_array( $value, $allowed ) ) ) {
246
				$value = $allowed[0];
247
			}
248
			return $value;
249
		}
250
	}
251
252
	// Register Jetpack_EU_Cookie_Law_Widget widget.
253
	function jetpack_register_eu_cookie_law_widget() {
254
		register_widget( 'Jetpack_EU_Cookie_Law_Widget' );
255
	};
256
257
	add_action( 'widgets_init', 'jetpack_register_eu_cookie_law_widget' );
258
}
259