Completed
Push — master ( c4cd1f...963c86 )
by
unknown
36s
created
redux-core/inc/extensions/users/class-redux-users-api.php 2 patches
Spacing   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 				$instances = Redux::all_instances();
93 93
 
94 94
 				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
95
+					if ( ! isset( $instances[$opt_name] ) ) {
96 96
 						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97 97
 
98 98
 						Redux::set_sections(
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 					self::check_opt_name( $opt_name );
115 115
 
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
116
+					Redux::set_args( $opt_name, self::$args[$opt_name] );
117 117
 				}
118 118
 			}
119 119
 		}
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
 		 * @return mixed
127 127
 		 */
128 128
 		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
129
+			$args             = self::$args[$opt_name];
130 130
 			$args['opt_name'] = $opt_name;
131 131
 
132 132
 			if ( ! isset( $args['menu_title'] ) ) {
@@ -154,11 +154,11 @@  discard block
 block discarded – undo
154 154
 		public static function construct_profiles( string $opt_name ): array {
155 155
 			$profiles = array();
156 156
 
157
-			if ( ! isset( self::$profiles[ $opt_name ] ) ) {
157
+			if ( ! isset( self::$profiles[$opt_name] ) ) {
158 158
 				return $profiles;
159 159
 			}
160 160
 
161
-			foreach ( self::$profiles[ $opt_name ] as $profile ) {
161
+			foreach ( self::$profiles[$opt_name] as $profile ) {
162 162
 				$profile['sections'] = self::construct_sections( $opt_name, $profile['id'] );
163 163
 				$profiles[]          = $profile;
164 164
 			}
@@ -179,22 +179,22 @@  discard block
 block discarded – undo
179 179
 		public static function construct_sections( string $opt_name, $profile_id ): array {
180 180
 			$sections = array();
181 181
 
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
182
+			if ( ! isset( self::$sections[$opt_name] ) ) {
183 183
 				return $sections;
184 184
 			}
185 185
 
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
186
+			foreach ( self::$sections[$opt_name] as $section_id => $section ) {
187 187
 				if ( $section['profile_id'] === $profile_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['roles'] = $section;
188
+					self::$sections[$opt_name][$section_id]['roles'] = $section;
189 189
 
190 190
 					$p = $section['priority'];
191 191
 
192
-					while ( isset( $sections[ $p ] ) ) {
192
+					while ( isset( $sections[$p] ) ) {
193 193
 						echo esc_html( $p++ );
194 194
 					}
195 195
 
196 196
 					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
197
+					$sections[$p]    = $section;
198 198
 				}
199 199
 			}
200 200
 
@@ -214,29 +214,29 @@  discard block
 block discarded – undo
214 214
 		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $roles = false ): array {
215 215
 			$fields = array();
216 216
 
217
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
217
+			if ( ! isset( self::$fields[$opt_name] ) ) {
218 218
 				return $fields;
219 219
 			}
220 220
 
221
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
221
+			foreach ( self::$fields[$opt_name] as $key => $field ) {
222 222
 				// Nested permissions.
223 223
 				$field['permissions'] = $field['permissions'] ?? $permissions;
224 224
 
225
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
225
+				self::$fields[$opt_name][$key]['permissions'] = $field['permissions'];
226 226
 
227 227
 				// Nested roles permissions.
228 228
 				$field['roles'] = $field['roles'] ?? $roles;
229 229
 
230
-				self::$fields[ $opt_name ][ $key ]['roles'] = $field['roles'];
230
+				self::$fields[$opt_name][$key]['roles'] = $field['roles'];
231 231
 
232 232
 				if ( $field['section_id'] === $section_id ) {
233 233
 					$p = $field['priority'];
234 234
 
235
-					while ( isset( $fields[ $p ] ) ) {
235
+					while ( isset( $fields[$p] ) ) {
236 236
 						echo esc_html( $p++ );
237 237
 					}
238 238
 
239
-					$fields[ $p ] = $field;
239
+					$fields[$p] = $field;
240 240
 				}
241 241
 			}
242 242
 
@@ -257,11 +257,11 @@  discard block
 block discarded – undo
257 257
 			self::check_opt_name( $opt_name );
258 258
 
259 259
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
260
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
260
+				if ( ! isset( self::$sections[$opt_name][$id] ) ) {
261 261
 					$id = strtolower( sanitize_html_class( $id ) );
262 262
 				}
263 263
 
264
-				return self::$sections[ $opt_name ][ $id ] ?? false;
264
+				return self::$sections[$opt_name][$id] ?? false;
265 265
 			}
266 266
 
267 267
 			return false;
@@ -277,8 +277,8 @@  discard block
 block discarded – undo
277 277
 			self::check_opt_name( $opt_name );
278 278
 
279 279
 			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
280
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
281
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
280
+				self::$args[$opt_name] = self::$args[$opt_name] ?? array();
281
+				self::$args[$opt_name] = wp_parse_args( $args, self::$args[$opt_name] );
282 282
 			}
283 283
 		}
284 284
 
@@ -299,11 +299,11 @@  discard block
 block discarded – undo
299 299
 						$section['id'] = 'section';
300 300
 					}
301 301
 
302
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
302
+					if ( isset( self::$sections[$opt_name][$section['id']] ) ) {
303 303
 						$orig = $section['id'];
304 304
 						$i    = 0;
305 305
 
306
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
306
+						while ( isset( self::$sections[$opt_name][$section['id']] ) ) {
307 307
 							$section['id'] = $orig . '_' . $i;
308 308
 						}
309 309
 					}
@@ -318,11 +318,11 @@  discard block
 block discarded – undo
318 318
 						if ( isset( $section['permissions'] ) || isset( $section['roles'] ) ) {
319 319
 							foreach ( $section['fields'] as $key => $field ) {
320 320
 								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
321
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
321
+									$section['fields'][$key]['permissions'] = $section['permissions'];
322 322
 								}
323 323
 
324 324
 								if ( ! isset( $field['roles'] ) && isset( $section['roles'] ) ) {
325
-									$section['fields'][ $key ]['roles'] = $section['roles'];
325
+									$section['fields'][$key]['roles'] = $section['roles'];
326 326
 								}
327 327
 							}
328 328
 						}
@@ -333,9 +333,9 @@  discard block
 block discarded – undo
333 333
 					unset( $section['fields'] );
334 334
 				}
335 335
 
336
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
336
+				self::$sections[$opt_name][$section['id']] = $section;
337 337
 			} else {
338
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
338
+				self::$errors[$opt_name]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
339 339
 			}
340 340
 		}
341 341
 
@@ -397,7 +397,7 @@  discard block
 block discarded – undo
397 397
 			self::check_opt_name( $opt_name );
398 398
 
399 399
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
400
-				return self::$fields[ $opt_name ][ $id ] ?? false;
400
+				return self::$fields[$opt_name][$id] ?? false;
401 401
 			}
402 402
 
403 403
 			return false;
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
 					$field['priority'] = self::get_priority( $opt_name, 'fields' );
418 418
 				}
419 419
 
420
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
420
+				self::$fields[$opt_name][$field['id']] = $field;
421 421
 			}
422 422
 		}
423 423
 
@@ -438,11 +438,11 @@  discard block
 block discarded – undo
438 438
 						$profile['id'] = 'profile';
439 439
 					}
440 440
 
441
-					if ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
441
+					if ( isset( self::$profiles[$opt_name][$profile['id']] ) ) {
442 442
 						$orig = $profile['id'];
443 443
 						$i    = 0;
444 444
 
445
-						while ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
445
+						while ( isset( self::$profiles[$opt_name][$profile['id']] ) ) {
446 446
 							$profile['id'] = $orig . '_' . $i;
447 447
 						}
448 448
 					}
@@ -453,11 +453,11 @@  discard block
 block discarded – undo
453 453
 						if ( isset( $profile['permissions'] ) || isset( $profile['roles'] ) ) {
454 454
 							foreach ( $profile['sections'] as $key => $section ) {
455 455
 								if ( ! isset( $section['permissions'] ) && isset( $profile['permissions'] ) ) {
456
-									$profile['sections'][ $key ]['permissions'] = $profile['permissions'];
456
+									$profile['sections'][$key]['permissions'] = $profile['permissions'];
457 457
 								}
458 458
 
459 459
 								if ( ! isset( $section['roles'] ) && isset( $profile['roles'] ) ) {
460
-									$profile['sections'][ $key ]['roles'] = $profile['roles'];
460
+									$profile['sections'][$key]['roles'] = $profile['roles'];
461 461
 								}
462 462
 							}
463 463
 						}
@@ -468,9 +468,9 @@  discard block
 block discarded – undo
468 468
 					unset( $profile['sections'] );
469 469
 				}
470 470
 
471
-				self::$profiles[ $opt_name ][ $profile['id'] ] = $profile;
471
+				self::$profiles[$opt_name][$profile['id']] = $profile;
472 472
 			} else {
473
-				self::$errors[ $opt_name ]['profile']['empty'] = esc_html__( 'Unable to create a profile due an empty profile array or the profile variable passed was not an array.', 'redux-framework' );
473
+				self::$errors[$opt_name]['profile']['empty'] = esc_html__( 'Unable to create a profile due an empty profile array or the profile variable passed was not an array.', 'redux-framework' );
474 474
 			}
475 475
 		}
476 476
 
@@ -483,8 +483,8 @@  discard block
 block discarded – undo
483 483
 		 * @return mixed
484 484
 		 */
485 485
 		public static function get_priority( string $opt_name, $type ) {
486
-			$priority                              = self::$priority[ $opt_name ][ $type ];
487
-			self::$priority[ $opt_name ][ $type ] += 1;
486
+			$priority                              = self::$priority[$opt_name][$type];
487
+			self::$priority[$opt_name][$type] += 1;
488 488
 
489 489
 			return $priority;
490 490
 		}
@@ -499,34 +499,34 @@  discard block
 block discarded – undo
499 499
 				return;
500 500
 			}
501 501
 
502
-			if ( ! isset( self::$profiles[ $opt_name ] ) ) {
503
-				self::$profiles[ $opt_name ] = array();
502
+			if ( ! isset( self::$profiles[$opt_name] ) ) {
503
+				self::$profiles[$opt_name] = array();
504 504
 			}
505 505
 
506
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
507
-				self::$priority[ $opt_name ]['args'] = 1;
506
+			if ( ! isset( self::$priority[$opt_name] ) ) {
507
+				self::$priority[$opt_name]['args'] = 1;
508 508
 			}
509 509
 
510
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
511
-				self::$sections[ $opt_name ]             = array();
512
-				self::$priority[ $opt_name ]['sections'] = 1;
510
+			if ( ! isset( self::$sections[$opt_name] ) ) {
511
+				self::$sections[$opt_name]             = array();
512
+				self::$priority[$opt_name]['sections'] = 1;
513 513
 			}
514 514
 
515
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
516
-				self::$fields[ $opt_name ]             = array();
517
-				self::$priority[ $opt_name ]['fields'] = 1;
515
+			if ( ! isset( self::$fields[$opt_name] ) ) {
516
+				self::$fields[$opt_name]             = array();
517
+				self::$priority[$opt_name]['fields'] = 1;
518 518
 			}
519 519
 
520
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
521
-				self::$errors[ $opt_name ] = array();
520
+			if ( ! isset( self::$errors[$opt_name] ) ) {
521
+				self::$errors[$opt_name] = array();
522 522
 			}
523 523
 
524
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
525
-				self::$init[ $opt_name ] = false;
524
+			if ( ! isset( self::$init[$opt_name] ) ) {
525
+				self::$init[$opt_name] = false;
526 526
 			}
527 527
 
528
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
529
-				self::$args[ $opt_name ] = false;
528
+			if ( ! isset( self::$args[$opt_name] ) ) {
529
+				self::$args[$opt_name] = false;
530 530
 			}
531 531
 		}
532 532
 
@@ -565,7 +565,7 @@  discard block
 block discarded – undo
565 565
 						$value = $value[0];
566 566
 					}
567 567
 
568
-					$meta[ $key ] = maybe_unserialize( $value );
568
+					$meta[$key] = maybe_unserialize( $value );
569 569
 				}
570 570
 			}
571 571
 
Please login to merge, or discard this patch.
Indentation   +561 added lines, -561 removed lines patch added patch discarded remove patch
@@ -13,565 +13,565 @@
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Users' ) ) {
15 15
 
16
-	/**
17
-	 * Redux Users API Class
18
-	 * Simple API for Redux Framework
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Users {
23
-
24
-		/**
25
-		 * Profile array.
26
-		 *
27
-		 * @var array
28
-		 */
29
-		public static array $profiles = array();
30
-
31
-		/**
32
-		 * Sections array.
33
-		 *
34
-		 * @var array
35
-		 */
36
-		public static array $sections = array();
37
-
38
-		/**
39
-		 * Fields array.
40
-		 *
41
-		 * @var array
42
-		 */
43
-		public static array $fields = array();
44
-
45
-		/**
46
-		 * Priority array.
47
-		 *
48
-		 * @var array
49
-		 */
50
-		public static array $priority = array();
51
-
52
-		/**
53
-		 * Errors array.
54
-		 *
55
-		 * @var array
56
-		 */
57
-		public static array $errors = array();
58
-
59
-		/**
60
-		 * Init array.
61
-		 *
62
-		 * @var array
63
-		 */
64
-		public static array $init = array();
65
-
66
-		/**
67
-		 * Args array.
68
-		 *
69
-		 * @var array
70
-		 */
71
-		public static array $args = array();
72
-
73
-		/**
74
-		 * Load.
75
-		 */
76
-		public static function load() {
77
-			add_action( 'init', array( 'Redux_Users', 'enqueue' ), 99 );
78
-		}
79
-
80
-		/**
81
-		 * Enqueue support files and fields.
82
-		 *
83
-		 * @throws ReflectionException Exception.
84
-		 */
85
-		public static function enqueue() {
86
-			global $pagenow;
87
-
88
-			// Check and run instances of Redux where the opt_name hasn't been run.
89
-			$pagenows = array( 'user-new.php', 'profile.php', 'user-edit.php' );
90
-
91
-			if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
-				$instances = Redux::all_instances();
93
-
94
-				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
96
-						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
-
98
-						Redux::set_sections(
99
-							$opt_name,
100
-							array(
101
-								array(
102
-									'id'     => 'EXTENSION_USERS_FAKE_ID' . $opt_name,
103
-									'fields' => $fields,
104
-									'title'  => 'N/A',
105
-								),
106
-							)
107
-						);
108
-
109
-						Redux::init( $opt_name );
110
-
111
-						$instances = ReduxFrameworkInstances::get_all_instances();
112
-					}
113
-
114
-					self::check_opt_name( $opt_name );
115
-
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
-				}
118
-			}
119
-		}
120
-
121
-		/**
122
-		 * Construct Args.
123
-		 *
124
-		 * @param string $opt_name Panel Opt Name.
125
-		 *
126
-		 * @return mixed
127
-		 */
128
-		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
130
-			$args['opt_name'] = $opt_name;
131
-
132
-			if ( ! isset( $args['menu_title'] ) ) {
133
-				$args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
-			}
135
-
136
-			if ( ! isset( $args['page_title'] ) ) {
137
-				$args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
-			}
139
-
140
-			if ( ! isset( $args['page_slug'] ) ) {
141
-				$args['page_slug'] = $opt_name . '_options';
142
-			}
143
-
144
-			return $args;
145
-		}
146
-
147
-		/**
148
-		 * Construct Profiles.
149
-		 *
150
-		 * @param string $opt_name Panel opt_name.
151
-		 *
152
-		 * @return array
153
-		 */
154
-		public static function construct_profiles( string $opt_name ): array {
155
-			$profiles = array();
156
-
157
-			if ( ! isset( self::$profiles[ $opt_name ] ) ) {
158
-				return $profiles;
159
-			}
160
-
161
-			foreach ( self::$profiles[ $opt_name ] as $profile ) {
162
-				$profile['sections'] = self::construct_sections( $opt_name, $profile['id'] );
163
-				$profiles[]          = $profile;
164
-			}
165
-
166
-			ksort( $profiles );
167
-
168
-			return $profiles;
169
-		}
170
-
171
-		/**
172
-		 * Construct Sections.
173
-		 *
174
-		 * @param string     $opt_name    Panel opt_name.
175
-		 * @param int|string $profile_id  Profile ID.
176
-		 *
177
-		 * @return array
178
-		 */
179
-		public static function construct_sections( string $opt_name, $profile_id ): array {
180
-			$sections = array();
181
-
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
-				return $sections;
184
-			}
185
-
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
-				if ( $section['profile_id'] === $profile_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['roles'] = $section;
189
-
190
-					$p = $section['priority'];
191
-
192
-					while ( isset( $sections[ $p ] ) ) {
193
-						echo esc_html( $p++ );
194
-					}
195
-
196
-					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
198
-				}
199
-			}
200
-
201
-			return $sections;
202
-		}
203
-
204
-		/**
205
-		 * Construct Fields.
206
-		 *
207
-		 * @param string $opt_name    Panel opt_name.
208
-		 * @param string $section_id  Section ID.
209
-		 * @param bool   $permissions Permissions.
210
-		 * @param bool   $roles       Roles.
211
-		 *
212
-		 * @return array
213
-		 */
214
-		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $roles = false ): array {
215
-			$fields = array();
216
-
217
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
218
-				return $fields;
219
-			}
220
-
221
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
222
-				// Nested permissions.
223
-				$field['permissions'] = $field['permissions'] ?? $permissions;
224
-
225
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
226
-
227
-				// Nested roles permissions.
228
-				$field['roles'] = $field['roles'] ?? $roles;
229
-
230
-				self::$fields[ $opt_name ][ $key ]['roles'] = $field['roles'];
231
-
232
-				if ( $field['section_id'] === $section_id ) {
233
-					$p = $field['priority'];
234
-
235
-					while ( isset( $fields[ $p ] ) ) {
236
-						echo esc_html( $p++ );
237
-					}
238
-
239
-					$fields[ $p ] = $field;
240
-				}
241
-			}
242
-
243
-			ksort( $fields );
244
-
245
-			return $fields;
246
-		}
247
-
248
-		/**
249
-		 * Get Section.
250
-		 *
251
-		 * @param string $opt_name Panel opt_name.
252
-		 * @param string $id       ID.
253
-		 *
254
-		 * @return bool
255
-		 */
256
-		public static function get_section( string $opt_name = '', string $id = '' ): bool {
257
-			self::check_opt_name( $opt_name );
258
-
259
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
260
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
261
-					$id = strtolower( sanitize_html_class( $id ) );
262
-				}
263
-
264
-				return self::$sections[ $opt_name ][ $id ] ?? false;
265
-			}
266
-
267
-			return false;
268
-		}
269
-
270
-		/**
271
-		 * Set args.
272
-		 *
273
-		 * @param string $opt_name Panel opt_name.
274
-		 * @param array  $args     Args array.
275
-		 */
276
-		public static function set_args( string $opt_name = '', array $args = array() ) {
277
-			self::check_opt_name( $opt_name );
278
-
279
-			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
280
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
281
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
282
-			}
283
-		}
284
-
285
-		/**
286
-		 * Set Section.
287
-		 *
288
-		 * @param string $opt_name Panel opt_name.
289
-		 * @param array  $section  Section array.
290
-		 */
291
-		public static function set_section( string $opt_name = '', array $section = array() ) {
292
-			self::check_opt_name( $opt_name );
293
-
294
-			if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
295
-				if ( ! isset( $section['id'] ) ) {
296
-					if ( isset( $section['title'] ) ) {
297
-						$section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
298
-					} else {
299
-						$section['id'] = 'section';
300
-					}
301
-
302
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
303
-						$orig = $section['id'];
304
-						$i    = 0;
305
-
306
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
307
-							$section['id'] = $orig . '_' . $i;
308
-						}
309
-					}
310
-				}
311
-
312
-				if ( ! isset( $section['priority'] ) ) {
313
-					$section['priority'] = self::get_priority( $opt_name, 'sections' );
314
-				}
315
-
316
-				if ( isset( $section['fields'] ) ) {
317
-					if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
318
-						if ( isset( $section['permissions'] ) || isset( $section['roles'] ) ) {
319
-							foreach ( $section['fields'] as $key => $field ) {
320
-								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
321
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
322
-								}
323
-
324
-								if ( ! isset( $field['roles'] ) && isset( $section['roles'] ) ) {
325
-									$section['fields'][ $key ]['roles'] = $section['roles'];
326
-								}
327
-							}
328
-						}
329
-
330
-						self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
331
-					}
332
-
333
-					unset( $section['fields'] );
334
-				}
335
-
336
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
337
-			} else {
338
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
339
-			}
340
-		}
341
-
342
-		/**
343
-		 * Process Section Array.
344
-		 *
345
-		 * @param string $opt_name   Panel opt_name.
346
-		 * @param string $profile_id Profile ID.
347
-		 * @param array  $sections   Sections array.
348
-		 */
349
-		public static function process_sections_array( string $opt_name = '', string $profile_id = '', array $sections = array() ) {
350
-			if ( ! empty( $opt_name ) && ! empty( $profile_id ) && is_array( $sections ) && ! empty( $sections ) ) {
351
-				foreach ( $sections as $section ) {
352
-					if ( ! is_array( $section ) ) {
353
-						continue;
354
-					}
355
-
356
-					$section['profile_id'] = $profile_id;
357
-
358
-					if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
359
-						$section['fields'] = array();
360
-					}
361
-
362
-					self::set_section( $opt_name, $section );
363
-				}
364
-			}
365
-		}
366
-
367
-		/**
368
-		 * Process Fields Array.
369
-		 *
370
-		 * @param string $opt_name   Panel opt_name.
371
-		 * @param string $section_id Section ID.
372
-		 * @param array  $fields     Fields array.
373
-		 */
374
-		public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
375
-			if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
376
-				foreach ( $fields as $field ) {
377
-					if ( ! is_array( $field ) ) {
378
-						continue;
379
-					}
380
-
381
-					$field['section_id'] = $section_id;
382
-
383
-					self::set_field( $opt_name, $field );
384
-				}
385
-			}
386
-		}
387
-
388
-		/**
389
-		 * Get field.
390
-		 *
391
-		 * @param string $opt_name Panel opt_name.
392
-		 * @param string $id       Field ID.
393
-		 *
394
-		 * @return bool
395
-		 */
396
-		public static function get_field( string $opt_name = '', string $id = '' ): bool {
397
-			self::check_opt_name( $opt_name );
398
-
399
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
400
-				return self::$fields[ $opt_name ][ $id ] ?? false;
401
-			}
402
-
403
-			return false;
404
-		}
405
-
406
-		/**
407
-		 * Set field.
408
-		 *
409
-		 * @param string $opt_name Panel opt_name.
410
-		 * @param array  $field    Field array.
411
-		 */
412
-		public static function set_field( string $opt_name = '', array $field = array() ) {
413
-			self::check_opt_name( $opt_name );
414
-
415
-			if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
416
-				if ( ! isset( $field['priority'] ) ) {
417
-					$field['priority'] = self::get_priority( $opt_name, 'fields' );
418
-				}
419
-
420
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
421
-			}
422
-		}
423
-
424
-		/**
425
-		 * Set Profile.
426
-		 *
427
-		 * @param string $opt_name Panel opt_name.
428
-		 * @param array  $profile  Profile array.
429
-		 */
430
-		public static function set_profile( string $opt_name = '', array $profile = array() ) {
431
-			self::check_opt_name( $opt_name );
432
-
433
-			if ( ! empty( $opt_name ) && is_array( $profile ) && ! empty( $profile ) ) {
434
-				if ( ! isset( $profile['id'] ) ) {
435
-					if ( isset( $profile['title'] ) ) {
436
-						$profile['id'] = strtolower( sanitize_html_class( $profile['title'] ) );
437
-					} else {
438
-						$profile['id'] = 'profile';
439
-					}
440
-
441
-					if ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
442
-						$orig = $profile['id'];
443
-						$i    = 0;
444
-
445
-						while ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
446
-							$profile['id'] = $orig . '_' . $i;
447
-						}
448
-					}
449
-				}
450
-
451
-				if ( isset( $profile['sections'] ) ) {
452
-					if ( ! empty( $profile['sections'] ) && is_array( $profile['sections'] ) ) {
453
-						if ( isset( $profile['permissions'] ) || isset( $profile['roles'] ) ) {
454
-							foreach ( $profile['sections'] as $key => $section ) {
455
-								if ( ! isset( $section['permissions'] ) && isset( $profile['permissions'] ) ) {
456
-									$profile['sections'][ $key ]['permissions'] = $profile['permissions'];
457
-								}
458
-
459
-								if ( ! isset( $section['roles'] ) && isset( $profile['roles'] ) ) {
460
-									$profile['sections'][ $key ]['roles'] = $profile['roles'];
461
-								}
462
-							}
463
-						}
464
-
465
-						self::process_sections_array( $opt_name, $profile['id'], $profile['sections'] );
466
-					}
467
-
468
-					unset( $profile['sections'] );
469
-				}
470
-
471
-				self::$profiles[ $opt_name ][ $profile['id'] ] = $profile;
472
-			} else {
473
-				self::$errors[ $opt_name ]['profile']['empty'] = esc_html__( 'Unable to create a profile due an empty profile array or the profile variable passed was not an array.', 'redux-framework' );
474
-			}
475
-		}
476
-
477
-		/**
478
-		 * Get Priority.
479
-		 *
480
-		 * @param string $opt_name Panel opt_name.
481
-		 * @param mixed  $type     Type.
482
-		 *
483
-		 * @return mixed
484
-		 */
485
-		public static function get_priority( string $opt_name, $type ) {
486
-			$priority                              = self::$priority[ $opt_name ][ $type ];
487
-			self::$priority[ $opt_name ][ $type ] += 1;
488
-
489
-			return $priority;
490
-		}
491
-
492
-		/**
493
-		 * Check opt name.
494
-		 *
495
-		 * @param string $opt_name Panel opt_name.
496
-		 */
497
-		public static function check_opt_name( string $opt_name = '' ) {
498
-			if ( empty( $opt_name ) || is_array( $opt_name ) ) {
499
-				return;
500
-			}
501
-
502
-			if ( ! isset( self::$profiles[ $opt_name ] ) ) {
503
-				self::$profiles[ $opt_name ] = array();
504
-			}
505
-
506
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
507
-				self::$priority[ $opt_name ]['args'] = 1;
508
-			}
509
-
510
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
511
-				self::$sections[ $opt_name ]             = array();
512
-				self::$priority[ $opt_name ]['sections'] = 1;
513
-			}
514
-
515
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
516
-				self::$fields[ $opt_name ]             = array();
517
-				self::$priority[ $opt_name ]['fields'] = 1;
518
-			}
519
-
520
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
521
-				self::$errors[ $opt_name ] = array();
522
-			}
523
-
524
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
525
-				self::$init[ $opt_name ] = false;
526
-			}
527
-
528
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
529
-				self::$args[ $opt_name ] = false;
530
-			}
531
-		}
532
-
533
-		/**
534
-		 * Get USer Meta.
535
-		 *
536
-		 * @param array $args Args array.
537
-		 *
538
-		 * @return mixed
539
-		 */
540
-		public static function get_user_meta( array $args = array() ) {
541
-			$default = array(
542
-				'key'      => '',
543
-				'opt_name' => '',
544
-				'user'     => '',
545
-			);
546
-
547
-			$args = wp_parse_args( $args, $default );
548
-
549
-			if ( empty( $args['user'] ) ) {
550
-				$args['user'] = get_current_user_id();
551
-			}
552
-
553
-			// phpcs:ignore WordPress.PHP.DontExtract
554
-			extract( $args );
555
-
556
-			$single = ! empty( $key );
557
-
558
-			$meta = get_user_meta( $user, $key, $single );
559
-
560
-			if ( $single ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
561
-				// Do nothing.
562
-			} elseif ( ! empty( $meta ) ) {
563
-				foreach ( $meta as $key => $value ) {
564
-					if ( is_array( $value ) ) {
565
-						$value = $value[0];
566
-					}
567
-
568
-					$meta[ $key ] = maybe_unserialize( $value );
569
-				}
570
-			}
571
-
572
-			return $meta;
573
-		}
574
-	}
575
-
576
-	Redux_Users::load();
16
+    /**
17
+     * Redux Users API Class
18
+     * Simple API for Redux Framework
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Users {
23
+
24
+        /**
25
+         * Profile array.
26
+         *
27
+         * @var array
28
+         */
29
+        public static array $profiles = array();
30
+
31
+        /**
32
+         * Sections array.
33
+         *
34
+         * @var array
35
+         */
36
+        public static array $sections = array();
37
+
38
+        /**
39
+         * Fields array.
40
+         *
41
+         * @var array
42
+         */
43
+        public static array $fields = array();
44
+
45
+        /**
46
+         * Priority array.
47
+         *
48
+         * @var array
49
+         */
50
+        public static array $priority = array();
51
+
52
+        /**
53
+         * Errors array.
54
+         *
55
+         * @var array
56
+         */
57
+        public static array $errors = array();
58
+
59
+        /**
60
+         * Init array.
61
+         *
62
+         * @var array
63
+         */
64
+        public static array $init = array();
65
+
66
+        /**
67
+         * Args array.
68
+         *
69
+         * @var array
70
+         */
71
+        public static array $args = array();
72
+
73
+        /**
74
+         * Load.
75
+         */
76
+        public static function load() {
77
+            add_action( 'init', array( 'Redux_Users', 'enqueue' ), 99 );
78
+        }
79
+
80
+        /**
81
+         * Enqueue support files and fields.
82
+         *
83
+         * @throws ReflectionException Exception.
84
+         */
85
+        public static function enqueue() {
86
+            global $pagenow;
87
+
88
+            // Check and run instances of Redux where the opt_name hasn't been run.
89
+            $pagenows = array( 'user-new.php', 'profile.php', 'user-edit.php' );
90
+
91
+            if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
+                $instances = Redux::all_instances();
93
+
94
+                foreach ( self::$fields as $opt_name => $fields ) {
95
+                    if ( ! isset( $instances[ $opt_name ] ) ) {
96
+                        Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
+
98
+                        Redux::set_sections(
99
+                            $opt_name,
100
+                            array(
101
+                                array(
102
+                                    'id'     => 'EXTENSION_USERS_FAKE_ID' . $opt_name,
103
+                                    'fields' => $fields,
104
+                                    'title'  => 'N/A',
105
+                                ),
106
+                            )
107
+                        );
108
+
109
+                        Redux::init( $opt_name );
110
+
111
+                        $instances = ReduxFrameworkInstances::get_all_instances();
112
+                    }
113
+
114
+                    self::check_opt_name( $opt_name );
115
+
116
+                    Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
+                }
118
+            }
119
+        }
120
+
121
+        /**
122
+         * Construct Args.
123
+         *
124
+         * @param string $opt_name Panel Opt Name.
125
+         *
126
+         * @return mixed
127
+         */
128
+        public static function construct_args( string $opt_name ) {
129
+            $args             = self::$args[ $opt_name ];
130
+            $args['opt_name'] = $opt_name;
131
+
132
+            if ( ! isset( $args['menu_title'] ) ) {
133
+                $args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
+            }
135
+
136
+            if ( ! isset( $args['page_title'] ) ) {
137
+                $args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
+            }
139
+
140
+            if ( ! isset( $args['page_slug'] ) ) {
141
+                $args['page_slug'] = $opt_name . '_options';
142
+            }
143
+
144
+            return $args;
145
+        }
146
+
147
+        /**
148
+         * Construct Profiles.
149
+         *
150
+         * @param string $opt_name Panel opt_name.
151
+         *
152
+         * @return array
153
+         */
154
+        public static function construct_profiles( string $opt_name ): array {
155
+            $profiles = array();
156
+
157
+            if ( ! isset( self::$profiles[ $opt_name ] ) ) {
158
+                return $profiles;
159
+            }
160
+
161
+            foreach ( self::$profiles[ $opt_name ] as $profile ) {
162
+                $profile['sections'] = self::construct_sections( $opt_name, $profile['id'] );
163
+                $profiles[]          = $profile;
164
+            }
165
+
166
+            ksort( $profiles );
167
+
168
+            return $profiles;
169
+        }
170
+
171
+        /**
172
+         * Construct Sections.
173
+         *
174
+         * @param string     $opt_name    Panel opt_name.
175
+         * @param int|string $profile_id  Profile ID.
176
+         *
177
+         * @return array
178
+         */
179
+        public static function construct_sections( string $opt_name, $profile_id ): array {
180
+            $sections = array();
181
+
182
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
+                return $sections;
184
+            }
185
+
186
+            foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
+                if ( $section['profile_id'] === $profile_id ) {
188
+                    self::$sections[ $opt_name ][ $section_id ]['roles'] = $section;
189
+
190
+                    $p = $section['priority'];
191
+
192
+                    while ( isset( $sections[ $p ] ) ) {
193
+                        echo esc_html( $p++ );
194
+                    }
195
+
196
+                    $section['fields'] = self::construct_fields( $opt_name, $section_id );
197
+                    $sections[ $p ]    = $section;
198
+                }
199
+            }
200
+
201
+            return $sections;
202
+        }
203
+
204
+        /**
205
+         * Construct Fields.
206
+         *
207
+         * @param string $opt_name    Panel opt_name.
208
+         * @param string $section_id  Section ID.
209
+         * @param bool   $permissions Permissions.
210
+         * @param bool   $roles       Roles.
211
+         *
212
+         * @return array
213
+         */
214
+        public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $roles = false ): array {
215
+            $fields = array();
216
+
217
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
218
+                return $fields;
219
+            }
220
+
221
+            foreach ( self::$fields[ $opt_name ] as $key => $field ) {
222
+                // Nested permissions.
223
+                $field['permissions'] = $field['permissions'] ?? $permissions;
224
+
225
+                self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
226
+
227
+                // Nested roles permissions.
228
+                $field['roles'] = $field['roles'] ?? $roles;
229
+
230
+                self::$fields[ $opt_name ][ $key ]['roles'] = $field['roles'];
231
+
232
+                if ( $field['section_id'] === $section_id ) {
233
+                    $p = $field['priority'];
234
+
235
+                    while ( isset( $fields[ $p ] ) ) {
236
+                        echo esc_html( $p++ );
237
+                    }
238
+
239
+                    $fields[ $p ] = $field;
240
+                }
241
+            }
242
+
243
+            ksort( $fields );
244
+
245
+            return $fields;
246
+        }
247
+
248
+        /**
249
+         * Get Section.
250
+         *
251
+         * @param string $opt_name Panel opt_name.
252
+         * @param string $id       ID.
253
+         *
254
+         * @return bool
255
+         */
256
+        public static function get_section( string $opt_name = '', string $id = '' ): bool {
257
+            self::check_opt_name( $opt_name );
258
+
259
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
260
+                if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
261
+                    $id = strtolower( sanitize_html_class( $id ) );
262
+                }
263
+
264
+                return self::$sections[ $opt_name ][ $id ] ?? false;
265
+            }
266
+
267
+            return false;
268
+        }
269
+
270
+        /**
271
+         * Set args.
272
+         *
273
+         * @param string $opt_name Panel opt_name.
274
+         * @param array  $args     Args array.
275
+         */
276
+        public static function set_args( string $opt_name = '', array $args = array() ) {
277
+            self::check_opt_name( $opt_name );
278
+
279
+            if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
280
+                self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
281
+                self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
282
+            }
283
+        }
284
+
285
+        /**
286
+         * Set Section.
287
+         *
288
+         * @param string $opt_name Panel opt_name.
289
+         * @param array  $section  Section array.
290
+         */
291
+        public static function set_section( string $opt_name = '', array $section = array() ) {
292
+            self::check_opt_name( $opt_name );
293
+
294
+            if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
295
+                if ( ! isset( $section['id'] ) ) {
296
+                    if ( isset( $section['title'] ) ) {
297
+                        $section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
298
+                    } else {
299
+                        $section['id'] = 'section';
300
+                    }
301
+
302
+                    if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
303
+                        $orig = $section['id'];
304
+                        $i    = 0;
305
+
306
+                        while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
307
+                            $section['id'] = $orig . '_' . $i;
308
+                        }
309
+                    }
310
+                }
311
+
312
+                if ( ! isset( $section['priority'] ) ) {
313
+                    $section['priority'] = self::get_priority( $opt_name, 'sections' );
314
+                }
315
+
316
+                if ( isset( $section['fields'] ) ) {
317
+                    if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
318
+                        if ( isset( $section['permissions'] ) || isset( $section['roles'] ) ) {
319
+                            foreach ( $section['fields'] as $key => $field ) {
320
+                                if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
321
+                                    $section['fields'][ $key ]['permissions'] = $section['permissions'];
322
+                                }
323
+
324
+                                if ( ! isset( $field['roles'] ) && isset( $section['roles'] ) ) {
325
+                                    $section['fields'][ $key ]['roles'] = $section['roles'];
326
+                                }
327
+                            }
328
+                        }
329
+
330
+                        self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
331
+                    }
332
+
333
+                    unset( $section['fields'] );
334
+                }
335
+
336
+                self::$sections[ $opt_name ][ $section['id'] ] = $section;
337
+            } else {
338
+                self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
339
+            }
340
+        }
341
+
342
+        /**
343
+         * Process Section Array.
344
+         *
345
+         * @param string $opt_name   Panel opt_name.
346
+         * @param string $profile_id Profile ID.
347
+         * @param array  $sections   Sections array.
348
+         */
349
+        public static function process_sections_array( string $opt_name = '', string $profile_id = '', array $sections = array() ) {
350
+            if ( ! empty( $opt_name ) && ! empty( $profile_id ) && is_array( $sections ) && ! empty( $sections ) ) {
351
+                foreach ( $sections as $section ) {
352
+                    if ( ! is_array( $section ) ) {
353
+                        continue;
354
+                    }
355
+
356
+                    $section['profile_id'] = $profile_id;
357
+
358
+                    if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
359
+                        $section['fields'] = array();
360
+                    }
361
+
362
+                    self::set_section( $opt_name, $section );
363
+                }
364
+            }
365
+        }
366
+
367
+        /**
368
+         * Process Fields Array.
369
+         *
370
+         * @param string $opt_name   Panel opt_name.
371
+         * @param string $section_id Section ID.
372
+         * @param array  $fields     Fields array.
373
+         */
374
+        public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
375
+            if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
376
+                foreach ( $fields as $field ) {
377
+                    if ( ! is_array( $field ) ) {
378
+                        continue;
379
+                    }
380
+
381
+                    $field['section_id'] = $section_id;
382
+
383
+                    self::set_field( $opt_name, $field );
384
+                }
385
+            }
386
+        }
387
+
388
+        /**
389
+         * Get field.
390
+         *
391
+         * @param string $opt_name Panel opt_name.
392
+         * @param string $id       Field ID.
393
+         *
394
+         * @return bool
395
+         */
396
+        public static function get_field( string $opt_name = '', string $id = '' ): bool {
397
+            self::check_opt_name( $opt_name );
398
+
399
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
400
+                return self::$fields[ $opt_name ][ $id ] ?? false;
401
+            }
402
+
403
+            return false;
404
+        }
405
+
406
+        /**
407
+         * Set field.
408
+         *
409
+         * @param string $opt_name Panel opt_name.
410
+         * @param array  $field    Field array.
411
+         */
412
+        public static function set_field( string $opt_name = '', array $field = array() ) {
413
+            self::check_opt_name( $opt_name );
414
+
415
+            if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
416
+                if ( ! isset( $field['priority'] ) ) {
417
+                    $field['priority'] = self::get_priority( $opt_name, 'fields' );
418
+                }
419
+
420
+                self::$fields[ $opt_name ][ $field['id'] ] = $field;
421
+            }
422
+        }
423
+
424
+        /**
425
+         * Set Profile.
426
+         *
427
+         * @param string $opt_name Panel opt_name.
428
+         * @param array  $profile  Profile array.
429
+         */
430
+        public static function set_profile( string $opt_name = '', array $profile = array() ) {
431
+            self::check_opt_name( $opt_name );
432
+
433
+            if ( ! empty( $opt_name ) && is_array( $profile ) && ! empty( $profile ) ) {
434
+                if ( ! isset( $profile['id'] ) ) {
435
+                    if ( isset( $profile['title'] ) ) {
436
+                        $profile['id'] = strtolower( sanitize_html_class( $profile['title'] ) );
437
+                    } else {
438
+                        $profile['id'] = 'profile';
439
+                    }
440
+
441
+                    if ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
442
+                        $orig = $profile['id'];
443
+                        $i    = 0;
444
+
445
+                        while ( isset( self::$profiles[ $opt_name ][ $profile['id'] ] ) ) {
446
+                            $profile['id'] = $orig . '_' . $i;
447
+                        }
448
+                    }
449
+                }
450
+
451
+                if ( isset( $profile['sections'] ) ) {
452
+                    if ( ! empty( $profile['sections'] ) && is_array( $profile['sections'] ) ) {
453
+                        if ( isset( $profile['permissions'] ) || isset( $profile['roles'] ) ) {
454
+                            foreach ( $profile['sections'] as $key => $section ) {
455
+                                if ( ! isset( $section['permissions'] ) && isset( $profile['permissions'] ) ) {
456
+                                    $profile['sections'][ $key ]['permissions'] = $profile['permissions'];
457
+                                }
458
+
459
+                                if ( ! isset( $section['roles'] ) && isset( $profile['roles'] ) ) {
460
+                                    $profile['sections'][ $key ]['roles'] = $profile['roles'];
461
+                                }
462
+                            }
463
+                        }
464
+
465
+                        self::process_sections_array( $opt_name, $profile['id'], $profile['sections'] );
466
+                    }
467
+
468
+                    unset( $profile['sections'] );
469
+                }
470
+
471
+                self::$profiles[ $opt_name ][ $profile['id'] ] = $profile;
472
+            } else {
473
+                self::$errors[ $opt_name ]['profile']['empty'] = esc_html__( 'Unable to create a profile due an empty profile array or the profile variable passed was not an array.', 'redux-framework' );
474
+            }
475
+        }
476
+
477
+        /**
478
+         * Get Priority.
479
+         *
480
+         * @param string $opt_name Panel opt_name.
481
+         * @param mixed  $type     Type.
482
+         *
483
+         * @return mixed
484
+         */
485
+        public static function get_priority( string $opt_name, $type ) {
486
+            $priority                              = self::$priority[ $opt_name ][ $type ];
487
+            self::$priority[ $opt_name ][ $type ] += 1;
488
+
489
+            return $priority;
490
+        }
491
+
492
+        /**
493
+         * Check opt name.
494
+         *
495
+         * @param string $opt_name Panel opt_name.
496
+         */
497
+        public static function check_opt_name( string $opt_name = '' ) {
498
+            if ( empty( $opt_name ) || is_array( $opt_name ) ) {
499
+                return;
500
+            }
501
+
502
+            if ( ! isset( self::$profiles[ $opt_name ] ) ) {
503
+                self::$profiles[ $opt_name ] = array();
504
+            }
505
+
506
+            if ( ! isset( self::$priority[ $opt_name ] ) ) {
507
+                self::$priority[ $opt_name ]['args'] = 1;
508
+            }
509
+
510
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
511
+                self::$sections[ $opt_name ]             = array();
512
+                self::$priority[ $opt_name ]['sections'] = 1;
513
+            }
514
+
515
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
516
+                self::$fields[ $opt_name ]             = array();
517
+                self::$priority[ $opt_name ]['fields'] = 1;
518
+            }
519
+
520
+            if ( ! isset( self::$errors[ $opt_name ] ) ) {
521
+                self::$errors[ $opt_name ] = array();
522
+            }
523
+
524
+            if ( ! isset( self::$init[ $opt_name ] ) ) {
525
+                self::$init[ $opt_name ] = false;
526
+            }
527
+
528
+            if ( ! isset( self::$args[ $opt_name ] ) ) {
529
+                self::$args[ $opt_name ] = false;
530
+            }
531
+        }
532
+
533
+        /**
534
+         * Get USer Meta.
535
+         *
536
+         * @param array $args Args array.
537
+         *
538
+         * @return mixed
539
+         */
540
+        public static function get_user_meta( array $args = array() ) {
541
+            $default = array(
542
+                'key'      => '',
543
+                'opt_name' => '',
544
+                'user'     => '',
545
+            );
546
+
547
+            $args = wp_parse_args( $args, $default );
548
+
549
+            if ( empty( $args['user'] ) ) {
550
+                $args['user'] = get_current_user_id();
551
+            }
552
+
553
+            // phpcs:ignore WordPress.PHP.DontExtract
554
+            extract( $args );
555
+
556
+            $single = ! empty( $key );
557
+
558
+            $meta = get_user_meta( $user, $key, $single );
559
+
560
+            if ( $single ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
561
+                // Do nothing.
562
+            } elseif ( ! empty( $meta ) ) {
563
+                foreach ( $meta as $key => $value ) {
564
+                    if ( is_array( $value ) ) {
565
+                        $value = $value[0];
566
+                    }
567
+
568
+                    $meta[ $key ] = maybe_unserialize( $value );
569
+                }
570
+            }
571
+
572
+            return $meta;
573
+        }
574
+    }
575
+
576
+    Redux_Users::load();
577 577
 }
Please login to merge, or discard this patch.
inc/extensions/color_scheme/class-redux-extension-color-scheme.php 2 patches
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -125,7 +125,7 @@  discard block
 block discarded – undo
125 125
 			}
126 126
 
127 127
 			$x            = get_option( $this->parent->args['opt_name'] );
128
-			$color_opts   = $x[ $this->field_id ] ?? array();
128
+			$color_opts   = $x[$this->field_id] ?? array();
129 129
 			$wrong_format = false;
130 130
 
131 131
 			if ( ! isset( $color_opts['color_scheme_name'] ) ) {
@@ -133,8 +133,8 @@  discard block
 block discarded – undo
133 133
 
134 134
 				$data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
135 135
 
136
-				if ( ! empty( $data ) && isset( $x[ $this->field_id ] ) ) {
137
-					$x[ $this->field_id ] = $data;
136
+				if ( ! empty( $data ) && isset( $x[$this->field_id] ) ) {
137
+					$x[$this->field_id] = $data;
138 138
 
139 139
 					update_option( $this->parent->args['opt_name'], $x );
140 140
 				}
@@ -165,9 +165,9 @@  discard block
 block discarded – undo
165 165
 
166 166
 				$data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
167 167
 
168
-				$this->parent->options[ $this->field_id ] = $data;
168
+				$this->parent->options[$this->field_id] = $data;
169 169
 
170
-				$defaults[ $this->field_id ] = $data;
170
+				$defaults[$this->field_id] = $data;
171 171
 			}
172 172
 
173 173
 			return $defaults;
@@ -217,7 +217,7 @@  discard block
 block discarded – undo
217 217
 			if ( Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
218 218
 				// Check if reset_all was fired.
219 219
 				$this->reset_all();
220
-				$defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
220
+				$defaults[$this->field_id] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
221 221
 			}
222 222
 
223 223
 			return $defaults;
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
 					$cur_tab = sanitize_text_field( wp_unslash( $_COOKIE['redux_current_tab'] ) );
238 238
 
239 239
 					// Get the tab/section number field is used on.
240
-					$tab_num = $this->parent->field_sections['color_scheme'][ $this->field_id ];
240
+					$tab_num = $this->parent->field_sections['color_scheme'][$this->field_id];
241 241
 
242 242
 					// Match...
243 243
 					if ( $cur_tab === $tab_num ) {
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
 						// Reset data.
246 246
 						$this->reset_all();
247 247
 					}
248
-					$defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
248
+					$defaults[$this->field_id] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
249 249
 				}
250 250
 			}
251 251
 
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
 		 * @access      public
264 264
 		 */
265 265
 		public function save_hook( array $saved_options = array(), array $old_options = array() ): array {
266
-			if ( ! isset( $saved_options[ $this->field_id ] ) || empty( $saved_options[ $this->field_id ] ) || ( is_array( $saved_options[ $this->field_id ] ) && $old_options === $saved_options ) || ! array_key_exists( $this->field_id, $saved_options ) ) {
266
+			if ( ! isset( $saved_options[$this->field_id] ) || empty( $saved_options[$this->field_id] ) || ( is_array( $saved_options[$this->field_id] ) && $old_options === $saved_options ) || ! array_key_exists( $this->field_id, $saved_options ) ) {
267 267
 				return $saved_options;
268 268
 			}
269 269
 
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
 				return $saved_options;
273 273
 			}
274 274
 
275
-			$first_value = reset( $saved_options[ $this->field_id ] ); // First Element's Value.
275
+			$first_value = reset( $saved_options[$this->field_id] ); // First Element's Value.
276 276
 
277 277
 			// Parse the JSON to an array.
278 278
 			if ( isset( $first_value['data'] ) ) {
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
 				Redux_Color_Scheme_Functions::set_current_scheme_id( $saved_options['redux-scheme-select'] );
284 284
 
285 285
 				// Get the current field ID.
286
-				$raw_data = $saved_options[ $this->field_id ];
286
+				$raw_data = $saved_options[$this->field_id];
287 287
 
288 288
 				// Create a new array.
289 289
 				$save_data = array();
@@ -341,7 +341,7 @@  discard block
 block discarded – undo
341 341
 				// Enum through values and assign them to a new array.
342 342
 				foreach ( $save_data as $val ) {
343 343
 					if ( isset( $val['id'] ) ) {
344
-						$new_scheme[ $val['id'] ] = $val;
344
+						$new_scheme[$val['id']] = $val;
345 345
 					}
346 346
 				}
347 347
 
@@ -354,24 +354,24 @@  discard block
 block discarded – undo
354 354
 					if ( isset( $v['type'] ) ) {
355 355
 						$val = $v['value'];
356 356
 
357
-						unset( $database_data[ $k ] );
357
+						unset( $database_data[$k] );
358 358
 
359
-						$database_data[ $k ] = $val;
359
+						$database_data[$k] = $val;
360 360
 					}
361 361
 				}
362 362
 
363
-				$saved_options[ $this->field_id ] = $database_data;
363
+				$saved_options[$this->field_id] = $database_data;
364 364
 
365 365
 				// Check if we should save this compared to the old data.
366 366
 				$save_scheme = false;
367 367
 
368 368
 				// Doesn't exist or is empty.
369
-				if ( ! isset( $old_options[ $this->field_id ] ) || ( isset( $old_options[ $this->field_id ] ) && ! empty( $old_options[ $this->field_id ] ) ) ) {
369
+				if ( ! isset( $old_options[$this->field_id] ) || ( isset( $old_options[$this->field_id] ) && ! empty( $old_options[$this->field_id] ) ) ) {
370 370
 					$save_scheme = true;
371 371
 				}
372 372
 
373 373
 				// Isn't empty and isn't the same as the new array.
374
-				if ( ! empty( $old_options[ $this->field_id ] ) && $saved_options[ $this->field_id ] !== $old_options[ $this->field_id ] ) {
374
+				if ( ! empty( $old_options[$this->field_id] ) && $saved_options[$this->field_id] !== $old_options[$this->field_id] ) {
375 375
 					$save_scheme = true;
376 376
 				}
377 377
 
@@ -413,7 +413,7 @@  discard block
 block discarded – undo
413 413
 		 * @access      public
414 414
 		 */
415 415
 		public function reset_all() {
416
-			if ( ! empty( $this->field_id ) && isset( $this->parent->options_defaults[ $this->field_id ] ) && ! empty( $this->parent->options_defaults[ $this->field_id ] ) ) {
416
+			if ( ! empty( $this->field_id ) && isset( $this->parent->options_defaults[$this->field_id] ) && ! empty( $this->parent->options_defaults[$this->field_id] ) ) {
417 417
 				Redux_Color_Scheme_Functions::$parent   = $this->parent;
418 418
 				Redux_Color_Scheme_Functions::$field_id = $this->field_id;
419 419
 
@@ -643,10 +643,10 @@  discard block
 block discarded – undo
643 643
 						if ( false !== $schemes ) {
644 644
 
645 645
 							// If scheme name exists...
646
-							if ( isset( $schemes[ $scheme_id ] ) ) {
646
+							if ( isset( $schemes[$scheme_id] ) ) {
647 647
 
648 648
 								// Unset it.
649
-								unset( $schemes[ $scheme_id ] );
649
+								unset( $schemes[$scheme_id] );
650 650
 
651 651
 								// Save the scheme data, minus the deleted scheme.  Upon success...
652 652
 								if ( true === Redux_Color_Scheme_Functions::write_scheme_file( $schemes ) ) {
@@ -730,7 +730,7 @@  discard block
 block discarded – undo
730 730
 		 * @return      array Default values from config.
731 731
 		 */
732 732
 		private function get_default_data(): array {
733
-			$def_opts = $this->parent->options_defaults[ $this->field_id ];
733
+			$def_opts = $this->parent->options_defaults[$this->field_id];
734 734
 
735 735
 			if ( isset( $def_opts['color_scheme_name'] ) ) {
736 736
 				return array();
Please login to merge, or discard this patch.
Indentation   +766 added lines, -766 removed lines patch added patch discarded remove patch
@@ -16,774 +16,774 @@
 block discarded – undo
16 16
 // Don't duplicate me!
17 17
 if ( ! class_exists( 'Redux_Extension_Color_Scheme' ) ) {
18 18
 
19
-	/**
20
-	 * Class Redux_Extension_Color_Scheme
21
-	 */
22
-	class Redux_Extension_Color_Scheme extends Redux_Extension_Abstract {
23
-
24
-		/**
25
-		 * Extension version.
26
-		 *
27
-		 * @var string
28
-		 */
29
-		public static $version = '4.4.10';
30
-
31
-		/**
32
-		 * Extension friendly name.
33
-		 *
34
-		 * @var string
35
-		 */
36
-		public string $extension_name = 'Color Schemes';
37
-
38
-		/**
39
-		 * Field ID.
40
-		 *
41
-		 * @var string
42
-		 */
43
-		public $field_id = '';
44
-
45
-		/**
46
-		 * Transparent output bit.
47
-		 *
48
-		 * @var bool
49
-		 */
50
-		public bool $output_transparent = false;
51
-
52
-		/**
53
-		 * Extension field name.
54
-		 *
55
-		 * @var string
56
-		 */
57
-		public string $field_name = '';
58
-
59
-		/**
60
-		 * Class Constructor. Defines the args for the extensions class
61
-		 *
62
-		 * @since       1.0.0
63
-		 * @access      public
64
-		 *
65
-		 * @param       object $redux Parent settings.
66
-		 *
67
-		 * @return      void
68
-		 */
69
-		public function __construct( $redux ) {
70
-			parent::__construct( $redux, __FILE__ );
71
-
72
-			$this->add_field( 'color_scheme' );
73
-			$this->field_name = 'color_scheme';
74
-
75
-			add_filter( "redux/options/{$this->parent->args['opt_name']}/defaults", array( $this, 'set_defaults' ) );
19
+    /**
20
+     * Class Redux_Extension_Color_Scheme
21
+     */
22
+    class Redux_Extension_Color_Scheme extends Redux_Extension_Abstract {
23
+
24
+        /**
25
+         * Extension version.
26
+         *
27
+         * @var string
28
+         */
29
+        public static $version = '4.4.10';
30
+
31
+        /**
32
+         * Extension friendly name.
33
+         *
34
+         * @var string
35
+         */
36
+        public string $extension_name = 'Color Schemes';
37
+
38
+        /**
39
+         * Field ID.
40
+         *
41
+         * @var string
42
+         */
43
+        public $field_id = '';
44
+
45
+        /**
46
+         * Transparent output bit.
47
+         *
48
+         * @var bool
49
+         */
50
+        public bool $output_transparent = false;
51
+
52
+        /**
53
+         * Extension field name.
54
+         *
55
+         * @var string
56
+         */
57
+        public string $field_name = '';
58
+
59
+        /**
60
+         * Class Constructor. Defines the args for the extensions class
61
+         *
62
+         * @since       1.0.0
63
+         * @access      public
64
+         *
65
+         * @param       object $redux Parent settings.
66
+         *
67
+         * @return      void
68
+         */
69
+        public function __construct( $redux ) {
70
+            parent::__construct( $redux, __FILE__ );
71
+
72
+            $this->add_field( 'color_scheme' );
73
+            $this->field_name = 'color_scheme';
74
+
75
+            add_filter( "redux/options/{$this->parent->args['opt_name']}/defaults", array( $this, 'set_defaults' ) );
76 76
 
77
-			// Ajax hooks.
78
-			add_action( 'wp_ajax_redux_color_schemes', array( $this, 'parse_ajax' ) );
79
-			add_action( 'wp_ajax_nopriv_redux_color_schemes', array( $this, 'parse_ajax' ) );
80
-
81
-			// Reset hooks.
82
-			add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/defaults', array( $this, 'reset_defaults' ), 0, 3 );
83
-			add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/defaults_section', array( $this, 'reset_defaults_section' ), 0, 3 );
84
-
85
-			// Save filter.
86
-			add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/before_validation', array( $this, 'save_hook' ), 0, 3 );
87
-
88
-			// Register hook - to get field id and prep helper.
89
-			add_action( 'redux/options/' . $this->parent->args['opt_name'] . '/field/' . $this->field_name . '/register', array( $this, 'register_field' ) );
90
-
91
-			include_once $this->extension_dir . 'color_scheme/inc/class-redux-color-scheme-functions.php';
92
-			Redux_Color_Scheme_Functions::init( $redux );
93
-
94
-			$field = Redux_Color_Scheme_Functions::get_field( $redux );
95
-
96
-			if ( ! is_array( $field ) ) {
97
-				return;
98
-			}
99
-
100
-			$this->field_id = $field['id'];
101
-
102
-			// Prep storage.
103
-			$upload_dir = Redux_Color_Scheme_Functions::$upload_dir;
104
-
105
-			// Create uploads/redux_scheme_colors/ folder.
106
-			if ( ! is_dir( $upload_dir ) ) {
107
-				Redux_Core::$filesystem->execute( 'mkdir', $upload_dir );
108
-			}
109
-		}
110
-
111
-		/**
112
-		 * Set default values after reset.
113
-		 *
114
-		 * @param array $defaults Default values.
115
-		 *
116
-		 * @return array
117
-		 */
118
-		public function set_defaults( array $defaults = array() ): array {
119
-			if ( ! Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
120
-				return $defaults;
121
-			}
122
-
123
-			if ( empty( $this->field_id ) ) {
124
-				return $defaults;
125
-			}
126
-
127
-			$x            = get_option( $this->parent->args['opt_name'] );
128
-			$color_opts   = $x[ $this->field_id ] ?? array();
129
-			$wrong_format = false;
130
-
131
-			if ( ! isset( $color_opts['color_scheme_name'] ) ) {
132
-				$wrong_format = true;
133
-
134
-				$data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
135
-
136
-				if ( ! empty( $data ) && isset( $x[ $this->field_id ] ) ) {
137
-					$x[ $this->field_id ] = $data;
138
-
139
-					update_option( $this->parent->args['opt_name'], $x );
140
-				}
141
-			}
142
-
143
-			Redux_Color_Scheme_Functions::$parent = $this->parent;
144
-
145
-			$ot_val                   = Redux_Color_Scheme_Functions::get_output_transparent_val();
146
-			$this->output_transparent = $ot_val;
147
-
148
-			Redux_Color_Scheme_Functions::convert_to_db();
149
-
150
-			$scheme_key  = Redux_Color_Scheme_Functions::get_scheme_key();
151
-			$scheme_data = get_option( $scheme_key );
152
-
153
-			$scheme_data_exists = ! empty( $scheme_data );
154
-
155
-			$default_exists = in_array( 'default', array_map( 'strtolower', Redux_Color_Scheme_Functions::get_scheme_names() ), true );
156
-
157
-			if ( ! $scheme_data_exists || ! $default_exists || $wrong_format ) {
158
-				$data = $this->get_default_data();
159
-
160
-				// Add to (and/or create) JSON scheme file.
161
-				Redux_Color_Scheme_Functions::set_scheme_data( 'Default', $data );
162
-
163
-				// Set default scheme.
164
-				Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
165
-
166
-				$data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
167
-
168
-				$this->parent->options[ $this->field_id ] = $data;
169
-
170
-				$defaults[ $this->field_id ] = $data;
171
-			}
172
-
173
-			return $defaults;
174
-		}
175
-
176
-		/**
177
-		 * Field Register. Sets the whole smash up.
178
-		 *
179
-		 * @param       array $data Field data.
180
-		 *
181
-		 * @return      array
182
-		 * @since       1.0.0
183
-		 * @access      public
184
-		 */
185
-		public function register_field( array $data ): array {
186
-
187
-			// Include color_scheme helper.
188
-			include_once $this->extension_dir . 'color_scheme/inc/class-redux-color-scheme-functions.php';
189
-
190
-			if ( isset( $data['output_transparent'] ) ) {
191
-				$this->output_transparent = $data['output_transparent'];
192
-			}
77
+            // Ajax hooks.
78
+            add_action( 'wp_ajax_redux_color_schemes', array( $this, 'parse_ajax' ) );
79
+            add_action( 'wp_ajax_nopriv_redux_color_schemes', array( $this, 'parse_ajax' ) );
80
+
81
+            // Reset hooks.
82
+            add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/defaults', array( $this, 'reset_defaults' ), 0, 3 );
83
+            add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/defaults_section', array( $this, 'reset_defaults_section' ), 0, 3 );
84
+
85
+            // Save filter.
86
+            add_action( 'redux/validate/' . $this->parent->args['opt_name'] . '/before_validation', array( $this, 'save_hook' ), 0, 3 );
87
+
88
+            // Register hook - to get field id and prep helper.
89
+            add_action( 'redux/options/' . $this->parent->args['opt_name'] . '/field/' . $this->field_name . '/register', array( $this, 'register_field' ) );
90
+
91
+            include_once $this->extension_dir . 'color_scheme/inc/class-redux-color-scheme-functions.php';
92
+            Redux_Color_Scheme_Functions::init( $redux );
93
+
94
+            $field = Redux_Color_Scheme_Functions::get_field( $redux );
95
+
96
+            if ( ! is_array( $field ) ) {
97
+                return;
98
+            }
99
+
100
+            $this->field_id = $field['id'];
101
+
102
+            // Prep storage.
103
+            $upload_dir = Redux_Color_Scheme_Functions::$upload_dir;
104
+
105
+            // Create uploads/redux_scheme_colors/ folder.
106
+            if ( ! is_dir( $upload_dir ) ) {
107
+                Redux_Core::$filesystem->execute( 'mkdir', $upload_dir );
108
+            }
109
+        }
110
+
111
+        /**
112
+         * Set default values after reset.
113
+         *
114
+         * @param array $defaults Default values.
115
+         *
116
+         * @return array
117
+         */
118
+        public function set_defaults( array $defaults = array() ): array {
119
+            if ( ! Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
120
+                return $defaults;
121
+            }
122
+
123
+            if ( empty( $this->field_id ) ) {
124
+                return $defaults;
125
+            }
126
+
127
+            $x            = get_option( $this->parent->args['opt_name'] );
128
+            $color_opts   = $x[ $this->field_id ] ?? array();
129
+            $wrong_format = false;
130
+
131
+            if ( ! isset( $color_opts['color_scheme_name'] ) ) {
132
+                $wrong_format = true;
133
+
134
+                $data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
135
+
136
+                if ( ! empty( $data ) && isset( $x[ $this->field_id ] ) ) {
137
+                    $x[ $this->field_id ] = $data;
138
+
139
+                    update_option( $this->parent->args['opt_name'], $x );
140
+                }
141
+            }
142
+
143
+            Redux_Color_Scheme_Functions::$parent = $this->parent;
144
+
145
+            $ot_val                   = Redux_Color_Scheme_Functions::get_output_transparent_val();
146
+            $this->output_transparent = $ot_val;
147
+
148
+            Redux_Color_Scheme_Functions::convert_to_db();
149
+
150
+            $scheme_key  = Redux_Color_Scheme_Functions::get_scheme_key();
151
+            $scheme_data = get_option( $scheme_key );
152
+
153
+            $scheme_data_exists = ! empty( $scheme_data );
154
+
155
+            $default_exists = in_array( 'default', array_map( 'strtolower', Redux_Color_Scheme_Functions::get_scheme_names() ), true );
156
+
157
+            if ( ! $scheme_data_exists || ! $default_exists || $wrong_format ) {
158
+                $data = $this->get_default_data();
159
+
160
+                // Add to (and/or create) JSON scheme file.
161
+                Redux_Color_Scheme_Functions::set_scheme_data( 'Default', $data );
162
+
163
+                // Set default scheme.
164
+                Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
165
+
166
+                $data = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
167
+
168
+                $this->parent->options[ $this->field_id ] = $data;
169
+
170
+                $defaults[ $this->field_id ] = $data;
171
+            }
172
+
173
+            return $defaults;
174
+        }
175
+
176
+        /**
177
+         * Field Register. Sets the whole smash up.
178
+         *
179
+         * @param       array $data Field data.
180
+         *
181
+         * @return      array
182
+         * @since       1.0.0
183
+         * @access      public
184
+         */
185
+        public function register_field( array $data ): array {
186
+
187
+            // Include color_scheme helper.
188
+            include_once $this->extension_dir . 'color_scheme/inc/class-redux-color-scheme-functions.php';
189
+
190
+            if ( isset( $data['output_transparent'] ) ) {
191
+                $this->output_transparent = $data['output_transparent'];
192
+            }
193 193
 
194
-			$this->field_id                         = $data['id'];
195
-			Redux_Color_Scheme_Functions::$field_id = $data['id'];
196
-
197
-			// Set helper parent object.
198
-			Redux_Color_Scheme_Functions::$parent = $this->parent;
199
-
200
-			// Prep storage.
201
-			$upload_dir = Redux_Color_Scheme_Functions::$upload_dir;
202
-
203
-			// Set upload_dir cookie.
204
-			setcookie( 'redux_color_scheme_upload_dir', $upload_dir, 0, '/' );
205
-
206
-			return $data;
207
-		}
208
-
209
-		/**
210
-		 * Reset defaults.
211
-		 *
212
-		 * @param array $defaults Default values.
213
-		 *
214
-		 * @return array
215
-		 */
216
-		public function reset_defaults( array $defaults = array() ): array {
217
-			if ( Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
218
-				// Check if reset_all was fired.
219
-				$this->reset_all();
220
-				$defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
221
-			}
194
+            $this->field_id                         = $data['id'];
195
+            Redux_Color_Scheme_Functions::$field_id = $data['id'];
196
+
197
+            // Set helper parent object.
198
+            Redux_Color_Scheme_Functions::$parent = $this->parent;
199
+
200
+            // Prep storage.
201
+            $upload_dir = Redux_Color_Scheme_Functions::$upload_dir;
202
+
203
+            // Set upload_dir cookie.
204
+            setcookie( 'redux_color_scheme_upload_dir', $upload_dir, 0, '/' );
205
+
206
+            return $data;
207
+        }
208
+
209
+        /**
210
+         * Reset defaults.
211
+         *
212
+         * @param array $defaults Default values.
213
+         *
214
+         * @return array
215
+         */
216
+        public function reset_defaults( array $defaults = array() ): array {
217
+            if ( Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
218
+                // Check if reset_all was fired.
219
+                $this->reset_all();
220
+                $defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
221
+            }
222 222
 
223
-			return $defaults;
224
-		}
223
+            return $defaults;
224
+        }
225 225
 
226
-		/**
227
-		 * Reset section defaults.
228
-		 *
229
-		 * @param array $defaults Default values.
230
-		 *
231
-		 * @return array
232
-		 */
233
-		public function reset_defaults_section( array $defaults = array() ): array {
234
-			if ( Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
235
-				// Get the current tab/section number.
236
-				if ( isset( $_COOKIE['redux_current_tab'] ) ) {
237
-					$cur_tab = sanitize_text_field( wp_unslash( $_COOKIE['redux_current_tab'] ) );
238
-
239
-					// Get the tab/section number field is used on.
240
-					$tab_num = $this->parent->field_sections['color_scheme'][ $this->field_id ];
241
-
242
-					// Match...
243
-					if ( $cur_tab === $tab_num ) {
244
-
245
-						// Reset data.
246
-						$this->reset_all();
247
-					}
248
-					$defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
249
-				}
250
-			}
251
-
252
-			return $defaults;
253
-		}
254
-
255
-		/**
256
-		 * Save Changes Hook. What to do when changes are saved
257
-		 *
258
-		 * @param array $saved_options Saved data.
259
-		 * @param array $old_options   Previous data.
260
-		 *
261
-		 * @return      array
262
-		 * @since       1.0.0
263
-		 * @access      public
264
-		 */
265
-		public function save_hook( array $saved_options = array(), array $old_options = array() ): array {
266
-			if ( ! isset( $saved_options[ $this->field_id ] ) || empty( $saved_options[ $this->field_id ] ) || ( is_array( $saved_options[ $this->field_id ] ) && $old_options === $saved_options ) || ! array_key_exists( $this->field_id, $saved_options ) ) {
267
-				return $saved_options;
268
-			}
269
-
270
-			// We'll use the reset hook instead.
271
-			if ( ! empty( $saved_options['defaults'] ) || ! empty( $saved_options['defaults-section'] ) ) {
272
-				return $saved_options;
273
-			}
274
-
275
-			$first_value = reset( $saved_options[ $this->field_id ] ); // First Element's Value.
276
-
277
-			// Parse the JSON to an array.
278
-			if ( isset( $first_value['data'] ) ) {
279
-
280
-				Redux_Color_Scheme_Functions::$parent   = $this->parent;
281
-				Redux_Color_Scheme_Functions::$field_id = $this->field_id;
282
-
283
-				Redux_Color_Scheme_Functions::set_current_scheme_id( $saved_options['redux-scheme-select'] );
284
-
285
-				// Get the current field ID.
286
-				$raw_data = $saved_options[ $this->field_id ];
287
-
288
-				// Create a new array.
289
-				$save_data = array();
290
-
291
-				// Enum through saved data.
292
-				foreach ( $raw_data as $id => $val ) {
293
-
294
-					if ( 'color_scheme_name' !== $id ) {
295
-						if ( is_array( $val ) ) {
296
-
297
-							if ( ! isset( $val['data'] ) ) {
298
-								continue;
299
-							}
300
-
301
-							$data = json_decode( rawurldecode( $val['data'] ), true );
302
-
303
-							// Sanitize everything.
304
-							$color = $data['color'] ?? '';
305
-							$alpha = $data['alpha'] ?? 1;
306
-
307
-							$id    = $data['id'] ?? $id;
308
-							$title = $data['title'] ?? $id;
309
-
310
-							$grp = $data['group'] ?? '';
311
-
312
-							if ( '' === $color || 'transparent' === $color ) {
313
-								$rgba = $this->output_transparent ? 'transparent' : '';
314
-							} else {
315
-								$rgba = Redux_Helpers::hex2rgba( $color, $alpha );
316
-							}
317
-
318
-							// Create an array of saved data.
319
-							$save_data[] = array(
320
-								'id'    => $id,
321
-								'title' => $title,
322
-								'color' => $color,
323
-								'alpha' => $alpha,
324
-								'group' => $grp,
325
-								'rgba'  => $rgba,
326
-							);
327
-						} else {
328
-							$save_data[] = array(
329
-								'id'    => $id,
330
-								'value' => $val,
331
-								'type'  => 'select',
332
-							);
333
-						}
334
-					}
335
-				}
336
-
337
-				$new_scheme = array();
338
-
339
-				$new_scheme['color_scheme_name'] = Redux_Color_Scheme_Functions::get_current_scheme_id();
340
-
341
-				// Enum through values and assign them to a new array.
342
-				foreach ( $save_data as $val ) {
343
-					if ( isset( $val['id'] ) ) {
344
-						$new_scheme[ $val['id'] ] = $val;
345
-					}
346
-				}
347
-
348
-				// Filter for DB save
349
-				// Doesn't need to save select arrays to a database,
350
-				// just the id => value.
351
-				$database_data = $new_scheme;
352
-
353
-				foreach ( $database_data as $k => $v ) {
354
-					if ( isset( $v['type'] ) ) {
355
-						$val = $v['value'];
356
-
357
-						unset( $database_data[ $k ] );
358
-
359
-						$database_data[ $k ] = $val;
360
-					}
361
-				}
362
-
363
-				$saved_options[ $this->field_id ] = $database_data;
364
-
365
-				// Check if we should save this compared to the old data.
366
-				$save_scheme = false;
367
-
368
-				// Doesn't exist or is empty.
369
-				if ( ! isset( $old_options[ $this->field_id ] ) || ( isset( $old_options[ $this->field_id ] ) && ! empty( $old_options[ $this->field_id ] ) ) ) {
370
-					$save_scheme = true;
371
-				}
372
-
373
-				// Isn't empty and isn't the same as the new array.
374
-				if ( ! empty( $old_options[ $this->field_id ] ) && $saved_options[ $this->field_id ] !== $old_options[ $this->field_id ] ) {
375
-					$save_scheme = true;
376
-				}
377
-
378
-				if ( $save_scheme ) {
379
-					$scheme = Redux_Color_Scheme_Functions::get_current_scheme_id();
380
-					Redux_Color_Scheme_Functions::set_scheme_data( $scheme, $save_data );
381
-				}
382
-			}
383
-
384
-			return $saved_options;
385
-		}
386
-
387
-		/**
388
-		 * Reset data. Restores colour picker to default values
389
-		 *
390
-		 * @since       1.0.0
391
-		 * @access      private
392
-		 * @return      void
393
-		 */
394
-		private function reset_data() {
395
-			Redux_Color_Scheme_Functions::$parent   = $this->parent;
396
-			Redux_Color_Scheme_Functions::$field_id = $this->field_id;
397
-
398
-			// Get default data.
399
-			$data = $this->get_default_data();
400
-
401
-			// Add to (and/or create) JSON scheme file.
402
-			Redux_Color_Scheme_Functions::set_scheme_data( 'Default', $data );
403
-
404
-			// Set default scheme.
405
-			Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
406
-		}
407
-
408
-		/**
409
-		 * Reset All Hook. Todo list when all data is reset
410
-		 *
411
-		 * @return      void
412
-		 * @since       1.0.0
413
-		 * @access      public
414
-		 */
415
-		public function reset_all() {
416
-			if ( ! empty( $this->field_id ) && isset( $this->parent->options_defaults[ $this->field_id ] ) && ! empty( $this->parent->options_defaults[ $this->field_id ] ) ) {
417
-				Redux_Color_Scheme_Functions::$parent   = $this->parent;
418
-				Redux_Color_Scheme_Functions::$field_id = $this->field_id;
419
-
420
-				$this->reset_data();
421
-			}
422
-		}
423
-
424
-		/**
425
-		 * AJAX evaluator. Determine course of action based on AJAX callback
426
-		 *
427
-		 * @since       1.0.0
428
-		 * @access      public
429
-		 * @return      void
430
-		 */
431
-		public function parse_ajax() {
432
-			if ( isset( $_REQUEST['nonce'] ) && isset( $_REQUEST['opt_name'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_REQUEST['nonce'] ) ), 'redux_' . sanitize_text_field( wp_unslash( $_REQUEST['opt_name'] ) ) . '_color_schemes' ) ) {
433
-				$parent = $this->parent;
434
-
435
-				// Do action.
436
-				if ( isset( $_REQUEST['type'] ) ) {
437
-
438
-					// Save scheme.
439
-					if ( 'save' === $_REQUEST['type'] ) {
440
-						$this->save_scheme( $parent );
441
-
442
-						// Delete scheme.
443
-					} elseif ( 'delete' === $_REQUEST['type'] ) {
444
-						$this->delete_scheme( $parent );
445
-
446
-						// Scheme change.
447
-					} elseif ( 'update' === $_REQUEST['type'] ) {
448
-						$this->get_scheme_html( $parent );
449
-
450
-						// Export scheme file.
451
-					} elseif ( 'export' === $_REQUEST['type'] ) {
452
-						$this->download_schemes();
453
-
454
-						// Import scheme file.
455
-					} elseif ( 'import' === $_REQUEST['type'] ) {
456
-						$this->import_schemes();
457
-					}
458
-				}
459
-			} else {
460
-				wp_die( esc_html__( 'Invalid Security Credentials.  Please reload the page and try again.', 'redux-framework' ) );
461
-			}
462
-		}
463
-
464
-		/**
465
-		 * Download Scheme File.
466
-		 *
467
-		 * @since       4.4.18
468
-		 * @access      private
469
-		 * @return      void
470
-		 */
471
-		private function import_schemes() {
472
-			if ( isset( $_REQUEST['content'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
473
-				$content = wp_unslash( $_REQUEST['content'] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
474
-				$content = is_array( $content ) ? array_map( 'stripslashes_deep', $content ) : stripslashes( $content );
475
-				$content = json_decode( $content, true );
476
-
477
-				if ( is_null( $content ) ) {
478
-					$result = array(
479
-						'result' => false,
480
-						'data'   => esc_html__( 'Import unsuccessful! Malformed JSON data detected.', 'redux-framework' ),
481
-					);
482
-
483
-					$result = wp_json_encode( $result );
484
-
485
-					echo $result; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
486
-
487
-					die;
488
-				}
489
-
490
-				if ( isset( $content['Default']['color_scheme_name'] ) ) {
491
-					$content = wp_json_encode( $content );
492
-
493
-					$param_array = array(
494
-						'content'   => $content,
495
-						'overwrite' => true,
496
-						'chmod'     => FS_CHMOD_FILE,
497
-					);
498
-
499
-					$import_file = Redux_Color_Scheme_Functions::$upload_dir . Redux_Color_Scheme_Functions::$parent->args['opt_name'] . '_' . Redux_Color_Scheme_Functions::$field_id . '.json';
500
-
501
-					if ( true === Redux_Core::$filesystem->execute( 'put_contents', $import_file, $param_array ) ) {
502
-						$result = array(
503
-							'result' => true,
504
-							// translators: %s = HTML content.
505
-							'data'   => sprintf( esc_html__( 'Import successful! Click %s to refresh.', 'redux-framework' ), '<strong>' . esc_html__( 'OK', 'redux-framework' ) . '</strong>' ),
506
-						);
507
-					} else {
508
-						$result = array(
509
-							'result' => false,
510
-							'data'   => esc_html__( 'Import unsuccessful! File permission error: Could not write import data to server.', 'redux-framework' ),
511
-						);
512
-					}
513
-				} else {
514
-					$result = array(
515
-						'result' => false,
516
-						'data'   => esc_html__( 'Import unsuccessful! The selected file is not a valid color scheme file.', 'redux-framework' ),
517
-					);
518
-				}
519
-			} else {
520
-				$result = array(
521
-					'result' => false,
522
-					'data'   => esc_html__( 'Import unsuccessful! No data detected in the import file.', 'redux-framework' ),
523
-				);
524
-			}
525
-
526
-			$result = wp_json_encode( $result );
527
-
528
-			echo $result; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
529
-
530
-			die;
531
-		}
532
-
533
-		/**
534
-		 * Download Scheme File.
535
-		 *
536
-		 * @since       1.0.0
537
-		 * @access      private
538
-		 * @return      void
539
-		 */
540
-		private function download_schemes() {
541
-			Redux_Color_Scheme_Functions::$parent   = $this->parent;
542
-			Redux_Color_Scheme_Functions::$field_id = $this->field_id;
543
-
544
-			// Read contents of scheme file.
545
-			$content = Redux_Color_Scheme_Functions::read_scheme_file();
546
-			$content = wp_json_encode( $content );
547
-
548
-			// Set header info.
549
-			header( 'Content-Description: File Transfer' );
550
-			header( 'Content-type: application/txt' );
551
-			header( 'Content-Disposition: attachment; filename="redux_schemes_' . $this->parent->args['opt_name'] . '_' . $this->field_id . '_' . gmdate( 'm-d-Y' ) . '.json"' );
552
-			header( 'Content-Transfer-Encoding: binary' );
553
-			header( 'Expires: 0' );
554
-			header( 'Cache-Control: must-revalidate' );
555
-			header( 'Pragma: public' );
556
-
557
-			// File download.
558
-			echo $content; // phpcs:ignore WordPress.Security.EscapeOutput
559
-
560
-			// 2B ~! 2B
561
-			die;
562
-		}
563
-
564
-		/**
565
-		 * Save Scheme. Saved an individual scheme to JSON scheme file.
566
-		 *
567
-		 * @param ReduxFramework $redux ReduxFramework object.
568
-		 *
569
-		 * @return      void
570
-		 * @since       1.0.0
571
-		 * @access      private
572
-		 */
573
-		private function save_scheme( ReduxFramework $redux ) {
574
-			Redux_Color_Scheme_Functions::$parent   = $redux;
575
-			Redux_Color_Scheme_Functions::$field_id = $this->field_id;
576
-
577
-			// Get the scheme name.
578
-			if ( isset( $_REQUEST['scheme_name'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
579
-				$scheme_name = sanitize_text_field( wp_unslash( $_REQUEST['scheme_name'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
580
-
581
-				// Check for duplicates.
582
-				$names = Redux_Color_Scheme_Functions::get_scheme_names();
583
-				foreach ( $names as $name ) {
584
-					$name     = strtolower( $name );
585
-					$tmp_name = strtolower( $scheme_name );
586
-
587
-					if ( $name === $tmp_name ) {
588
-						echo 'fail';
589
-						die();
590
-					}
591
-				}
592
-
593
-				// Get scheme data.
594
-				if ( isset( $_REQUEST['scheme_data'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
595
-					$scheme_data = wp_unslash( $_REQUEST['scheme_data'] ); // phpcs:ignore WordPress.Security
596
-
597
-					// Get field ID.
598
-					if ( isset( $_REQUEST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
599
-						$scheme_data = rawurldecode( $scheme_data );
600
-						$scheme_data = json_decode( $scheme_data, true );
601
-
602
-						// Save scheme to file.  If successful...
603
-						if ( true === Redux_Color_Scheme_Functions::set_scheme_data( $scheme_name, $scheme_data ) ) {
604
-
605
-							// Update scheme selector.
606
-							echo Redux_Color_Scheme_Functions::get_scheme_select_html( $scheme_name ); // phpcs:ignore WordPress.Security.EscapeOutput
607
-						}
608
-					}
609
-				}
610
-			}
611
-
612
-			die(); // a horrible death!
613
-		}
614
-
615
-		/**
616
-		 * Delete Scheme. Delete individual scheme from JSON scheme file.
617
-		 *
618
-		 * @param ReduxFramework $redux ReduxFramework object.
619
-		 *
620
-		 * @return      void
621
-		 * @since       1.0.0
622
-		 * @access      private
623
-		 */
624
-		private function delete_scheme( ReduxFramework $redux ) {
625
-
626
-			// Get deleted scheme ID.
627
-			if ( isset( $_REQUEST['scheme_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
628
-				$scheme_id = sanitize_text_field( wp_unslash( $_REQUEST['scheme_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
629
-
630
-				// Get field ID.
631
-				if ( isset( $_REQUEST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
632
-					$field_id = sanitize_text_field( wp_unslash( $_REQUEST['field_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
633
-
634
-					// If scheme ID was passed (and why wouldn't it be?? Hmm??).
635
-					if ( $scheme_id ) {
636
-						Redux_Color_Scheme_Functions::$field_id = $field_id;
637
-						Redux_Color_Scheme_Functions::$parent   = $redux;
638
-
639
-						// Get the entire scheme file.
640
-						$schemes = Redux_Color_Scheme_Functions::read_scheme_file();
641
-
642
-						// If we got a good read...
643
-						if ( false !== $schemes ) {
644
-
645
-							// If scheme name exists...
646
-							if ( isset( $schemes[ $scheme_id ] ) ) {
647
-
648
-								// Unset it.
649
-								unset( $schemes[ $scheme_id ] );
650
-
651
-								// Save the scheme data, minus the deleted scheme.  Upon success...
652
-								if ( true === Redux_Color_Scheme_Functions::write_scheme_file( $schemes ) ) {
653
-
654
-									// Set default scheme.
655
-									Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
656
-
657
-									// Update field ID.
658
-									Redux_Color_Scheme_Functions::$field_id = $field_id;
659
-
660
-									// Meh TODO.
661
-									Redux_Color_Scheme_Functions::set_database_data();
662
-
663
-									echo 'success';
664
-								} else {
665
-									echo 'Failed to write JSON file to server.';
666
-								}
667
-							} else {
668
-								echo 'Scheme name does not exist in JSON string.  Aborting.';
669
-							}
670
-						} else {
671
-							echo 'Failed to read JSON scheme file, or file is empty.';
672
-						}
673
-					} else {
674
-						echo 'No scheme ID passed.  Aborting.';
675
-					}
676
-				}
677
-			}
678
-
679
-			die(); // rolled a two.
680
-		}
681
-
682
-		/**
683
-		 * Gets the new scheme based on selection.
684
-		 *
685
-		 * @param ReduxFramework $redux ReduxFramework object.
686
-		 *
687
-		 * @return      void
688
-		 * @since       1.0.0
689
-		 * @access      private
690
-		 */
691
-		private function get_scheme_html( ReduxFramework $redux ) {
692
-			if ( isset( $_POST['scheme_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
693
-
694
-				// Get the selected scheme name.
695
-				$scheme_id = sanitize_text_field( wp_unslash( $_POST['scheme_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
696
-
697
-				if ( isset( $_POST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
698
-
699
-					// Get the field ID.
700
-					$field_id = sanitize_text_field( wp_unslash( $_POST['field_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
701
-
702
-					// Get the field class.
703
-					$field_class = isset( $_POST['field_class'] ) ? sanitize_text_field( wp_unslash( $_POST['field_class'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
704
-
705
-					Redux_Color_Scheme_Functions::$parent = $redux;
706
-
707
-					// Set the updated field ID.
708
-					Redux_Color_Scheme_Functions::$field_id = $field_id;
709
-
710
-					// Set the updated field class.
711
-					Redux_Color_Scheme_Functions::$field_class = $field_class;
712
-
713
-					// Get the color picket layout HTML.
714
-					$html = Redux_Color_Scheme_Functions::get_current_color_scheme_html( $scheme_id );
715
-
716
-					// Print!
717
-					echo $html; // phpcs:ignore WordPress.Security.EscapeOutput
718
-				}
719
-			}
720
-
721
-			die(); // another day.
722
-		}
723
-
724
-
725
-		/**
726
-		 * Retrieves an array of default data for color picker.
727
-		 *
728
-		 * @since       1.0.0
729
-		 * @access      private
730
-		 * @return      array Default values from config.
731
-		 */
732
-		private function get_default_data(): array {
733
-			$def_opts = $this->parent->options_defaults[ $this->field_id ];
734
-
735
-			if ( isset( $def_opts['color_scheme_name'] ) ) {
736
-				return array();
737
-			}
738
-
739
-			$sections = $this->parent->sections;
740
-			$data     = array();
741
-
742
-			foreach ( $sections as $arr ) {
743
-				if ( isset( $arr['fields'] ) ) {
744
-					foreach ( $arr['fields'] as $arr2 ) {
745
-						if ( $arr2['id'] === $this->field_id ) {
746
-
747
-							// Select fields.
748
-							if ( isset( $arr2['select'] ) ) {
749
-								foreach ( $arr2['select'] as $v ) {
750
-									$data[] = array(
751
-										'id'    => $v['id'],
752
-										'value' => $v['default'],
753
-										'type'  => 'select',
754
-									);
755
-								}
756
-							}
757
-						}
758
-					}
759
-				}
760
-			}
761
-
762
-			foreach ( $def_opts as $v ) {
763
-				$title = $v['title'] ?? $v['id'];
764
-				$color = $v['color'] ?? '';
765
-				$alpha = $v['alpha'] ?? 1;
766
-				$grp   = $v['group'] ?? '';
767
-
768
-				if ( '' === $color || 'transparent' === $color ) {
769
-					$rgba = $this->output_transparent ? 'transparent' : '';
770
-				} else {
771
-					$rgba = Redux_Helpers::hex2rgba( $color, $alpha );
772
-				}
773
-
774
-				$data[] = array(
775
-					'id'    => $v['id'],
776
-					'title' => $title,
777
-					'color' => $color,
778
-					'alpha' => $alpha,
779
-					'group' => $grp,
780
-					'rgba'  => $rgba,
781
-				);
782
-			}
783
-
784
-			return $data;
785
-		}
786
-	}
787
-
788
-	class_alias( Redux_Extension_Color_Scheme::class, 'ReduxFramework_Extension_Color_Scheme' );
226
+        /**
227
+         * Reset section defaults.
228
+         *
229
+         * @param array $defaults Default values.
230
+         *
231
+         * @return array
232
+         */
233
+        public function reset_defaults_section( array $defaults = array() ): array {
234
+            if ( Redux_Helpers::is_field_in_use( $this->parent, 'color_scheme' ) ) {
235
+                // Get the current tab/section number.
236
+                if ( isset( $_COOKIE['redux_current_tab'] ) ) {
237
+                    $cur_tab = sanitize_text_field( wp_unslash( $_COOKIE['redux_current_tab'] ) );
238
+
239
+                    // Get the tab/section number field is used on.
240
+                    $tab_num = $this->parent->field_sections['color_scheme'][ $this->field_id ];
241
+
242
+                    // Match...
243
+                    if ( $cur_tab === $tab_num ) {
244
+
245
+                        // Reset data.
246
+                        $this->reset_all();
247
+                    }
248
+                    $defaults[ $this->field_id ] = Redux_Color_Scheme_Functions::data_array_from_scheme( 'Default' );
249
+                }
250
+            }
251
+
252
+            return $defaults;
253
+        }
254
+
255
+        /**
256
+         * Save Changes Hook. What to do when changes are saved
257
+         *
258
+         * @param array $saved_options Saved data.
259
+         * @param array $old_options   Previous data.
260
+         *
261
+         * @return      array
262
+         * @since       1.0.0
263
+         * @access      public
264
+         */
265
+        public function save_hook( array $saved_options = array(), array $old_options = array() ): array {
266
+            if ( ! isset( $saved_options[ $this->field_id ] ) || empty( $saved_options[ $this->field_id ] ) || ( is_array( $saved_options[ $this->field_id ] ) && $old_options === $saved_options ) || ! array_key_exists( $this->field_id, $saved_options ) ) {
267
+                return $saved_options;
268
+            }
269
+
270
+            // We'll use the reset hook instead.
271
+            if ( ! empty( $saved_options['defaults'] ) || ! empty( $saved_options['defaults-section'] ) ) {
272
+                return $saved_options;
273
+            }
274
+
275
+            $first_value = reset( $saved_options[ $this->field_id ] ); // First Element's Value.
276
+
277
+            // Parse the JSON to an array.
278
+            if ( isset( $first_value['data'] ) ) {
279
+
280
+                Redux_Color_Scheme_Functions::$parent   = $this->parent;
281
+                Redux_Color_Scheme_Functions::$field_id = $this->field_id;
282
+
283
+                Redux_Color_Scheme_Functions::set_current_scheme_id( $saved_options['redux-scheme-select'] );
284
+
285
+                // Get the current field ID.
286
+                $raw_data = $saved_options[ $this->field_id ];
287
+
288
+                // Create a new array.
289
+                $save_data = array();
290
+
291
+                // Enum through saved data.
292
+                foreach ( $raw_data as $id => $val ) {
293
+
294
+                    if ( 'color_scheme_name' !== $id ) {
295
+                        if ( is_array( $val ) ) {
296
+
297
+                            if ( ! isset( $val['data'] ) ) {
298
+                                continue;
299
+                            }
300
+
301
+                            $data = json_decode( rawurldecode( $val['data'] ), true );
302
+
303
+                            // Sanitize everything.
304
+                            $color = $data['color'] ?? '';
305
+                            $alpha = $data['alpha'] ?? 1;
306
+
307
+                            $id    = $data['id'] ?? $id;
308
+                            $title = $data['title'] ?? $id;
309
+
310
+                            $grp = $data['group'] ?? '';
311
+
312
+                            if ( '' === $color || 'transparent' === $color ) {
313
+                                $rgba = $this->output_transparent ? 'transparent' : '';
314
+                            } else {
315
+                                $rgba = Redux_Helpers::hex2rgba( $color, $alpha );
316
+                            }
317
+
318
+                            // Create an array of saved data.
319
+                            $save_data[] = array(
320
+                                'id'    => $id,
321
+                                'title' => $title,
322
+                                'color' => $color,
323
+                                'alpha' => $alpha,
324
+                                'group' => $grp,
325
+                                'rgba'  => $rgba,
326
+                            );
327
+                        } else {
328
+                            $save_data[] = array(
329
+                                'id'    => $id,
330
+                                'value' => $val,
331
+                                'type'  => 'select',
332
+                            );
333
+                        }
334
+                    }
335
+                }
336
+
337
+                $new_scheme = array();
338
+
339
+                $new_scheme['color_scheme_name'] = Redux_Color_Scheme_Functions::get_current_scheme_id();
340
+
341
+                // Enum through values and assign them to a new array.
342
+                foreach ( $save_data as $val ) {
343
+                    if ( isset( $val['id'] ) ) {
344
+                        $new_scheme[ $val['id'] ] = $val;
345
+                    }
346
+                }
347
+
348
+                // Filter for DB save
349
+                // Doesn't need to save select arrays to a database,
350
+                // just the id => value.
351
+                $database_data = $new_scheme;
352
+
353
+                foreach ( $database_data as $k => $v ) {
354
+                    if ( isset( $v['type'] ) ) {
355
+                        $val = $v['value'];
356
+
357
+                        unset( $database_data[ $k ] );
358
+
359
+                        $database_data[ $k ] = $val;
360
+                    }
361
+                }
362
+
363
+                $saved_options[ $this->field_id ] = $database_data;
364
+
365
+                // Check if we should save this compared to the old data.
366
+                $save_scheme = false;
367
+
368
+                // Doesn't exist or is empty.
369
+                if ( ! isset( $old_options[ $this->field_id ] ) || ( isset( $old_options[ $this->field_id ] ) && ! empty( $old_options[ $this->field_id ] ) ) ) {
370
+                    $save_scheme = true;
371
+                }
372
+
373
+                // Isn't empty and isn't the same as the new array.
374
+                if ( ! empty( $old_options[ $this->field_id ] ) && $saved_options[ $this->field_id ] !== $old_options[ $this->field_id ] ) {
375
+                    $save_scheme = true;
376
+                }
377
+
378
+                if ( $save_scheme ) {
379
+                    $scheme = Redux_Color_Scheme_Functions::get_current_scheme_id();
380
+                    Redux_Color_Scheme_Functions::set_scheme_data( $scheme, $save_data );
381
+                }
382
+            }
383
+
384
+            return $saved_options;
385
+        }
386
+
387
+        /**
388
+         * Reset data. Restores colour picker to default values
389
+         *
390
+         * @since       1.0.0
391
+         * @access      private
392
+         * @return      void
393
+         */
394
+        private function reset_data() {
395
+            Redux_Color_Scheme_Functions::$parent   = $this->parent;
396
+            Redux_Color_Scheme_Functions::$field_id = $this->field_id;
397
+
398
+            // Get default data.
399
+            $data = $this->get_default_data();
400
+
401
+            // Add to (and/or create) JSON scheme file.
402
+            Redux_Color_Scheme_Functions::set_scheme_data( 'Default', $data );
403
+
404
+            // Set default scheme.
405
+            Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
406
+        }
407
+
408
+        /**
409
+         * Reset All Hook. Todo list when all data is reset
410
+         *
411
+         * @return      void
412
+         * @since       1.0.0
413
+         * @access      public
414
+         */
415
+        public function reset_all() {
416
+            if ( ! empty( $this->field_id ) && isset( $this->parent->options_defaults[ $this->field_id ] ) && ! empty( $this->parent->options_defaults[ $this->field_id ] ) ) {
417
+                Redux_Color_Scheme_Functions::$parent   = $this->parent;
418
+                Redux_Color_Scheme_Functions::$field_id = $this->field_id;
419
+
420
+                $this->reset_data();
421
+            }
422
+        }
423
+
424
+        /**
425
+         * AJAX evaluator. Determine course of action based on AJAX callback
426
+         *
427
+         * @since       1.0.0
428
+         * @access      public
429
+         * @return      void
430
+         */
431
+        public function parse_ajax() {
432
+            if ( isset( $_REQUEST['nonce'] ) && isset( $_REQUEST['opt_name'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_REQUEST['nonce'] ) ), 'redux_' . sanitize_text_field( wp_unslash( $_REQUEST['opt_name'] ) ) . '_color_schemes' ) ) {
433
+                $parent = $this->parent;
434
+
435
+                // Do action.
436
+                if ( isset( $_REQUEST['type'] ) ) {
437
+
438
+                    // Save scheme.
439
+                    if ( 'save' === $_REQUEST['type'] ) {
440
+                        $this->save_scheme( $parent );
441
+
442
+                        // Delete scheme.
443
+                    } elseif ( 'delete' === $_REQUEST['type'] ) {
444
+                        $this->delete_scheme( $parent );
445
+
446
+                        // Scheme change.
447
+                    } elseif ( 'update' === $_REQUEST['type'] ) {
448
+                        $this->get_scheme_html( $parent );
449
+
450
+                        // Export scheme file.
451
+                    } elseif ( 'export' === $_REQUEST['type'] ) {
452
+                        $this->download_schemes();
453
+
454
+                        // Import scheme file.
455
+                    } elseif ( 'import' === $_REQUEST['type'] ) {
456
+                        $this->import_schemes();
457
+                    }
458
+                }
459
+            } else {
460
+                wp_die( esc_html__( 'Invalid Security Credentials.  Please reload the page and try again.', 'redux-framework' ) );
461
+            }
462
+        }
463
+
464
+        /**
465
+         * Download Scheme File.
466
+         *
467
+         * @since       4.4.18
468
+         * @access      private
469
+         * @return      void
470
+         */
471
+        private function import_schemes() {
472
+            if ( isset( $_REQUEST['content'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
473
+                $content = wp_unslash( $_REQUEST['content'] ); // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
474
+                $content = is_array( $content ) ? array_map( 'stripslashes_deep', $content ) : stripslashes( $content );
475
+                $content = json_decode( $content, true );
476
+
477
+                if ( is_null( $content ) ) {
478
+                    $result = array(
479
+                        'result' => false,
480
+                        'data'   => esc_html__( 'Import unsuccessful! Malformed JSON data detected.', 'redux-framework' ),
481
+                    );
482
+
483
+                    $result = wp_json_encode( $result );
484
+
485
+                    echo $result; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
486
+
487
+                    die;
488
+                }
489
+
490
+                if ( isset( $content['Default']['color_scheme_name'] ) ) {
491
+                    $content = wp_json_encode( $content );
492
+
493
+                    $param_array = array(
494
+                        'content'   => $content,
495
+                        'overwrite' => true,
496
+                        'chmod'     => FS_CHMOD_FILE,
497
+                    );
498
+
499
+                    $import_file = Redux_Color_Scheme_Functions::$upload_dir . Redux_Color_Scheme_Functions::$parent->args['opt_name'] . '_' . Redux_Color_Scheme_Functions::$field_id . '.json';
500
+
501
+                    if ( true === Redux_Core::$filesystem->execute( 'put_contents', $import_file, $param_array ) ) {
502
+                        $result = array(
503
+                            'result' => true,
504
+                            // translators: %s = HTML content.
505
+                            'data'   => sprintf( esc_html__( 'Import successful! Click %s to refresh.', 'redux-framework' ), '<strong>' . esc_html__( 'OK', 'redux-framework' ) . '</strong>' ),
506
+                        );
507
+                    } else {
508
+                        $result = array(
509
+                            'result' => false,
510
+                            'data'   => esc_html__( 'Import unsuccessful! File permission error: Could not write import data to server.', 'redux-framework' ),
511
+                        );
512
+                    }
513
+                } else {
514
+                    $result = array(
515
+                        'result' => false,
516
+                        'data'   => esc_html__( 'Import unsuccessful! The selected file is not a valid color scheme file.', 'redux-framework' ),
517
+                    );
518
+                }
519
+            } else {
520
+                $result = array(
521
+                    'result' => false,
522
+                    'data'   => esc_html__( 'Import unsuccessful! No data detected in the import file.', 'redux-framework' ),
523
+                );
524
+            }
525
+
526
+            $result = wp_json_encode( $result );
527
+
528
+            echo $result; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
529
+
530
+            die;
531
+        }
532
+
533
+        /**
534
+         * Download Scheme File.
535
+         *
536
+         * @since       1.0.0
537
+         * @access      private
538
+         * @return      void
539
+         */
540
+        private function download_schemes() {
541
+            Redux_Color_Scheme_Functions::$parent   = $this->parent;
542
+            Redux_Color_Scheme_Functions::$field_id = $this->field_id;
543
+
544
+            // Read contents of scheme file.
545
+            $content = Redux_Color_Scheme_Functions::read_scheme_file();
546
+            $content = wp_json_encode( $content );
547
+
548
+            // Set header info.
549
+            header( 'Content-Description: File Transfer' );
550
+            header( 'Content-type: application/txt' );
551
+            header( 'Content-Disposition: attachment; filename="redux_schemes_' . $this->parent->args['opt_name'] . '_' . $this->field_id . '_' . gmdate( 'm-d-Y' ) . '.json"' );
552
+            header( 'Content-Transfer-Encoding: binary' );
553
+            header( 'Expires: 0' );
554
+            header( 'Cache-Control: must-revalidate' );
555
+            header( 'Pragma: public' );
556
+
557
+            // File download.
558
+            echo $content; // phpcs:ignore WordPress.Security.EscapeOutput
559
+
560
+            // 2B ~! 2B
561
+            die;
562
+        }
563
+
564
+        /**
565
+         * Save Scheme. Saved an individual scheme to JSON scheme file.
566
+         *
567
+         * @param ReduxFramework $redux ReduxFramework object.
568
+         *
569
+         * @return      void
570
+         * @since       1.0.0
571
+         * @access      private
572
+         */
573
+        private function save_scheme( ReduxFramework $redux ) {
574
+            Redux_Color_Scheme_Functions::$parent   = $redux;
575
+            Redux_Color_Scheme_Functions::$field_id = $this->field_id;
576
+
577
+            // Get the scheme name.
578
+            if ( isset( $_REQUEST['scheme_name'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
579
+                $scheme_name = sanitize_text_field( wp_unslash( $_REQUEST['scheme_name'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
580
+
581
+                // Check for duplicates.
582
+                $names = Redux_Color_Scheme_Functions::get_scheme_names();
583
+                foreach ( $names as $name ) {
584
+                    $name     = strtolower( $name );
585
+                    $tmp_name = strtolower( $scheme_name );
586
+
587
+                    if ( $name === $tmp_name ) {
588
+                        echo 'fail';
589
+                        die();
590
+                    }
591
+                }
592
+
593
+                // Get scheme data.
594
+                if ( isset( $_REQUEST['scheme_data'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
595
+                    $scheme_data = wp_unslash( $_REQUEST['scheme_data'] ); // phpcs:ignore WordPress.Security
596
+
597
+                    // Get field ID.
598
+                    if ( isset( $_REQUEST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
599
+                        $scheme_data = rawurldecode( $scheme_data );
600
+                        $scheme_data = json_decode( $scheme_data, true );
601
+
602
+                        // Save scheme to file.  If successful...
603
+                        if ( true === Redux_Color_Scheme_Functions::set_scheme_data( $scheme_name, $scheme_data ) ) {
604
+
605
+                            // Update scheme selector.
606
+                            echo Redux_Color_Scheme_Functions::get_scheme_select_html( $scheme_name ); // phpcs:ignore WordPress.Security.EscapeOutput
607
+                        }
608
+                    }
609
+                }
610
+            }
611
+
612
+            die(); // a horrible death!
613
+        }
614
+
615
+        /**
616
+         * Delete Scheme. Delete individual scheme from JSON scheme file.
617
+         *
618
+         * @param ReduxFramework $redux ReduxFramework object.
619
+         *
620
+         * @return      void
621
+         * @since       1.0.0
622
+         * @access      private
623
+         */
624
+        private function delete_scheme( ReduxFramework $redux ) {
625
+
626
+            // Get deleted scheme ID.
627
+            if ( isset( $_REQUEST['scheme_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
628
+                $scheme_id = sanitize_text_field( wp_unslash( $_REQUEST['scheme_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
629
+
630
+                // Get field ID.
631
+                if ( isset( $_REQUEST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
632
+                    $field_id = sanitize_text_field( wp_unslash( $_REQUEST['field_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
633
+
634
+                    // If scheme ID was passed (and why wouldn't it be?? Hmm??).
635
+                    if ( $scheme_id ) {
636
+                        Redux_Color_Scheme_Functions::$field_id = $field_id;
637
+                        Redux_Color_Scheme_Functions::$parent   = $redux;
638
+
639
+                        // Get the entire scheme file.
640
+                        $schemes = Redux_Color_Scheme_Functions::read_scheme_file();
641
+
642
+                        // If we got a good read...
643
+                        if ( false !== $schemes ) {
644
+
645
+                            // If scheme name exists...
646
+                            if ( isset( $schemes[ $scheme_id ] ) ) {
647
+
648
+                                // Unset it.
649
+                                unset( $schemes[ $scheme_id ] );
650
+
651
+                                // Save the scheme data, minus the deleted scheme.  Upon success...
652
+                                if ( true === Redux_Color_Scheme_Functions::write_scheme_file( $schemes ) ) {
653
+
654
+                                    // Set default scheme.
655
+                                    Redux_Color_Scheme_Functions::set_current_scheme_id( 'Default' );
656
+
657
+                                    // Update field ID.
658
+                                    Redux_Color_Scheme_Functions::$field_id = $field_id;
659
+
660
+                                    // Meh TODO.
661
+                                    Redux_Color_Scheme_Functions::set_database_data();
662
+
663
+                                    echo 'success';
664
+                                } else {
665
+                                    echo 'Failed to write JSON file to server.';
666
+                                }
667
+                            } else {
668
+                                echo 'Scheme name does not exist in JSON string.  Aborting.';
669
+                            }
670
+                        } else {
671
+                            echo 'Failed to read JSON scheme file, or file is empty.';
672
+                        }
673
+                    } else {
674
+                        echo 'No scheme ID passed.  Aborting.';
675
+                    }
676
+                }
677
+            }
678
+
679
+            die(); // rolled a two.
680
+        }
681
+
682
+        /**
683
+         * Gets the new scheme based on selection.
684
+         *
685
+         * @param ReduxFramework $redux ReduxFramework object.
686
+         *
687
+         * @return      void
688
+         * @since       1.0.0
689
+         * @access      private
690
+         */
691
+        private function get_scheme_html( ReduxFramework $redux ) {
692
+            if ( isset( $_POST['scheme_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
693
+
694
+                // Get the selected scheme name.
695
+                $scheme_id = sanitize_text_field( wp_unslash( $_POST['scheme_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
696
+
697
+                if ( isset( $_POST['field_id'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
698
+
699
+                    // Get the field ID.
700
+                    $field_id = sanitize_text_field( wp_unslash( $_POST['field_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
701
+
702
+                    // Get the field class.
703
+                    $field_class = isset( $_POST['field_class'] ) ? sanitize_text_field( wp_unslash( $_POST['field_class'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
704
+
705
+                    Redux_Color_Scheme_Functions::$parent = $redux;
706
+
707
+                    // Set the updated field ID.
708
+                    Redux_Color_Scheme_Functions::$field_id = $field_id;
709
+
710
+                    // Set the updated field class.
711
+                    Redux_Color_Scheme_Functions::$field_class = $field_class;
712
+
713
+                    // Get the color picket layout HTML.
714
+                    $html = Redux_Color_Scheme_Functions::get_current_color_scheme_html( $scheme_id );
715
+
716
+                    // Print!
717
+                    echo $html; // phpcs:ignore WordPress.Security.EscapeOutput
718
+                }
719
+            }
720
+
721
+            die(); // another day.
722
+        }
723
+
724
+
725
+        /**
726
+         * Retrieves an array of default data for color picker.
727
+         *
728
+         * @since       1.0.0
729
+         * @access      private
730
+         * @return      array Default values from config.
731
+         */
732
+        private function get_default_data(): array {
733
+            $def_opts = $this->parent->options_defaults[ $this->field_id ];
734
+
735
+            if ( isset( $def_opts['color_scheme_name'] ) ) {
736
+                return array();
737
+            }
738
+
739
+            $sections = $this->parent->sections;
740
+            $data     = array();
741
+
742
+            foreach ( $sections as $arr ) {
743
+                if ( isset( $arr['fields'] ) ) {
744
+                    foreach ( $arr['fields'] as $arr2 ) {
745
+                        if ( $arr2['id'] === $this->field_id ) {
746
+
747
+                            // Select fields.
748
+                            if ( isset( $arr2['select'] ) ) {
749
+                                foreach ( $arr2['select'] as $v ) {
750
+                                    $data[] = array(
751
+                                        'id'    => $v['id'],
752
+                                        'value' => $v['default'],
753
+                                        'type'  => 'select',
754
+                                    );
755
+                                }
756
+                            }
757
+                        }
758
+                    }
759
+                }
760
+            }
761
+
762
+            foreach ( $def_opts as $v ) {
763
+                $title = $v['title'] ?? $v['id'];
764
+                $color = $v['color'] ?? '';
765
+                $alpha = $v['alpha'] ?? 1;
766
+                $grp   = $v['group'] ?? '';
767
+
768
+                if ( '' === $color || 'transparent' === $color ) {
769
+                    $rgba = $this->output_transparent ? 'transparent' : '';
770
+                } else {
771
+                    $rgba = Redux_Helpers::hex2rgba( $color, $alpha );
772
+                }
773
+
774
+                $data[] = array(
775
+                    'id'    => $v['id'],
776
+                    'title' => $title,
777
+                    'color' => $color,
778
+                    'alpha' => $alpha,
779
+                    'group' => $grp,
780
+                    'rgba'  => $rgba,
781
+                );
782
+            }
783
+
784
+            return $data;
785
+        }
786
+    }
787
+
788
+    class_alias( Redux_Extension_Color_Scheme::class, 'ReduxFramework_Extension_Color_Scheme' );
789 789
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/taxonomy/class-redux-extension-taxonomy.php 2 patches
Spacing   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -271,8 +271,8 @@  discard block
 block discarded – undo
271 271
 					if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
272 272
 						$run_hooks = true;
273 273
 
274
-						$this->meta[ $this->tag_id ] = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $this->tag_id ) );
275
-						$this->parent->options       = array_merge( $this->parent->options, $this->meta[ $this->tag_id ] );
274
+						$this->meta[$this->tag_id] = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $this->tag_id ) );
275
+						$this->parent->options       = array_merge( $this->parent->options, $this->meta[$this->tag_id] );
276 276
 
277 277
 						foreach ( $term['sections'] as $sk => $section ) {
278 278
 							if ( ! empty( $section['fields'] ) ) {
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
 									if ( ! isset( $field['class'] ) ) {
281 281
 										$field['class'] = '';
282 282
 
283
-										$this->terms[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
283
+										$this->terms[$bk]['sections'][$sk]['fields'][$fk] = $field;
284 284
 									}
285 285
 
286 286
 									$this->parent->required_class->check_dependencies( $field );
@@ -291,37 +291,37 @@  discard block
 block discarded – undo
291 291
 										}
292 292
 
293 293
 										if ( isset( $field['default'] ) ) {
294
-											$this->options_defaults[ $field['id'] ] = $field['default'];
294
+											$this->options_defaults[$field['id']] = $field['default'];
295 295
 										} else {
296
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
296
+											$this->options_defaults[$field['id']] = $this->field_default( $field );
297 297
 										}
298 298
 
299 299
 										foreach ( $term['taxonomy_types'] as $type ) {
300
-											$this->taxonomy_type_fields[ $type ][ $field['id'] ] = 1;
300
+											$this->taxonomy_type_fields[$type][$field['id']] = 1;
301 301
 										}
302 302
 
303 303
 										if ( ! empty( $field['output'] ) ) {
304
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
304
+											$this->output[$field['id']] = isset( $this->output[$field['id']] ) ? array_merge( $field['output'], $this->output[$field['id']] ) : $field['output'];
305 305
 										}
306 306
 
307 307
 										// Detect what field types are being used.
308
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
309
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
308
+										if ( ! isset( $this->parent->fields[$field['type']][$field['id']] ) ) {
309
+											$this->parent->fields[$field['type']][$field['id']] = 1;
310 310
 										} else {
311
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
311
+											$this->parent->fields[$field['type']] = array( $field['id'] => 1 );
312 312
 										}
313 313
 
314
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
315
-											$this->to_replace[ $field['id'] ] = $field;
314
+										if ( isset( $this->options_defaults[$field['id']] ) ) {
315
+											$this->to_replace[$field['id']] = $field;
316 316
 										}
317 317
 									}
318 318
 
319
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
320
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
319
+									if ( ! isset( $this->parent->options[$field['id']] ) ) {
320
+										$this->parent->sections[( count( $this->parent->sections ) - 1 )]['fields'][] = $field;
321 321
 									}
322 322
 
323
-									if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
324
-										$this->meta[ $this->tag_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
323
+									if ( ! isset( $this->meta[$this->tag_id][$field['id']] ) ) {
324
+										$this->meta[$this->tag_id][$field['id']] = $this->options_defaults[$field['id']];
325 325
 									}
326 326
 
327 327
 									// Only override if it exists, and it's not the default.
@@ -369,8 +369,8 @@  discard block
 block discarded – undo
369 369
 		 * @return mixed
370 370
 		 */
371 371
 		public function replace_field( array $field ) {
372
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
373
-				$field = $this->to_replace[ $field['id'] ];
372
+			if ( isset( $this->to_replace[$field['id']] ) ) {
373
+				$field = $this->to_replace[$field['id']];
374 374
 			}
375 375
 
376 376
 			return $field;
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 		 * @return array
385 385
 		 */
386 386
 		public function override_can_output_css( array $field ): array {
387
-			if ( isset( $this->output[ $field['id'] ] ) ) {
387
+			if ( isset( $this->output[$field['id']] ) ) {
388 388
 				$field['force_output'] = true;
389 389
 			}
390 390
 
@@ -399,8 +399,8 @@  discard block
 block discarded – undo
399 399
 		 * @return array
400 400
 		 */
401 401
 		public function output_css( array $field ): array {
402
-			if ( isset( $this->output[ $field['id'] ] ) ) {
403
-				$field['output'] = $this->output[ $field['id'] ];
402
+			if ( isset( $this->output[$field['id']] ) ) {
403
+				$field['output'] = $this->output[$field['id']];
404 404
 			}
405 405
 
406 406
 			return $field;
@@ -421,13 +421,13 @@  discard block
 block discarded – undo
421 421
 			$data = wp_parse_args( $meta, $this->options_defaults );
422 422
 
423 423
 			foreach ( $data as $key => $value ) {
424
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
425
-					$data[ $key ] = $meta[ $key ];
424
+				if ( isset( $meta[$key] ) && '' !== $meta[$key] ) {
425
+					$data[$key] = $meta[$key];
426 426
 					continue;
427 427
 				}
428 428
 
429
-				if ( isset( $options[ $key ] ) ) {
430
-					$data[ $key ] = $options[ $key ];
429
+				if ( isset( $options[$key] ) ) {
430
+					$data[$key] = $options[$key];
431 431
 				}
432 432
 			}
433 433
 
@@ -460,7 +460,7 @@  discard block
 block discarded – undo
460 460
 				if ( ! empty( $term['taxonomy_types'] ) ) {
461 461
 					if ( ! is_array( $term['taxonomy_types'] ) ) {
462 462
 						$term['taxonomy_types']                = array( $term['taxonomy_types'] );
463
-						$this->terms[ $key ]['taxonomy_types'] = $term['taxonomy_types'];
463
+						$this->terms[$key]['taxonomy_types'] = $term['taxonomy_types'];
464 464
 					}
465 465
 				}
466 466
 			}
@@ -532,7 +532,7 @@  discard block
 block discarded – undo
532 532
 							} else {
533 533
 								$section['id'] = sanitize_title( $section['title'], $sk );
534 534
 							}
535
-							$this->terms[ $key ]['sections'][ $sk ] = $section;
535
+							$this->terms[$key]['sections'][$sk] = $section;
536 536
 						}
537 537
 						if ( isset( $section['fields'] ) ) {
538 538
 							foreach ( $section['fields'] as $k => $field ) {
@@ -541,14 +541,14 @@  discard block
 block discarded – undo
541 541
 								}
542 542
 
543 543
 								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
544
-									$this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
545
-									unset( $this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
544
+									$this->terms[$key]['sections'][$sk]['fields'][$k]['args'] = $field['options'];
545
+									unset( $this->terms[$key]['sections'][$sk]['fields'][$k]['options'] );
546 546
 								}
547 547
 
548 548
 								if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
549 549
 									$field['class']  = $field['class'] ?? '';
550 550
 									$field['class'] .= 'redux-section-indent-start';
551
-									$this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
551
+									$this->terms[$key]['sections'][$sk]['fields'][$k] = $field;
552 552
 								}
553 553
 
554 554
 								if ( ! isset( $this->parent->options_defaults_class ) ) {
@@ -570,8 +570,8 @@  discard block
 block discarded – undo
570 570
 				}
571 571
 			}
572 572
 
573
-			if ( empty( $this->meta[ $this->tag_id ] ) ) {
574
-				$this->meta[ $this->tag_id ] = $this->get_meta( $this->tag_id );
573
+			if ( empty( $this->meta[$this->tag_id] ) ) {
574
+				$this->meta[$this->tag_id] = $this->get_meta( $this->tag_id );
575 575
 			}
576 576
 		}
577 577
 
@@ -662,8 +662,8 @@  discard block
 block discarded – undo
662 662
 				$this->parent->options_class->get();
663 663
 			}
664 664
 
665
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
666
-				return $this->parent->options[ $field_id['id'] ];
665
+			if ( isset( $this->parent->options[$field_id['id']] ) && isset( $this->parent->options_defaults[$field_id['id']] ) && $this->parent->options[$field_id['id']] !== $this->parent->options_defaults[$field_id['id']] ) {
666
+				return $this->parent->options[$field_id['id']];
667 667
 			} else {
668 668
 				if ( empty( $this->options_defaults ) ) {
669 669
 					$this->default_values(); // fill cache.
@@ -671,11 +671,11 @@  discard block
 block discarded – undo
671 671
 
672 672
 				$data = '';
673 673
 				if ( ! empty( $this->options_defaults ) ) {
674
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
674
+					$data = $this->options_defaults[$field_id['id']] ?? '';
675 675
 				}
676 676
 
677
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
678
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
677
+				if ( empty( $data ) && isset( $this->parent->options_defaults[$field_id['id']] ) ) {
678
+					$data = $this->parent->options_defaults[$field_id['id']] ?? '';
679 679
 				}
680 680
 
681 681
 				return $data;
@@ -690,8 +690,8 @@  discard block
 block discarded – undo
690 690
 		 * @return array
691 691
 		 */
692 692
 		private function get_meta( string $id ): array {
693
-			if ( ! isset( $this->meta[ $id ] ) ) {
694
-				$this->meta[ $id ] = array();
693
+			if ( ! isset( $this->meta[$id] ) ) {
694
+				$this->meta[$id] = array();
695 695
 				$o_data            = get_post_meta( $id );
696 696
 
697 697
 				// phpcs:ignore WordPress.NamingConventions.ValidHookName
@@ -700,30 +700,30 @@  discard block
 block discarded – undo
700 700
 				if ( ! empty( $o_data ) ) {
701 701
 					foreach ( $o_data as $key => $value ) {
702 702
 						if ( count( $value ) === 1 ) {
703
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
703
+							$this->meta[$id][$key] = maybe_unserialize( $value[0] );
704 704
 						} else {
705 705
 							$new_value = array_map( 'maybe_unserialize', $value );
706 706
 
707
-							$this->meta[ $id ][ $key ] = $new_value[0];
707
+							$this->meta[$id][$key] = $new_value[0];
708 708
 						}
709 709
 					}
710 710
 				}
711 711
 
712
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
713
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
712
+				if ( isset( $this->meta[$id][$this->parent->args['opt_name']] ) ) {
713
+					$data = maybe_unserialize( $this->meta[$id][$this->parent->args['opt_name']] );
714 714
 
715 715
 					foreach ( $data as $key => $value ) {
716
-						$this->meta[ $id ][ $key ] = $value;
716
+						$this->meta[$id][$key] = $value;
717 717
 						update_post_meta( $id, $key, $value );
718 718
 					}
719 719
 
720
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
720
+					unset( $this->meta[$id][$this->parent->args['opt_name']] );
721 721
 
722 722
 					delete_post_meta( $id, $this->parent->args['opt_name'] );
723 723
 				}
724 724
 			}
725 725
 
726
-			return $this->meta[ $id ];
726
+			return $this->meta[$id];
727 727
 		}
728 728
 
729 729
 		/**
@@ -739,29 +739,29 @@  discard block
 block discarded – undo
739 739
 
740 740
 			// Override these values if they differ from the admin panel defaults.
741 741
 			if ( isset( $the_post->taxonomy_type ) && in_array( $the_post->taxonomy_type, $this->taxonomy_types, true ) ) {
742
-				if ( isset( $this->taxonomy_type_values[ $the_post->taxonomy_type ] ) ) {
743
-					$meta = $this->taxonomy_type_fields[ $the_post->taxonomy_type ];
742
+				if ( isset( $this->taxonomy_type_values[$the_post->taxonomy_type] ) ) {
743
+					$meta = $this->taxonomy_type_fields[$the_post->taxonomy_type];
744 744
 				} else {
745 745
 					$defaults = array();
746
-					if ( ! empty( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] ) ) {
747
-						foreach ( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] as $key => $null ) {
748
-							if ( isset( $this->options_defaults[ $key ] ) ) {
749
-								$defaults[ $key ] = $this->options_defaults[ $key ];
746
+					if ( ! empty( $this->taxonomy_type_fields[$the_post->taxonomy_type] ) ) {
747
+						foreach ( $this->taxonomy_type_fields[$the_post->taxonomy_type] as $key => $null ) {
748
+							if ( isset( $this->options_defaults[$key] ) ) {
749
+								$defaults[$key] = $this->options_defaults[$key];
750 750
 							}
751 751
 						}
752 752
 					}
753 753
 
754 754
 					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
755 755
 
756
-					$this->taxonomy_type_fields[ $the_post->taxonomy_type ] = $meta;
756
+					$this->taxonomy_type_fields[$the_post->taxonomy_type] = $meta;
757 757
 				}
758 758
 
759 759
 				if ( ! empty( $meta_key ) ) {
760
-					if ( ! isset( $meta[ $meta_key ] ) ) {
761
-						$meta[ $meta_key ] = $def_val;
760
+					if ( ! isset( $meta[$meta_key] ) ) {
761
+						$meta[$meta_key] = $def_val;
762 762
 					}
763 763
 
764
-					return $meta[ $meta_key ];
764
+					return $meta[$meta_key];
765 765
 				} else {
766 766
 					return $meta;
767 767
 				}
@@ -960,11 +960,11 @@  discard block
 block discarded – undo
960 960
 									$field['class'] .= 'redux-section-indent-start';
961 961
 								}
962 962
 
963
-								if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
964
-									$this->meta[ $this->tag_id ][ $field['id'] ] = '';
963
+								if ( ! isset( $this->meta[$this->tag_id][$field['id']] ) ) {
964
+									$this->meta[$this->tag_id][$field['id']] = '';
965 965
 								}
966 966
 
967
-								$this->parent->render_class->field_input( $field, $this->meta[ $this->tag_id ][ $field['id'] ], true );
967
+								$this->parent->render_class->field_input( $field, $this->meta[$this->tag_id][$field['id']], true );
968 968
 								echo '</td></tr>';
969 969
 							}
970 970
 							echo '</tbody></table>';
@@ -992,7 +992,7 @@  discard block
 block discarded – undo
992 992
 		public function meta_terms_save( $tag_id ): bool {
993 993
 
994 994
 			// Check if our nonce is set.
995
-			if ( ! isset( $_POST['redux_taxonomy_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
995
+			if ( ! isset( $_POST['redux_taxonomy_meta_nonce'] ) || ! isset( $_POST[$this->parent->args['opt_name']] ) ) {
996 996
 				return false;
997 997
 			}
998 998
 
@@ -1009,16 +1009,16 @@  discard block
 block discarded – undo
1009 1009
 			$to_delete  = array();
1010 1010
 			$dont_save  = true;
1011 1011
 
1012
-			$field_args = Redux_Taxonomy::$fields[ $this->parent->args['opt_name'] ];
1012
+			$field_args = Redux_Taxonomy::$fields[$this->parent->args['opt_name']];
1013 1013
 
1014
-			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1014
+			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[$this->parent->args['opt_name']] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1015 1015
 
1016 1016
 				// Do not save anything the user doesn't have permissions for.
1017
-				if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1018
-					foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1017
+				if ( ! empty( $field_args[$key]['permissions'] ) ) {
1018
+					foreach ( ( array ) $field_args[$key]['permissions'] as $pv ) {
1019 1019
 
1020 1020
 						// Do not save anything the user doesn't have permissions for.
1021
-						if ( isset( $field_args[ $key ] ) ) {
1021
+						if ( isset( $field_args[$key] ) ) {
1022 1022
 							if ( user_can( get_current_user_id(), $pv ) ) {
1023 1023
 								break;
1024 1024
 							}
@@ -1030,7 +1030,7 @@  discard block
 block discarded – undo
1030 1030
 				if ( is_array( $value ) ) {
1031 1031
 					foreach ( $value as $k => $v ) {
1032 1032
 						if ( ! is_array( $v ) ) {
1033
-							$value[ $k ] = stripslashes( $v );
1033
+							$value[$k] = stripslashes( $v );
1034 1034
 						}
1035 1035
 					}
1036 1036
 				}
@@ -1038,19 +1038,19 @@  discard block
 block discarded – undo
1038 1038
 				$save = true;
1039 1039
 
1040 1040
 				// parent_options.
1041
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1041
+				if ( ! $dont_save && isset( $this->options_defaults[$key] ) && $value === $this->options_defaults[$key] ) {
1042 1042
 					$save = false;
1043 1043
 				}
1044 1044
 
1045
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1045
+				if ( $save && isset( $this->parent_options[$key] ) && $this->parent_options[$key] !== $value ) {
1046 1046
 					$save = false;
1047 1047
 				}
1048 1048
 
1049 1049
 				if ( $save ) {
1050
-					$to_save[ $key ]    = $value;
1051
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1050
+					$to_save[$key]    = $value;
1051
+					$to_compare[$key] = $this->parent->options[$key] ?? '';
1052 1052
 				} else {
1053
-					$to_delete[ $key ] = $value;
1053
+					$to_delete[$key] = $value;
1054 1054
 				}
1055 1055
 			}
1056 1056
 
@@ -1061,11 +1061,11 @@  discard block
 block discarded – undo
1061 1061
 
1062 1062
 			// Validate fields (if needed).
1063 1063
 			foreach ( $to_save as $key => $value ) {
1064
-				if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1065
-					if ( isset( $meta[ $key ] ) && $validate[ $key ] === $meta[ $key ] ) {
1066
-						unset( $to_save[ $key ] );
1064
+				if ( isset( $validate[$key] ) && $validate[$key] !== $value ) {
1065
+					if ( isset( $meta[$key] ) && $validate[$key] === $meta[$key] ) {
1066
+						unset( $to_save[$key] );
1067 1067
 					} else {
1068
-						$to_save[ $key ] = $validate[ $key ];
1068
+						$to_save[$key] = $validate[$key];
1069 1069
 					}
1070 1070
 				}
1071 1071
 			}
@@ -1091,27 +1091,27 @@  discard block
 block discarded – undo
1091 1091
 
1092 1092
 			$post_tax = isset( $_POST['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ) : '';
1093 1093
 
1094
-			$check = $this->taxonomy_type_fields[ $post_tax ] ?? array();
1094
+			$check = $this->taxonomy_type_fields[$post_tax] ?? array();
1095 1095
 
1096 1096
 			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1097 1097
 			$to_save = apply_filters( 'redux/taxonomy/save', $to_save, $to_compare, $this->sections );
1098 1098
 
1099 1099
 			foreach ( $to_save as $key => $value ) {
1100
-				$prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1100
+				$prev_value = $this->meta[$tag_id][$key] ?? '';
1101 1101
 
1102
-				if ( isset( $check[ $key ] ) ) {
1103
-					unset( $check[ $key ] );
1102
+				if ( isset( $check[$key] ) ) {
1103
+					unset( $check[$key] );
1104 1104
 				}
1105 1105
 
1106 1106
 				update_term_meta( $tag_id, $key, $value, $prev_value );
1107 1107
 			}
1108 1108
 
1109 1109
 			foreach ( $to_delete as $key => $value ) {
1110
-				if ( isset( $check[ $key ] ) ) {
1111
-					unset( $check[ $key ] );
1110
+				if ( isset( $check[$key] ) ) {
1111
+					unset( $check[$key] );
1112 1112
 				}
1113 1113
 
1114
-				$prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1114
+				$prev_value = $this->meta[$tag_id][$key] ?? '';
1115 1115
 				delete_term_meta( $tag_id, $key, $prev_value );
1116 1116
 			}
1117 1117
 
Please login to merge, or discard this patch.
Indentation   +1101 added lines, -1101 removed lines patch added patch discarded remove patch
@@ -14,834 +14,834 @@  discard block
 block discarded – undo
14 14
 // Don't duplicate me!
15 15
 if ( ! class_exists( 'Redux_Extension_Taxonomy' ) ) {
16 16
 
17
-	/**
18
-	 * Main ReduxFramework customizer extension class
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Extension_Taxonomy extends Redux_Extension_Abstract {
23
-
24
-		/**
25
-		 * Extension version.
26
-		 *
27
-		 * @var string
28
-		 */
29
-		public static $version = '4.4.19';
30
-
31
-		/**
32
-		 * Extension friendly name.
33
-		 *
34
-		 * @var string
35
-		 */
36
-		public string $extension_name = 'Taxonomy';
37
-
38
-		/**
39
-		 * Terms array.
40
-		 *
41
-		 * @var array
42
-		 */
43
-		public array $terms = array();
44
-
45
-		/**
46
-		 * Taxonomy types array.
47
-		 *
48
-		 * @var array
49
-		 */
50
-		public array $taxonomy_types = array();
51
-
52
-		/**
53
-		 * Taxonomy type.
54
-		 *
55
-		 * @var string
56
-		 */
57
-		public string $taxonomy_type = '';
58
-
59
-		/**
60
-		 * Sections array.
61
-		 *
62
-		 * @var array
63
-		 */
64
-		public array $sections = array();
65
-
66
-		/**
67
-		 * Original args array.
68
-		 *
69
-		 * @var array
70
-		 */
71
-		public array $orig_args = array();
72
-
73
-		/**
74
-		 * Output array.
75
-		 *
76
-		 * @var array
77
-		 */
78
-		public array $output = array();
79
-
80
-		/**
81
-		 * Parent options.
82
-		 *
83
-		 * @var array
84
-		 */
85
-		public array $parent_options = array();
86
-
87
-		/**
88
-		 * Parent defaults.
89
-		 *
90
-		 * @var array
91
-		 */
92
-		public array $parent_defaults = array();
93
-
94
-		/**
95
-		 * Taxonomy field types array.
96
-		 *
97
-		 * @var array
98
-		 */
99
-		public array $taxonomy_type_fields = array();
100
-
101
-		/**
102
-		 * Option defaults.
103
-		 *
104
-		 * @var array
105
-		 */
106
-		public array $options_defaults = array();
107
-
108
-		/**
109
-		 * To replace array.
110
-		 *
111
-		 * @var array
112
-		 */
113
-		public array $to_replace = array();
114
-
115
-		/**
116
-		 * Meta array.
117
-		 *
118
-		 * @var array
119
-		 */
120
-		public array $meta = array();
121
-
122
-		/**
123
-		 * Tag ID.
124
-		 *
125
-		 * @var int
126
-		 */
127
-		public int $tag_id = 0;
128
-
129
-		/**
130
-		 * Accepted WordPress screens.
131
-		 *
132
-		 * @var array
133
-		 */
134
-		private array $pagenows;
135
-
136
-		/**
137
-		 * Notices array.
138
-		 *
139
-		 * @var array
140
-		 */
141
-		public array $notices;
142
-
143
-		/**
144
-		 * Redux_Extension_Taxonomy constructor.
145
-		 *
146
-		 * @param object $redux ReduxFramework object.
147
-		 */
148
-		public function __construct( $redux ) {
149
-			global $pagenow;
150
-
151
-			parent::__construct( $redux, __FILE__ );
152
-
153
-			$this->parent = $redux;
154
-
155
-			$this->add_field( 'taxonomy' );
156
-			$this->parent->extensions['taxonomy'] = $this;
157
-
158
-			$this->pagenows = array( 'edit-tags.php', 'term.php' );
159
-
160
-			include_once __DIR__ . '/redux-taxonomy-helpers.php';
161
-
162
-			add_action( 'admin_notices', array( $this, 'meta_terms_show_errors' ), 0 );
163
-			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
164
-
165
-			if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
166
-				$this->init();
167
-
168
-				// phpcs:ignore WordPress.Security.NonceVerification
169
-				if ( isset( $_POST['taxonomy'] ) ) {
170
-
171
-					// phpcs:ignore WordPress.Security.NonceVerification
172
-					add_action( 'edit_' . sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ), array( $this, 'meta_terms_save' ), 10, 3 );
173
-				}
174
-			}
175
-		}
176
-
177
-		/**
178
-		 * Add term classes.
179
-		 *
180
-		 * @param array $classes Classes.
181
-		 *
182
-		 * @return array
183
-		 */
184
-		public function add_term_classes( array $classes ): array {
185
-			$classes[] = 'redux-taxonomy';
186
-			$classes[] = 'redux-' . $this->parent->args['opt_name'];
187
-
188
-			if ( '' !== $this->parent->args['class'] ) {
189
-				$classes[] = $this->parent->args['class'];
190
-			}
191
-
192
-			return $classes;
193
-		}
194
-
195
-		/**
196
-		 * Add term hide class.
197
-		 *
198
-		 * @param array $classes Classes.
199
-		 *
200
-		 * @return array
201
-		 */
202
-		public function add_term_hide_class( array $classes ): array {
203
-			$classes[] = 'hide';
204
-
205
-			return $classes;
206
-		}
207
-
208
-		/**
209
-		 * Init.
210
-		 */
211
-		public function init() {
212
-			global $pagenow;
213
-
214
-			if ( isset( $_POST['action'] ) && 'redux_demo_customizer_save' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification
215
-				return;
216
-			}
217
-
218
-			$this->parent->transients['run_compiler'] = false;
219
-
220
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
221
-			$this->terms = apply_filters( 'redux/taxonomy/' . $this->parent->args['opt_name'] . '/terms', $this->terms, $this->parent->args['opt_name'] );
222
-
223
-			if ( empty( $this->terms ) && class_exists( 'Redux_Taxonomy' ) ) {
224
-				$this->terms = Redux_Taxonomy::construct_terms( $this->parent->args['opt_name'] );
225
-			}
226
-
227
-			if ( empty( $this->terms ) || ! is_array( $this->terms ) ) {
228
-				return;
229
-			}
230
-
231
-			// phpcs:disable WordPress.Security.NonceVerification
232
-			if ( ! isset( $_GET['tag_ID'] ) ) {
233
-				$_GET['tag_ID'] = 0;
234
-			}
235
-			$this->tag_id        = isset( $_GET['tag_ID'] ) ? sanitize_text_field( wp_unslash( $_GET['tag_ID'] ) ) : 0;
236
-			$this->taxonomy_type = isset( $_GET['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) : '';
237
-			// phpcs:enable WordPress.Security.NonceVerification
238
-
239
-			foreach ( $this->terms as $bk => $term ) {
240
-
241
-				// If the tag_ids for this term are set, we're limiting to the current tag id.
242
-				if ( ! empty( $term['tag_ids'] ) ) {
243
-					if ( ! is_array( $term['tag_ids'] ) ) {
244
-						$term['tag_ids'] = array( $term['tag_ids'] );
245
-					}
246
-					if ( ! in_array( $this->tag_id, $term['tag_ids'], true ) ) {
247
-						continue;
248
-					}
249
-				}
250
-
251
-				if ( ! isset( $term['taxonomy_types'] ) ) {
252
-					return;
253
-				}
254
-
255
-				if ( ! empty( $term['sections'] ) ) {
256
-					$this->sections         = $term['sections'];
257
-					$this->parent->sections = array_merge( $this->parent->sections, $term['sections'] );
258
-
259
-					$this->taxonomy_types = wp_parse_args( $this->taxonomy_types, $term['taxonomy_types'] );
260
-
261
-					// Checking to override the parent variables.
262
-					$add_field = false;
263
-
264
-					foreach ( $term['taxonomy_types'] as $type ) {
265
-						if ( $this->taxonomy_type === $type ) {
266
-							$add_field = true;
267
-						}
268
-					}
269
-
270
-					// Replacing all the fields.
271
-					if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
272
-						$run_hooks = true;
273
-
274
-						$this->meta[ $this->tag_id ] = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $this->tag_id ) );
275
-						$this->parent->options       = array_merge( $this->parent->options, $this->meta[ $this->tag_id ] );
276
-
277
-						foreach ( $term['sections'] as $sk => $section ) {
278
-							if ( ! empty( $section['fields'] ) ) {
279
-								foreach ( $section['fields'] as $fk => $field ) {
280
-									if ( ! isset( $field['class'] ) ) {
281
-										$field['class'] = '';
282
-
283
-										$this->terms[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
284
-									}
285
-
286
-									$this->parent->required_class->check_dependencies( $field );
287
-
288
-									if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
289
-										if ( empty( $field['id'] ) ) {
290
-											continue;
291
-										}
292
-
293
-										if ( isset( $field['default'] ) ) {
294
-											$this->options_defaults[ $field['id'] ] = $field['default'];
295
-										} else {
296
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
297
-										}
298
-
299
-										foreach ( $term['taxonomy_types'] as $type ) {
300
-											$this->taxonomy_type_fields[ $type ][ $field['id'] ] = 1;
301
-										}
302
-
303
-										if ( ! empty( $field['output'] ) ) {
304
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
305
-										}
306
-
307
-										// Detect what field types are being used.
308
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
309
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
310
-										} else {
311
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
312
-										}
313
-
314
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
315
-											$this->to_replace[ $field['id'] ] = $field;
316
-										}
317
-									}
318
-
319
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
320
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
321
-									}
322
-
323
-									if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
324
-										$this->meta[ $this->tag_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
325
-									}
326
-
327
-									// Only override if it exists, and it's not the default.
328
-									// phpcs:ignore Generic.CodeAnalysis.EmptyStatement
329
-									/** If ( isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $this->tag_id ][ $field['id'] ] === $field['default'] ) {
330
-									 *   // unset($this->meta[$this->tag_id][$field['id']]); .
331
-									 * }
332
-									 */
333
-								}
334
-							}
335
-						}
336
-					}
337
-				}
338
-			}
339
-
340
-			if ( isset( $run_hooks ) && true === $run_hooks ) {
341
-				$this->parent_options = array();
342
-
343
-				if ( ! empty( $this->to_replace ) ) {
344
-					foreach ( $this->to_replace as $id => $field ) {
345
-						add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
346
-					}
347
-				}
348
-
349
-				add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
350
-				add_filter( "redux/field/{$this->parent->args['opt_name']}/_can_output_css", array( $this, 'override_can_output_css' ) );
351
-				add_filter( "redux/field/{$this->parent->args['opt_name']}/output_css", array( $this, 'output_css' ) );
352
-
353
-				// phpcs:disable WordPress.Security.NonceVerification
354
-				if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) && isset( $_GET['taxonomy'] ) ) {
355
-					$priority = $this->parent->args['taxonomy_priority'] ?? 3;
356
-
357
-					add_action( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) . '_edit_form', array( $this, 'add_meta_terms' ), $priority );
358
-					add_action( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) . '_add_form_fields', array( $this, 'add_meta_terms' ), $priority );
359
-				}
360
-				// phpcs:enable WordPress.Security.NonceVerification
361
-			}
362
-		}
363
-
364
-		/**
365
-		 * Replace field.
366
-		 *
367
-		 * @param array $field Field array.
368
-		 *
369
-		 * @return mixed
370
-		 */
371
-		public function replace_field( array $field ) {
372
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
373
-				$field = $this->to_replace[ $field['id'] ];
374
-			}
375
-
376
-			return $field;
377
-		}
378
-
379
-		/**
380
-		 * CSS can output override.
381
-		 *
382
-		 * @param array $field Field array.
383
-		 *
384
-		 * @return array
385
-		 */
386
-		public function override_can_output_css( array $field ): array {
387
-			if ( isset( $this->output[ $field['id'] ] ) ) {
388
-				$field['force_output'] = true;
389
-			}
390
-
391
-			return $field;
392
-		}
393
-
394
-		/**
395
-		 * Output CSS>
396
-		 *
397
-		 * @param array $field Field array.
398
-		 *
399
-		 * @return array
400
-		 */
401
-		public function output_css( array $field ): array {
402
-			if ( isset( $this->output[ $field['id'] ] ) ) {
403
-				$field['output'] = $this->output[ $field['id'] ];
404
-			}
405
-
406
-			return $field;
407
-		}
408
-
409
-		/**
410
-		 * Make sure the defaults are the defaults
411
-		 *
412
-		 * @param array $options Options array.
413
-		 *
414
-		 * @return array
415
-		 */
416
-		public function override_options( array $options ): array {
417
-			$this->parent->options_class->default_values();
418
-			$this->parent_defaults = $this->parent->options_defaults;
419
-
420
-			$meta = $this->get_meta( $this->tag_id );
421
-			$data = wp_parse_args( $meta, $this->options_defaults );
422
-
423
-			foreach ( $data as $key => $value ) {
424
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
425
-					$data[ $key ] = $meta[ $key ];
426
-					continue;
427
-				}
428
-
429
-				if ( isset( $options[ $key ] ) ) {
430
-					$data[ $key ] = $options[ $key ];
431
-				}
432
-			}
433
-
434
-			$this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
435
-
436
-			return wp_parse_args( $data, $options );
437
-		}
438
-
439
-		/**
440
-		 * Enqueue support files and fields.
441
-		 */
442
-		public function enqueue() {
443
-			global $pagenow;
444
-
445
-			$types    = array();
446
-			$sections = array();
447
-
448
-			// Enqueue css.
449
-			foreach ( $this->terms as $key => $term ) {
450
-				if ( empty( $term['sections'] ) ) {
451
-					continue;
452
-				}
453
-
454
-				// phpcs:ignore WordPress.Security.NonceVerification
455
-				if ( isset( $_GET['taxonomy'] ) && isset( $term['taxonomy_types'] ) && in_array( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ), $term['taxonomy_types'], true ) ) {
456
-					$sections[] = $term['sections'];
457
-				}
458
-
459
-				$types = isset( $term['taxonomy_types'] ) ? array_merge( $term['taxonomy_types'], $types ) : $types;
460
-				if ( ! empty( $term['taxonomy_types'] ) ) {
461
-					if ( ! is_array( $term['taxonomy_types'] ) ) {
462
-						$term['taxonomy_types']                = array( $term['taxonomy_types'] );
463
-						$this->terms[ $key ]['taxonomy_types'] = $term['taxonomy_types'];
464
-					}
465
-				}
466
-			}
467
-
468
-			// phpcs:ignore WordPress.Security.NonceVerification
469
-			if ( in_array( $pagenow, $this->pagenows, true ) && isset( $_GET['taxonomy'] ) ) {
470
-				if ( in_array( wp_unslash( $_GET['taxonomy'] ), $types, true ) ) { // phpcs:ignore WordPress.Security.NonceVerification
471
-					$this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-taxonomy' );
472
-					$this->parent->transients_check = $this->parent->transients;
473
-
474
-					if ( isset( $this->parent->transients['notices'] ) ) {
475
-						$this->notices                              = $this->parent->transients['notices'];
476
-						$this->parent->transients['last_save_mode'] = 'taxonomy';
477
-					}
478
-
479
-					delete_transient( $this->parent->args['opt_name'] . '-transients-taxonomy' );
480
-					$this->parent->enqueue_class->init();
481
-
482
-					$this->parent->sections = $sections;
483
-
484
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
485
-					do_action( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue" );
486
-
487
-					/**
488
-					 * Redux taxonomy CSS
489
-					 * filter 'redux/page/{opt_name}/enqueue/redux-extension-taxonomy-css'
490
-					 */
491
-					if ( true === $this->parent->args['dev_mode'] ) {
492
-						wp_enqueue_style(
493
-							'redux-extension-taxonomy',
494
-							// phpcs:ignore WordPress.NamingConventions.ValidHookName
495
-							apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue/redux-extension-taxonomy-css", $this->extension_url . 'redux-extension-taxonomy.css' ),
496
-							array( 'redux-admin-css' ),
497
-							self::$version
498
-						);
499
-					}
500
-
501
-					/**
502
-					 * Redux taxonomy JS
503
-					 * filter 'redux/page/{opt_name}/enqueue/redux-extension-taxonomy-js
504
-					 */
505
-					wp_enqueue_script(
506
-						'redux-extension-taxonomy',
507
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
508
-						apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue/redux-extension-taxonomy-js", $this->extension_url . 'redux-extension-taxonomy' . Redux_Functions::is_min() . '.js' ),
509
-						array( 'jquery', 'redux-js' ),
510
-						self::$version,
511
-						true
512
-					);
513
-				}
514
-			}
515
-		}
516
-
517
-		/**
518
-		 * DEPRECATED
519
-		 */
520
-		public function default_values() {
521
-			if ( ! empty( $this->terms ) && empty( $this->options_defaults ) ) {
522
-				foreach ( $this->terms as $key => $term ) {
523
-					if ( empty( $term['sections'] ) ) {
524
-						continue;
525
-					}
526
-
527
-					// fill the cache.
528
-					foreach ( $term['sections'] as $sk => $section ) {
529
-						if ( ! isset( $section['id'] ) ) {
530
-							if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
531
-								$section['id'] = $sk;
532
-							} else {
533
-								$section['id'] = sanitize_title( $section['title'], $sk );
534
-							}
535
-							$this->terms[ $key ]['sections'][ $sk ] = $section;
536
-						}
537
-						if ( isset( $section['fields'] ) ) {
538
-							foreach ( $section['fields'] as $k => $field ) {
539
-								if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
540
-									continue;
541
-								}
542
-
543
-								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
544
-									$this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
545
-									unset( $this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
546
-								}
547
-
548
-								if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
549
-									$field['class']  = $field['class'] ?? '';
550
-									$field['class'] .= 'redux-section-indent-start';
551
-									$this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
552
-								}
553
-
554
-								if ( ! isset( $this->parent->options_defaults_class ) ) {
555
-									$this->parent->options_defaults_class = new Redux_Options_Defaults();
556
-								}
557
-
558
-								$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
559
-
560
-								if ( 'repeater' === $field['type'] ) {
561
-									foreach ( $field['fields'] as $f ) {
562
-										$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
563
-									}
564
-								}
565
-
566
-								$this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
567
-							}
568
-						}
569
-					}
570
-				}
571
-			}
572
-
573
-			if ( empty( $this->meta[ $this->tag_id ] ) ) {
574
-				$this->meta[ $this->tag_id ] = $this->get_meta( $this->tag_id );
575
-			}
576
-		}
577
-
578
-		/**
579
-		 * Add Meta Terms.
580
-		 */
581
-		public function add_meta_terms() {
582
-			if ( empty( $this->terms ) || ! is_array( $this->terms ) ) {
583
-				return;
584
-			}
585
-
586
-			foreach ( $this->terms as $key => $term ) {
587
-				if ( empty( $term['sections'] ) ) {
588
-					continue;
589
-				}
590
-
591
-				$defaults = array(
592
-					'id'         => "$key",
593
-					'section_id' => $key,
594
-					'terms'      => array(),
595
-				);
596
-
597
-				$term = wp_parse_args( $term, $defaults );
598
-				if ( ! empty( $term['taxonomy_types'] ) && isset( $_GET['taxonomy'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
599
-					foreach ( $term['taxonomy_types'] as $termtype ) {
600
-						if ( $_GET['taxonomy'] !== $termtype ) { // phpcs:ignore WordPress.Security.NonceVerification
601
-							continue;
602
-						}
603
-
604
-						// Override the parent args on a metaterm level.
605
-						if ( empty( $this->orig_args ) ) {
606
-							$this->orig_args = $this->parent->args;
607
-						}
608
-
609
-						if ( isset( $term['args'] ) ) {
610
-							$this->parent->args = wp_parse_args( $term['args'], $this->orig_args );
611
-						} elseif ( $this->parent->args !== $this->orig_args ) {
612
-							$this->parent->args = $this->orig_args;
613
-						}
614
-
615
-						if ( ! isset( $term['class'] ) ) {
616
-							$term['class'] = array();
617
-						}
618
-
619
-						if ( ! empty( $term['class'] ) ) {
620
-							if ( ! is_array( $term['class'] ) ) {
621
-								$term['class'] = array( $term['class'] );
622
-							}
623
-						}
624
-
625
-						$term['class'] = $this->add_term_classes( $term['class'] );
626
-
627
-						if ( isset( $term['post_format'] ) ) {
628
-							$term['class'] = $this->add_term_hide_class( $term['class'] );
629
-						}
630
-
631
-						global $pagenow;
632
-						if ( strpos( $pagenow, 'edit-' ) !== false ) {
633
-
634
-							$term['style']   = 'wp';
635
-							$term['class'][] = ' edit-page';
636
-							$term['class'][] = ' redux-wp-style';
637
-						}
638
-
639
-						$this->generate_terms( array( 'args' => $term ) );
640
-					}
641
-				}
642
-			}
643
-		}
644
-
645
-		/**
646
-		 * Field Default.
647
-		 *
648
-		 * @param array $field_id ID.
649
-		 *
650
-		 * @return mixed|string
651
-		 */
652
-		private function field_default( array $field_id ) {
653
-			if ( ! isset( $this->parent->options_defaults ) ) {
654
-				$this->parent->options_defaults = $this->parent->default_values();
655
-			}
656
-
657
-			if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
658
-				if ( ! isset( $this->parent->options_class ) ) {
659
-					$this->parent->options_class = new Redux_Options_Constructor( $this->parent );
660
-				}
661
-
662
-				$this->parent->options_class->get();
663
-			}
664
-
665
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
666
-				return $this->parent->options[ $field_id['id'] ];
667
-			} else {
668
-				if ( empty( $this->options_defaults ) ) {
669
-					$this->default_values(); // fill cache.
670
-				}
671
-
672
-				$data = '';
673
-				if ( ! empty( $this->options_defaults ) ) {
674
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
675
-				}
676
-
677
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
678
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
679
-				}
680
-
681
-				return $data;
682
-			}
683
-		}
684
-
685
-		/**
686
-		 * Function to get and cache the post-meta.
687
-		 *
688
-		 * @param string $id ID.
689
-		 *
690
-		 * @return array
691
-		 */
692
-		private function get_meta( string $id ): array {
693
-			if ( ! isset( $this->meta[ $id ] ) ) {
694
-				$this->meta[ $id ] = array();
695
-				$o_data            = get_post_meta( $id );
696
-
697
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
698
-				$o_data = apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/get_meta", $o_data );
699
-
700
-				if ( ! empty( $o_data ) ) {
701
-					foreach ( $o_data as $key => $value ) {
702
-						if ( count( $value ) === 1 ) {
703
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
704
-						} else {
705
-							$new_value = array_map( 'maybe_unserialize', $value );
706
-
707
-							$this->meta[ $id ][ $key ] = $new_value[0];
708
-						}
709
-					}
710
-				}
711
-
712
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
713
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
714
-
715
-					foreach ( $data as $key => $value ) {
716
-						$this->meta[ $id ][ $key ] = $value;
717
-						update_post_meta( $id, $key, $value );
718
-					}
719
-
720
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
721
-
722
-					delete_post_meta( $id, $this->parent->args['opt_name'] );
723
-				}
724
-			}
725
-
726
-			return $this->meta[ $id ];
727
-		}
728
-
729
-		/**
730
-		 * Get values.
731
-		 *
732
-		 * @param mixed  $the_post WP_Post.
733
-		 * @param string $meta_key Meta key.
734
-		 * @param string $def_val  Default value.
735
-		 *
736
-		 * @return mixed|string
737
-		 */
738
-		public function get_values( $the_post, string $meta_key = '', string $def_val = '' ) {
739
-
740
-			// Override these values if they differ from the admin panel defaults.
741
-			if ( isset( $the_post->taxonomy_type ) && in_array( $the_post->taxonomy_type, $this->taxonomy_types, true ) ) {
742
-				if ( isset( $this->taxonomy_type_values[ $the_post->taxonomy_type ] ) ) {
743
-					$meta = $this->taxonomy_type_fields[ $the_post->taxonomy_type ];
744
-				} else {
745
-					$defaults = array();
746
-					if ( ! empty( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] ) ) {
747
-						foreach ( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] as $key => $null ) {
748
-							if ( isset( $this->options_defaults[ $key ] ) ) {
749
-								$defaults[ $key ] = $this->options_defaults[ $key ];
750
-							}
751
-						}
752
-					}
753
-
754
-					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
755
-
756
-					$this->taxonomy_type_fields[ $the_post->taxonomy_type ] = $meta;
757
-				}
758
-
759
-				if ( ! empty( $meta_key ) ) {
760
-					if ( ! isset( $meta[ $meta_key ] ) ) {
761
-						$meta[ $meta_key ] = $def_val;
762
-					}
763
-
764
-					return $meta[ $meta_key ];
765
-				} else {
766
-					return $meta;
767
-				}
768
-			}
769
-
770
-			return $def_val;
771
-		}
772
-
773
-		/**
774
-		 * Check edit visibility.
775
-		 *
776
-		 * @param array $params Array.
777
-		 * @param bool  $subscan Flag to perform scan for fields of fields.
778
-		 *
779
-		 * @return bool
780
-		 */
781
-		private function check_edit_visibility( array $params = array(), bool $subscan = true ): bool {
782
-			global $pagenow;
783
-
784
-			// Edit page visibility.
785
-			if ( strpos( $pagenow, 'edit-' ) !== false ) {
786
-				if ( true === $subscan ) {
787
-					if ( isset( $params['fields'] ) ) {
788
-
789
-						foreach ( $params['fields'] as $field ) {
790
-							if ( in_array( $field['id'], Redux_Core::$fields_hidden, true ) ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
791
-								// Not visible.
792
-							} elseif ( isset( $field['add_visibility'] ) && $field['add_visibility'] ) {
793
-								return true;
794
-							}
795
-						}
796
-
797
-						return false;
798
-					}
799
-				}
800
-
801
-				if ( isset( $params['add_visibility'] ) && true === $params['add_visibility'] ) {
802
-					return true;
803
-				}
804
-
805
-				return false;
806
-			}
807
-
808
-			return true;
809
-		}
810
-
811
-		/**
812
-		 * Generate Terms.
813
-		 *
814
-		 * @param array $metaterm Term.
815
-		 */
816
-		private function generate_terms( array $metaterm ) {
817
-			if ( ! empty( $metaterm['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metaterm['args']['permissions'] ) ) {
818
-				return;
819
-			}
820
-
821
-			if ( isset( $metaterm['args']['style'] ) && in_array( $metaterm['args']['style'], array( 'wp', 'wordpress' ), true ) ) {
822
-				$container_class             = 'redux-wp-style';
823
-				$metaterm['args']['sidebar'] = false;
824
-			} elseif ( isset( $metaterm['args']['sidebar'] ) && ! $metaterm['args']['sidebar'] ) {
825
-				$container_class = 'redux-no-sections';
826
-			} else {
827
-				$container_class = 'redux-has-sections';
828
-			}
829
-
830
-			$class = implode( ' ', $metaterm['args']['class'] );
831
-			echo '<div class="' . esc_attr( $class ) . '">';
832
-
833
-			$sections = $metaterm['args']['sections'];
834
-
835
-			wp_nonce_field( 'redux_taxonomy_meta_nonce', 'redux_taxonomy_meta_nonce' );
836
-
837
-			wp_dequeue_script( 'json-view-js' );
838
-
839
-			$sidebar = true;
840
-			if ( count( $sections ) === 1 || ( isset( $metaterm['args']['sidebar'] ) && false === $metaterm['args']['sidebar'] ) ) {
841
-				$sidebar = false; // Show the section dividers or not.
842
-			}
843
-
844
-			?>
17
+    /**
18
+     * Main ReduxFramework customizer extension class
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Extension_Taxonomy extends Redux_Extension_Abstract {
23
+
24
+        /**
25
+         * Extension version.
26
+         *
27
+         * @var string
28
+         */
29
+        public static $version = '4.4.19';
30
+
31
+        /**
32
+         * Extension friendly name.
33
+         *
34
+         * @var string
35
+         */
36
+        public string $extension_name = 'Taxonomy';
37
+
38
+        /**
39
+         * Terms array.
40
+         *
41
+         * @var array
42
+         */
43
+        public array $terms = array();
44
+
45
+        /**
46
+         * Taxonomy types array.
47
+         *
48
+         * @var array
49
+         */
50
+        public array $taxonomy_types = array();
51
+
52
+        /**
53
+         * Taxonomy type.
54
+         *
55
+         * @var string
56
+         */
57
+        public string $taxonomy_type = '';
58
+
59
+        /**
60
+         * Sections array.
61
+         *
62
+         * @var array
63
+         */
64
+        public array $sections = array();
65
+
66
+        /**
67
+         * Original args array.
68
+         *
69
+         * @var array
70
+         */
71
+        public array $orig_args = array();
72
+
73
+        /**
74
+         * Output array.
75
+         *
76
+         * @var array
77
+         */
78
+        public array $output = array();
79
+
80
+        /**
81
+         * Parent options.
82
+         *
83
+         * @var array
84
+         */
85
+        public array $parent_options = array();
86
+
87
+        /**
88
+         * Parent defaults.
89
+         *
90
+         * @var array
91
+         */
92
+        public array $parent_defaults = array();
93
+
94
+        /**
95
+         * Taxonomy field types array.
96
+         *
97
+         * @var array
98
+         */
99
+        public array $taxonomy_type_fields = array();
100
+
101
+        /**
102
+         * Option defaults.
103
+         *
104
+         * @var array
105
+         */
106
+        public array $options_defaults = array();
107
+
108
+        /**
109
+         * To replace array.
110
+         *
111
+         * @var array
112
+         */
113
+        public array $to_replace = array();
114
+
115
+        /**
116
+         * Meta array.
117
+         *
118
+         * @var array
119
+         */
120
+        public array $meta = array();
121
+
122
+        /**
123
+         * Tag ID.
124
+         *
125
+         * @var int
126
+         */
127
+        public int $tag_id = 0;
128
+
129
+        /**
130
+         * Accepted WordPress screens.
131
+         *
132
+         * @var array
133
+         */
134
+        private array $pagenows;
135
+
136
+        /**
137
+         * Notices array.
138
+         *
139
+         * @var array
140
+         */
141
+        public array $notices;
142
+
143
+        /**
144
+         * Redux_Extension_Taxonomy constructor.
145
+         *
146
+         * @param object $redux ReduxFramework object.
147
+         */
148
+        public function __construct( $redux ) {
149
+            global $pagenow;
150
+
151
+            parent::__construct( $redux, __FILE__ );
152
+
153
+            $this->parent = $redux;
154
+
155
+            $this->add_field( 'taxonomy' );
156
+            $this->parent->extensions['taxonomy'] = $this;
157
+
158
+            $this->pagenows = array( 'edit-tags.php', 'term.php' );
159
+
160
+            include_once __DIR__ . '/redux-taxonomy-helpers.php';
161
+
162
+            add_action( 'admin_notices', array( $this, 'meta_terms_show_errors' ), 0 );
163
+            add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
164
+
165
+            if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
166
+                $this->init();
167
+
168
+                // phpcs:ignore WordPress.Security.NonceVerification
169
+                if ( isset( $_POST['taxonomy'] ) ) {
170
+
171
+                    // phpcs:ignore WordPress.Security.NonceVerification
172
+                    add_action( 'edit_' . sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ), array( $this, 'meta_terms_save' ), 10, 3 );
173
+                }
174
+            }
175
+        }
176
+
177
+        /**
178
+         * Add term classes.
179
+         *
180
+         * @param array $classes Classes.
181
+         *
182
+         * @return array
183
+         */
184
+        public function add_term_classes( array $classes ): array {
185
+            $classes[] = 'redux-taxonomy';
186
+            $classes[] = 'redux-' . $this->parent->args['opt_name'];
187
+
188
+            if ( '' !== $this->parent->args['class'] ) {
189
+                $classes[] = $this->parent->args['class'];
190
+            }
191
+
192
+            return $classes;
193
+        }
194
+
195
+        /**
196
+         * Add term hide class.
197
+         *
198
+         * @param array $classes Classes.
199
+         *
200
+         * @return array
201
+         */
202
+        public function add_term_hide_class( array $classes ): array {
203
+            $classes[] = 'hide';
204
+
205
+            return $classes;
206
+        }
207
+
208
+        /**
209
+         * Init.
210
+         */
211
+        public function init() {
212
+            global $pagenow;
213
+
214
+            if ( isset( $_POST['action'] ) && 'redux_demo_customizer_save' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification
215
+                return;
216
+            }
217
+
218
+            $this->parent->transients['run_compiler'] = false;
219
+
220
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
221
+            $this->terms = apply_filters( 'redux/taxonomy/' . $this->parent->args['opt_name'] . '/terms', $this->terms, $this->parent->args['opt_name'] );
222
+
223
+            if ( empty( $this->terms ) && class_exists( 'Redux_Taxonomy' ) ) {
224
+                $this->terms = Redux_Taxonomy::construct_terms( $this->parent->args['opt_name'] );
225
+            }
226
+
227
+            if ( empty( $this->terms ) || ! is_array( $this->terms ) ) {
228
+                return;
229
+            }
230
+
231
+            // phpcs:disable WordPress.Security.NonceVerification
232
+            if ( ! isset( $_GET['tag_ID'] ) ) {
233
+                $_GET['tag_ID'] = 0;
234
+            }
235
+            $this->tag_id        = isset( $_GET['tag_ID'] ) ? sanitize_text_field( wp_unslash( $_GET['tag_ID'] ) ) : 0;
236
+            $this->taxonomy_type = isset( $_GET['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) : '';
237
+            // phpcs:enable WordPress.Security.NonceVerification
238
+
239
+            foreach ( $this->terms as $bk => $term ) {
240
+
241
+                // If the tag_ids for this term are set, we're limiting to the current tag id.
242
+                if ( ! empty( $term['tag_ids'] ) ) {
243
+                    if ( ! is_array( $term['tag_ids'] ) ) {
244
+                        $term['tag_ids'] = array( $term['tag_ids'] );
245
+                    }
246
+                    if ( ! in_array( $this->tag_id, $term['tag_ids'], true ) ) {
247
+                        continue;
248
+                    }
249
+                }
250
+
251
+                if ( ! isset( $term['taxonomy_types'] ) ) {
252
+                    return;
253
+                }
254
+
255
+                if ( ! empty( $term['sections'] ) ) {
256
+                    $this->sections         = $term['sections'];
257
+                    $this->parent->sections = array_merge( $this->parent->sections, $term['sections'] );
258
+
259
+                    $this->taxonomy_types = wp_parse_args( $this->taxonomy_types, $term['taxonomy_types'] );
260
+
261
+                    // Checking to override the parent variables.
262
+                    $add_field = false;
263
+
264
+                    foreach ( $term['taxonomy_types'] as $type ) {
265
+                        if ( $this->taxonomy_type === $type ) {
266
+                            $add_field = true;
267
+                        }
268
+                    }
269
+
270
+                    // Replacing all the fields.
271
+                    if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
272
+                        $run_hooks = true;
273
+
274
+                        $this->meta[ $this->tag_id ] = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $this->tag_id ) );
275
+                        $this->parent->options       = array_merge( $this->parent->options, $this->meta[ $this->tag_id ] );
276
+
277
+                        foreach ( $term['sections'] as $sk => $section ) {
278
+                            if ( ! empty( $section['fields'] ) ) {
279
+                                foreach ( $section['fields'] as $fk => $field ) {
280
+                                    if ( ! isset( $field['class'] ) ) {
281
+                                        $field['class'] = '';
282
+
283
+                                        $this->terms[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
284
+                                    }
285
+
286
+                                    $this->parent->required_class->check_dependencies( $field );
287
+
288
+                                    if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
289
+                                        if ( empty( $field['id'] ) ) {
290
+                                            continue;
291
+                                        }
292
+
293
+                                        if ( isset( $field['default'] ) ) {
294
+                                            $this->options_defaults[ $field['id'] ] = $field['default'];
295
+                                        } else {
296
+                                            $this->options_defaults[ $field['id'] ] = $this->field_default( $field );
297
+                                        }
298
+
299
+                                        foreach ( $term['taxonomy_types'] as $type ) {
300
+                                            $this->taxonomy_type_fields[ $type ][ $field['id'] ] = 1;
301
+                                        }
302
+
303
+                                        if ( ! empty( $field['output'] ) ) {
304
+                                            $this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
305
+                                        }
306
+
307
+                                        // Detect what field types are being used.
308
+                                        if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
309
+                                            $this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
310
+                                        } else {
311
+                                            $this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
312
+                                        }
313
+
314
+                                        if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
315
+                                            $this->to_replace[ $field['id'] ] = $field;
316
+                                        }
317
+                                    }
318
+
319
+                                    if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
320
+                                        $this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
321
+                                    }
322
+
323
+                                    if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
324
+                                        $this->meta[ $this->tag_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
325
+                                    }
326
+
327
+                                    // Only override if it exists, and it's not the default.
328
+                                    // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
329
+                                    /** If ( isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $this->tag_id ][ $field['id'] ] === $field['default'] ) {
330
+                                     *   // unset($this->meta[$this->tag_id][$field['id']]); .
331
+                                     * }
332
+                                     */
333
+                                }
334
+                            }
335
+                        }
336
+                    }
337
+                }
338
+            }
339
+
340
+            if ( isset( $run_hooks ) && true === $run_hooks ) {
341
+                $this->parent_options = array();
342
+
343
+                if ( ! empty( $this->to_replace ) ) {
344
+                    foreach ( $this->to_replace as $id => $field ) {
345
+                        add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
346
+                    }
347
+                }
348
+
349
+                add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
350
+                add_filter( "redux/field/{$this->parent->args['opt_name']}/_can_output_css", array( $this, 'override_can_output_css' ) );
351
+                add_filter( "redux/field/{$this->parent->args['opt_name']}/output_css", array( $this, 'output_css' ) );
352
+
353
+                // phpcs:disable WordPress.Security.NonceVerification
354
+                if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) && isset( $_GET['taxonomy'] ) ) {
355
+                    $priority = $this->parent->args['taxonomy_priority'] ?? 3;
356
+
357
+                    add_action( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) . '_edit_form', array( $this, 'add_meta_terms' ), $priority );
358
+                    add_action( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ) . '_add_form_fields', array( $this, 'add_meta_terms' ), $priority );
359
+                }
360
+                // phpcs:enable WordPress.Security.NonceVerification
361
+            }
362
+        }
363
+
364
+        /**
365
+         * Replace field.
366
+         *
367
+         * @param array $field Field array.
368
+         *
369
+         * @return mixed
370
+         */
371
+        public function replace_field( array $field ) {
372
+            if ( isset( $this->to_replace[ $field['id'] ] ) ) {
373
+                $field = $this->to_replace[ $field['id'] ];
374
+            }
375
+
376
+            return $field;
377
+        }
378
+
379
+        /**
380
+         * CSS can output override.
381
+         *
382
+         * @param array $field Field array.
383
+         *
384
+         * @return array
385
+         */
386
+        public function override_can_output_css( array $field ): array {
387
+            if ( isset( $this->output[ $field['id'] ] ) ) {
388
+                $field['force_output'] = true;
389
+            }
390
+
391
+            return $field;
392
+        }
393
+
394
+        /**
395
+         * Output CSS>
396
+         *
397
+         * @param array $field Field array.
398
+         *
399
+         * @return array
400
+         */
401
+        public function output_css( array $field ): array {
402
+            if ( isset( $this->output[ $field['id'] ] ) ) {
403
+                $field['output'] = $this->output[ $field['id'] ];
404
+            }
405
+
406
+            return $field;
407
+        }
408
+
409
+        /**
410
+         * Make sure the defaults are the defaults
411
+         *
412
+         * @param array $options Options array.
413
+         *
414
+         * @return array
415
+         */
416
+        public function override_options( array $options ): array {
417
+            $this->parent->options_class->default_values();
418
+            $this->parent_defaults = $this->parent->options_defaults;
419
+
420
+            $meta = $this->get_meta( $this->tag_id );
421
+            $data = wp_parse_args( $meta, $this->options_defaults );
422
+
423
+            foreach ( $data as $key => $value ) {
424
+                if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
425
+                    $data[ $key ] = $meta[ $key ];
426
+                    continue;
427
+                }
428
+
429
+                if ( isset( $options[ $key ] ) ) {
430
+                    $data[ $key ] = $options[ $key ];
431
+                }
432
+            }
433
+
434
+            $this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
435
+
436
+            return wp_parse_args( $data, $options );
437
+        }
438
+
439
+        /**
440
+         * Enqueue support files and fields.
441
+         */
442
+        public function enqueue() {
443
+            global $pagenow;
444
+
445
+            $types    = array();
446
+            $sections = array();
447
+
448
+            // Enqueue css.
449
+            foreach ( $this->terms as $key => $term ) {
450
+                if ( empty( $term['sections'] ) ) {
451
+                    continue;
452
+                }
453
+
454
+                // phpcs:ignore WordPress.Security.NonceVerification
455
+                if ( isset( $_GET['taxonomy'] ) && isset( $term['taxonomy_types'] ) && in_array( sanitize_text_field( wp_unslash( $_GET['taxonomy'] ) ), $term['taxonomy_types'], true ) ) {
456
+                    $sections[] = $term['sections'];
457
+                }
458
+
459
+                $types = isset( $term['taxonomy_types'] ) ? array_merge( $term['taxonomy_types'], $types ) : $types;
460
+                if ( ! empty( $term['taxonomy_types'] ) ) {
461
+                    if ( ! is_array( $term['taxonomy_types'] ) ) {
462
+                        $term['taxonomy_types']                = array( $term['taxonomy_types'] );
463
+                        $this->terms[ $key ]['taxonomy_types'] = $term['taxonomy_types'];
464
+                    }
465
+                }
466
+            }
467
+
468
+            // phpcs:ignore WordPress.Security.NonceVerification
469
+            if ( in_array( $pagenow, $this->pagenows, true ) && isset( $_GET['taxonomy'] ) ) {
470
+                if ( in_array( wp_unslash( $_GET['taxonomy'] ), $types, true ) ) { // phpcs:ignore WordPress.Security.NonceVerification
471
+                    $this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-taxonomy' );
472
+                    $this->parent->transients_check = $this->parent->transients;
473
+
474
+                    if ( isset( $this->parent->transients['notices'] ) ) {
475
+                        $this->notices                              = $this->parent->transients['notices'];
476
+                        $this->parent->transients['last_save_mode'] = 'taxonomy';
477
+                    }
478
+
479
+                    delete_transient( $this->parent->args['opt_name'] . '-transients-taxonomy' );
480
+                    $this->parent->enqueue_class->init();
481
+
482
+                    $this->parent->sections = $sections;
483
+
484
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
485
+                    do_action( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue" );
486
+
487
+                    /**
488
+                     * Redux taxonomy CSS
489
+                     * filter 'redux/page/{opt_name}/enqueue/redux-extension-taxonomy-css'
490
+                     */
491
+                    if ( true === $this->parent->args['dev_mode'] ) {
492
+                        wp_enqueue_style(
493
+                            'redux-extension-taxonomy',
494
+                            // phpcs:ignore WordPress.NamingConventions.ValidHookName
495
+                            apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue/redux-extension-taxonomy-css", $this->extension_url . 'redux-extension-taxonomy.css' ),
496
+                            array( 'redux-admin-css' ),
497
+                            self::$version
498
+                        );
499
+                    }
500
+
501
+                    /**
502
+                     * Redux taxonomy JS
503
+                     * filter 'redux/page/{opt_name}/enqueue/redux-extension-taxonomy-js
504
+                     */
505
+                    wp_enqueue_script(
506
+                        'redux-extension-taxonomy',
507
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
508
+                        apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/enqueue/redux-extension-taxonomy-js", $this->extension_url . 'redux-extension-taxonomy' . Redux_Functions::is_min() . '.js' ),
509
+                        array( 'jquery', 'redux-js' ),
510
+                        self::$version,
511
+                        true
512
+                    );
513
+                }
514
+            }
515
+        }
516
+
517
+        /**
518
+         * DEPRECATED
519
+         */
520
+        public function default_values() {
521
+            if ( ! empty( $this->terms ) && empty( $this->options_defaults ) ) {
522
+                foreach ( $this->terms as $key => $term ) {
523
+                    if ( empty( $term['sections'] ) ) {
524
+                        continue;
525
+                    }
526
+
527
+                    // fill the cache.
528
+                    foreach ( $term['sections'] as $sk => $section ) {
529
+                        if ( ! isset( $section['id'] ) ) {
530
+                            if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
531
+                                $section['id'] = $sk;
532
+                            } else {
533
+                                $section['id'] = sanitize_title( $section['title'], $sk );
534
+                            }
535
+                            $this->terms[ $key ]['sections'][ $sk ] = $section;
536
+                        }
537
+                        if ( isset( $section['fields'] ) ) {
538
+                            foreach ( $section['fields'] as $k => $field ) {
539
+                                if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
540
+                                    continue;
541
+                                }
542
+
543
+                                if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
544
+                                    $this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
545
+                                    unset( $this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
546
+                                }
547
+
548
+                                if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
549
+                                    $field['class']  = $field['class'] ?? '';
550
+                                    $field['class'] .= 'redux-section-indent-start';
551
+                                    $this->terms[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
552
+                                }
553
+
554
+                                if ( ! isset( $this->parent->options_defaults_class ) ) {
555
+                                    $this->parent->options_defaults_class = new Redux_Options_Defaults();
556
+                                }
557
+
558
+                                $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
559
+
560
+                                if ( 'repeater' === $field['type'] ) {
561
+                                    foreach ( $field['fields'] as $f ) {
562
+                                        $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
563
+                                    }
564
+                                }
565
+
566
+                                $this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
567
+                            }
568
+                        }
569
+                    }
570
+                }
571
+            }
572
+
573
+            if ( empty( $this->meta[ $this->tag_id ] ) ) {
574
+                $this->meta[ $this->tag_id ] = $this->get_meta( $this->tag_id );
575
+            }
576
+        }
577
+
578
+        /**
579
+         * Add Meta Terms.
580
+         */
581
+        public function add_meta_terms() {
582
+            if ( empty( $this->terms ) || ! is_array( $this->terms ) ) {
583
+                return;
584
+            }
585
+
586
+            foreach ( $this->terms as $key => $term ) {
587
+                if ( empty( $term['sections'] ) ) {
588
+                    continue;
589
+                }
590
+
591
+                $defaults = array(
592
+                    'id'         => "$key",
593
+                    'section_id' => $key,
594
+                    'terms'      => array(),
595
+                );
596
+
597
+                $term = wp_parse_args( $term, $defaults );
598
+                if ( ! empty( $term['taxonomy_types'] ) && isset( $_GET['taxonomy'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
599
+                    foreach ( $term['taxonomy_types'] as $termtype ) {
600
+                        if ( $_GET['taxonomy'] !== $termtype ) { // phpcs:ignore WordPress.Security.NonceVerification
601
+                            continue;
602
+                        }
603
+
604
+                        // Override the parent args on a metaterm level.
605
+                        if ( empty( $this->orig_args ) ) {
606
+                            $this->orig_args = $this->parent->args;
607
+                        }
608
+
609
+                        if ( isset( $term['args'] ) ) {
610
+                            $this->parent->args = wp_parse_args( $term['args'], $this->orig_args );
611
+                        } elseif ( $this->parent->args !== $this->orig_args ) {
612
+                            $this->parent->args = $this->orig_args;
613
+                        }
614
+
615
+                        if ( ! isset( $term['class'] ) ) {
616
+                            $term['class'] = array();
617
+                        }
618
+
619
+                        if ( ! empty( $term['class'] ) ) {
620
+                            if ( ! is_array( $term['class'] ) ) {
621
+                                $term['class'] = array( $term['class'] );
622
+                            }
623
+                        }
624
+
625
+                        $term['class'] = $this->add_term_classes( $term['class'] );
626
+
627
+                        if ( isset( $term['post_format'] ) ) {
628
+                            $term['class'] = $this->add_term_hide_class( $term['class'] );
629
+                        }
630
+
631
+                        global $pagenow;
632
+                        if ( strpos( $pagenow, 'edit-' ) !== false ) {
633
+
634
+                            $term['style']   = 'wp';
635
+                            $term['class'][] = ' edit-page';
636
+                            $term['class'][] = ' redux-wp-style';
637
+                        }
638
+
639
+                        $this->generate_terms( array( 'args' => $term ) );
640
+                    }
641
+                }
642
+            }
643
+        }
644
+
645
+        /**
646
+         * Field Default.
647
+         *
648
+         * @param array $field_id ID.
649
+         *
650
+         * @return mixed|string
651
+         */
652
+        private function field_default( array $field_id ) {
653
+            if ( ! isset( $this->parent->options_defaults ) ) {
654
+                $this->parent->options_defaults = $this->parent->default_values();
655
+            }
656
+
657
+            if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
658
+                if ( ! isset( $this->parent->options_class ) ) {
659
+                    $this->parent->options_class = new Redux_Options_Constructor( $this->parent );
660
+                }
661
+
662
+                $this->parent->options_class->get();
663
+            }
664
+
665
+            if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
666
+                return $this->parent->options[ $field_id['id'] ];
667
+            } else {
668
+                if ( empty( $this->options_defaults ) ) {
669
+                    $this->default_values(); // fill cache.
670
+                }
671
+
672
+                $data = '';
673
+                if ( ! empty( $this->options_defaults ) ) {
674
+                    $data = $this->options_defaults[ $field_id['id'] ] ?? '';
675
+                }
676
+
677
+                if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
678
+                    $data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
679
+                }
680
+
681
+                return $data;
682
+            }
683
+        }
684
+
685
+        /**
686
+         * Function to get and cache the post-meta.
687
+         *
688
+         * @param string $id ID.
689
+         *
690
+         * @return array
691
+         */
692
+        private function get_meta( string $id ): array {
693
+            if ( ! isset( $this->meta[ $id ] ) ) {
694
+                $this->meta[ $id ] = array();
695
+                $o_data            = get_post_meta( $id );
696
+
697
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
698
+                $o_data = apply_filters( "redux/taxonomy/{$this->parent->args['opt_name']}/get_meta", $o_data );
699
+
700
+                if ( ! empty( $o_data ) ) {
701
+                    foreach ( $o_data as $key => $value ) {
702
+                        if ( count( $value ) === 1 ) {
703
+                            $this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
704
+                        } else {
705
+                            $new_value = array_map( 'maybe_unserialize', $value );
706
+
707
+                            $this->meta[ $id ][ $key ] = $new_value[0];
708
+                        }
709
+                    }
710
+                }
711
+
712
+                if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
713
+                    $data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
714
+
715
+                    foreach ( $data as $key => $value ) {
716
+                        $this->meta[ $id ][ $key ] = $value;
717
+                        update_post_meta( $id, $key, $value );
718
+                    }
719
+
720
+                    unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
721
+
722
+                    delete_post_meta( $id, $this->parent->args['opt_name'] );
723
+                }
724
+            }
725
+
726
+            return $this->meta[ $id ];
727
+        }
728
+
729
+        /**
730
+         * Get values.
731
+         *
732
+         * @param mixed  $the_post WP_Post.
733
+         * @param string $meta_key Meta key.
734
+         * @param string $def_val  Default value.
735
+         *
736
+         * @return mixed|string
737
+         */
738
+        public function get_values( $the_post, string $meta_key = '', string $def_val = '' ) {
739
+
740
+            // Override these values if they differ from the admin panel defaults.
741
+            if ( isset( $the_post->taxonomy_type ) && in_array( $the_post->taxonomy_type, $this->taxonomy_types, true ) ) {
742
+                if ( isset( $this->taxonomy_type_values[ $the_post->taxonomy_type ] ) ) {
743
+                    $meta = $this->taxonomy_type_fields[ $the_post->taxonomy_type ];
744
+                } else {
745
+                    $defaults = array();
746
+                    if ( ! empty( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] ) ) {
747
+                        foreach ( $this->taxonomy_type_fields[ $the_post->taxonomy_type ] as $key => $null ) {
748
+                            if ( isset( $this->options_defaults[ $key ] ) ) {
749
+                                $defaults[ $key ] = $this->options_defaults[ $key ];
750
+                            }
751
+                        }
752
+                    }
753
+
754
+                    $meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
755
+
756
+                    $this->taxonomy_type_fields[ $the_post->taxonomy_type ] = $meta;
757
+                }
758
+
759
+                if ( ! empty( $meta_key ) ) {
760
+                    if ( ! isset( $meta[ $meta_key ] ) ) {
761
+                        $meta[ $meta_key ] = $def_val;
762
+                    }
763
+
764
+                    return $meta[ $meta_key ];
765
+                } else {
766
+                    return $meta;
767
+                }
768
+            }
769
+
770
+            return $def_val;
771
+        }
772
+
773
+        /**
774
+         * Check edit visibility.
775
+         *
776
+         * @param array $params Array.
777
+         * @param bool  $subscan Flag to perform scan for fields of fields.
778
+         *
779
+         * @return bool
780
+         */
781
+        private function check_edit_visibility( array $params = array(), bool $subscan = true ): bool {
782
+            global $pagenow;
783
+
784
+            // Edit page visibility.
785
+            if ( strpos( $pagenow, 'edit-' ) !== false ) {
786
+                if ( true === $subscan ) {
787
+                    if ( isset( $params['fields'] ) ) {
788
+
789
+                        foreach ( $params['fields'] as $field ) {
790
+                            if ( in_array( $field['id'], Redux_Core::$fields_hidden, true ) ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
791
+                                // Not visible.
792
+                            } elseif ( isset( $field['add_visibility'] ) && $field['add_visibility'] ) {
793
+                                return true;
794
+                            }
795
+                        }
796
+
797
+                        return false;
798
+                    }
799
+                }
800
+
801
+                if ( isset( $params['add_visibility'] ) && true === $params['add_visibility'] ) {
802
+                    return true;
803
+                }
804
+
805
+                return false;
806
+            }
807
+
808
+            return true;
809
+        }
810
+
811
+        /**
812
+         * Generate Terms.
813
+         *
814
+         * @param array $metaterm Term.
815
+         */
816
+        private function generate_terms( array $metaterm ) {
817
+            if ( ! empty( $metaterm['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metaterm['args']['permissions'] ) ) {
818
+                return;
819
+            }
820
+
821
+            if ( isset( $metaterm['args']['style'] ) && in_array( $metaterm['args']['style'], array( 'wp', 'wordpress' ), true ) ) {
822
+                $container_class             = 'redux-wp-style';
823
+                $metaterm['args']['sidebar'] = false;
824
+            } elseif ( isset( $metaterm['args']['sidebar'] ) && ! $metaterm['args']['sidebar'] ) {
825
+                $container_class = 'redux-no-sections';
826
+            } else {
827
+                $container_class = 'redux-has-sections';
828
+            }
829
+
830
+            $class = implode( ' ', $metaterm['args']['class'] );
831
+            echo '<div class="' . esc_attr( $class ) . '">';
832
+
833
+            $sections = $metaterm['args']['sections'];
834
+
835
+            wp_nonce_field( 'redux_taxonomy_meta_nonce', 'redux_taxonomy_meta_nonce' );
836
+
837
+            wp_dequeue_script( 'json-view-js' );
838
+
839
+            $sidebar = true;
840
+            if ( count( $sections ) === 1 || ( isset( $metaterm['args']['sidebar'] ) && false === $metaterm['args']['sidebar'] ) ) {
841
+                $sidebar = false; // Show the section dividers or not.
842
+            }
843
+
844
+            ?>
845 845
 			<div data-opt-name="<?php echo esc_attr( $this->parent->args['opt_name'] ); ?>"
846 846
 				class="redux-container <?php echo( esc_attr( $container_class ) ); ?> redux-term redux-box-normal redux-term-normal">
847 847
 				<div class="redux-notices">
@@ -865,292 +865,292 @@  discard block
 block discarded – undo
865 865
 					</div>
866 866
 				</div>
867 867
 				<?php
868
-				echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
869
-				if ( $sidebar ) {
870
-					?>
868
+                echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
869
+                if ( $sidebar ) {
870
+                    ?>
871 871
 					<div class="redux-sidebar">
872 872
 						<ul class="redux-group-menu">
873 873
 							<?php
874
-							foreach ( $sections as $s_key => $section ) {
875
-								if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
876
-									continue;
877
-								}
878
-
879
-								// phpcs:ignore WordPress.Security.EscapeOutput
880
-								echo $this->parent->render_class->section_menu( $s_key, $section, '_' . $metaterm['args']['id'], $sections );
881
-							}
882
-							?>
874
+                            foreach ( $sections as $s_key => $section ) {
875
+                                if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
876
+                                    continue;
877
+                                }
878
+
879
+                                // phpcs:ignore WordPress.Security.EscapeOutput
880
+                                echo $this->parent->render_class->section_menu( $s_key, $section, '_' . $metaterm['args']['id'], $sections );
881
+                            }
882
+                            ?>
883 883
 						</ul>
884 884
 					</div>
885 885
 				<?php } ?>
886 886
 				<div class="redux-main">
887 887
 					<?php
888 888
 
889
-					foreach ( $sections as $s_key => $section ) {
890
-						if ( ! $this->check_edit_visibility( $section ) ) {
891
-							continue;
892
-						}
893
-
894
-						if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
895
-							continue;
896
-						}
897
-
898
-						if ( ! empty( $section['fields'] ) ) {
899
-							if ( isset( $section['args'] ) ) {
900
-								$this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
901
-							} elseif ( $this->parent->args !== $this->orig_args ) {
902
-								$this->parent->args = $this->orig_args;
903
-							}
904
-
905
-							$hide             = $sidebar ? '' : ' display-group';
906
-							$section['class'] = isset( $section['class'] ) ? " {$section['class']}" : '';
907
-
908
-							// phpcs:ignore WordPress.Security.EscapeOutput
909
-							echo "<div id='{$s_key}_{$metaterm['args']['id']}_section_group' class='redux-group-tab{$section['class']} redux_metaterm_panel$hide'>";
910
-
911
-							if ( ! empty( $section['title'] ) ) {
912
-								echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
913
-							}
914
-
915
-							if ( ! empty( $section['desc'] ) ) {
916
-								echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
917
-							}
918
-
919
-							echo '<table class="form-table"><tbody>';
920
-
921
-							foreach ( $section['fields'] as $field ) {
922
-								if ( ! $this->check_edit_visibility( $field, false ) ) {
923
-									continue;
924
-								}
925
-
926
-								if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
927
-									continue;
928
-								}
929
-
930
-								$field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
931
-
932
-								$is_hidden = false;
933
-								$ex_style  = '';
934
-								if ( isset( $field['hidden'] ) && $field['hidden'] ) {
935
-									$is_hidden = true;
936
-									$ex_style  = ' style="border-bottom: none;"';
937
-								}
938
-
939
-								// phpcs:ignore WordPress.Security.EscapeOutput
940
-								echo '<tr valign="top"' . $ex_style . '>';
941
-
942
-								$th = $this->parent->render_class->get_header_html( $field );
943
-
944
-								if ( $is_hidden ) {
945
-									$str_pos = strpos( $th, 'redux_field_th' );
946
-
947
-									if ( $str_pos > - 1 ) {
948
-										$th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
949
-									}
950
-								}
951
-
952
-								if ( $sidebar ) {
953
-									if ( ! ( isset( $metaterm['args']['sections'] ) && count( $metaterm['args']['sections'] ) === 1 && isset( $metaterm['args']['sections'][0]['fields'] ) && count( $metaterm['args']['sections'][0]['fields'] ) === 1 ) && isset( $field['title'] ) ) {
954
-										echo '<th scope="row">';
955
-										if ( ! empty( $th ) ) {
956
-											echo $th; // phpcs:ignore WordPress.Security.EscapeOutput
957
-										}
958
-										echo '</th>';
959
-										echo '<td>';
960
-									}
961
-								} else {
962
-									echo '<td>' . $th; // phpcs:ignore WordPress.Security.EscapeOutput
963
-								}
964
-
965
-								if ( 'section' === $field['type'] && true === $field['indent'] ) {
966
-									$field['class']  = $field['class'] ?? '';
967
-									$field['class'] .= 'redux-section-indent-start';
968
-								}
969
-
970
-								if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
971
-									$this->meta[ $this->tag_id ][ $field['id'] ] = '';
972
-								}
973
-
974
-								$this->parent->render_class->field_input( $field, $this->meta[ $this->tag_id ][ $field['id'] ], true );
975
-								echo '</td></tr>';
976
-							}
977
-							echo '</tbody></table>';
978
-							echo '</div>';
979
-						}
980
-					}
981
-					?>
889
+                    foreach ( $sections as $s_key => $section ) {
890
+                        if ( ! $this->check_edit_visibility( $section ) ) {
891
+                            continue;
892
+                        }
893
+
894
+                        if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
895
+                            continue;
896
+                        }
897
+
898
+                        if ( ! empty( $section['fields'] ) ) {
899
+                            if ( isset( $section['args'] ) ) {
900
+                                $this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
901
+                            } elseif ( $this->parent->args !== $this->orig_args ) {
902
+                                $this->parent->args = $this->orig_args;
903
+                            }
904
+
905
+                            $hide             = $sidebar ? '' : ' display-group';
906
+                            $section['class'] = isset( $section['class'] ) ? " {$section['class']}" : '';
907
+
908
+                            // phpcs:ignore WordPress.Security.EscapeOutput
909
+                            echo "<div id='{$s_key}_{$metaterm['args']['id']}_section_group' class='redux-group-tab{$section['class']} redux_metaterm_panel$hide'>";
910
+
911
+                            if ( ! empty( $section['title'] ) ) {
912
+                                echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
913
+                            }
914
+
915
+                            if ( ! empty( $section['desc'] ) ) {
916
+                                echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
917
+                            }
918
+
919
+                            echo '<table class="form-table"><tbody>';
920
+
921
+                            foreach ( $section['fields'] as $field ) {
922
+                                if ( ! $this->check_edit_visibility( $field, false ) ) {
923
+                                    continue;
924
+                                }
925
+
926
+                                if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
927
+                                    continue;
928
+                                }
929
+
930
+                                $field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
931
+
932
+                                $is_hidden = false;
933
+                                $ex_style  = '';
934
+                                if ( isset( $field['hidden'] ) && $field['hidden'] ) {
935
+                                    $is_hidden = true;
936
+                                    $ex_style  = ' style="border-bottom: none;"';
937
+                                }
938
+
939
+                                // phpcs:ignore WordPress.Security.EscapeOutput
940
+                                echo '<tr valign="top"' . $ex_style . '>';
941
+
942
+                                $th = $this->parent->render_class->get_header_html( $field );
943
+
944
+                                if ( $is_hidden ) {
945
+                                    $str_pos = strpos( $th, 'redux_field_th' );
946
+
947
+                                    if ( $str_pos > - 1 ) {
948
+                                        $th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
949
+                                    }
950
+                                }
951
+
952
+                                if ( $sidebar ) {
953
+                                    if ( ! ( isset( $metaterm['args']['sections'] ) && count( $metaterm['args']['sections'] ) === 1 && isset( $metaterm['args']['sections'][0]['fields'] ) && count( $metaterm['args']['sections'][0]['fields'] ) === 1 ) && isset( $field['title'] ) ) {
954
+                                        echo '<th scope="row">';
955
+                                        if ( ! empty( $th ) ) {
956
+                                            echo $th; // phpcs:ignore WordPress.Security.EscapeOutput
957
+                                        }
958
+                                        echo '</th>';
959
+                                        echo '<td>';
960
+                                    }
961
+                                } else {
962
+                                    echo '<td>' . $th; // phpcs:ignore WordPress.Security.EscapeOutput
963
+                                }
964
+
965
+                                if ( 'section' === $field['type'] && true === $field['indent'] ) {
966
+                                    $field['class']  = $field['class'] ?? '';
967
+                                    $field['class'] .= 'redux-section-indent-start';
968
+                                }
969
+
970
+                                if ( ! isset( $this->meta[ $this->tag_id ][ $field['id'] ] ) ) {
971
+                                    $this->meta[ $this->tag_id ][ $field['id'] ] = '';
972
+                                }
973
+
974
+                                $this->parent->render_class->field_input( $field, $this->meta[ $this->tag_id ][ $field['id'] ], true );
975
+                                echo '</td></tr>';
976
+                            }
977
+                            echo '</tbody></table>';
978
+                            echo '</div>';
979
+                        }
980
+                    }
981
+                    ?>
982 982
 				</div>
983 983
 				<div class="clear"></div>
984 984
 			</div>
985 985
 			<?php
986
-			echo '</div>';
987
-		}
988
-
989
-		/**
990
-		 * Save meta terms
991
-		 * Runs when a post is saved and does an action which to write panel save scripts can hook into.
992
-		 *
993
-		 * @access public
994
-		 *
995
-		 * @param mixed $tag_id Yag ID.
996
-		 *
997
-		 * @return bool
998
-		 */
999
-		public function meta_terms_save( $tag_id ): bool {
1000
-
1001
-			// Check if our nonce is set.
1002
-			if ( ! isset( $_POST['redux_taxonomy_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
1003
-				return false;
1004
-			}
1005
-
1006
-			// Verify that the nonce is valid.
1007
-			// Validate fields (if needed).
1008
-			if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_taxonomy_meta_nonce'] ) ), 'redux_taxonomy_meta_nonce' ) ) {
1009
-				return $tag_id;
1010
-			}
1011
-
1012
-			$meta = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $tag_id ) );
1013
-
1014
-			$to_save    = array();
1015
-			$to_compare = array();
1016
-			$to_delete  = array();
1017
-			$dont_save  = true;
1018
-
1019
-			$field_args = Redux_Taxonomy::$fields[ $this->parent->args['opt_name'] ];
1020
-
1021
-			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1022
-
1023
-				// Do not save anything the user doesn't have permissions for.
1024
-				if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1025
-					foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1026
-
1027
-						// Do not save anything the user doesn't have permissions for.
1028
-						if ( isset( $field_args[ $key ] ) ) {
1029
-							if ( user_can( get_current_user_id(), $pv ) ) {
1030
-								break;
1031
-							}
1032
-						}
1033
-					}
1034
-				}
1035
-
1036
-				// Have to remove the escaping for array comparison.
1037
-				if ( is_array( $value ) ) {
1038
-					foreach ( $value as $k => $v ) {
1039
-						if ( ! is_array( $v ) ) {
1040
-							$value[ $k ] = stripslashes( $v );
1041
-						}
1042
-					}
1043
-				}
1044
-
1045
-				$save = true;
1046
-
1047
-				// parent_options.
1048
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1049
-					$save = false;
1050
-				}
1051
-
1052
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1053
-					$save = false;
1054
-				}
1055
-
1056
-				if ( $save ) {
1057
-					$to_save[ $key ]    = $value;
1058
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1059
-				} else {
1060
-					$to_delete[ $key ] = $value;
1061
-				}
1062
-			}
1063
-
1064
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1065
-			$to_save = apply_filters( 'redux/taxonomy/save/before_validate', $to_save, $to_compare, $this->sections );
1066
-
1067
-			$validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1068
-
1069
-			// Validate fields (if needed).
1070
-			foreach ( $to_save as $key => $value ) {
1071
-				if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1072
-					if ( isset( $meta[ $key ] ) && $validate[ $key ] === $meta[ $key ] ) {
1073
-						unset( $to_save[ $key ] );
1074
-					} else {
1075
-						$to_save[ $key ] = $validate[ $key ];
1076
-					}
1077
-				}
1078
-			}
1079
-
1080
-			if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1081
-				$this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1082
-
1083
-				if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1084
-					$this->parent->transients['notices']['errors'] = $this->parent->errors;
1085
-					$update_transients                             = true;
1086
-				}
1087
-
1088
-				if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1089
-					$this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1090
-					$update_transients                               = true;
1091
-				}
1092
-
1093
-				if ( isset( $update_transients ) ) {
1094
-					$this->parent->transients['notices']['override'] = 1;
1095
-					set_transient( $this->parent->args['opt_name'] . '-transients-taxonomy', $this->parent->transients );
1096
-				}
1097
-			}
1098
-
1099
-			$post_tax = isset( $_POST['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ) : '';
1100
-
1101
-			$check = $this->taxonomy_type_fields[ $post_tax ] ?? array();
1102
-
1103
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1104
-			$to_save = apply_filters( 'redux/taxonomy/save', $to_save, $to_compare, $this->sections );
1105
-
1106
-			foreach ( $to_save as $key => $value ) {
1107
-				$prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1108
-
1109
-				if ( isset( $check[ $key ] ) ) {
1110
-					unset( $check[ $key ] );
1111
-				}
1112
-
1113
-				update_term_meta( $tag_id, $key, $value, $prev_value );
1114
-			}
1115
-
1116
-			foreach ( $to_delete as $key => $value ) {
1117
-				if ( isset( $check[ $key ] ) ) {
1118
-					unset( $check[ $key ] );
1119
-				}
1120
-
1121
-				$prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1122
-				delete_term_meta( $tag_id, $key, $prev_value );
1123
-			}
1124
-
1125
-			if ( ! empty( $check ) ) {
1126
-				foreach ( $check as $key => $value ) {
1127
-					delete_term_meta( $tag_id, $key );
1128
-				}
1129
-			}
1130
-
1131
-			return true;
1132
-		}
1133
-
1134
-		/**
1135
-		 * Show any stored error messages.
1136
-		 *
1137
-		 * @access public
1138
-		 * @return void
1139
-		 */
1140
-		public function meta_terms_show_errors() {
1141
-			if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1142
-				echo '<div id="redux_taxonomy_errors" class="error fade">';
1143
-				echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1144
-				echo '</div>';
1145
-			}
1146
-
1147
-			if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1148
-				echo '<div id="redux_taxonomy_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1149
-				echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1150
-				echo '</div>';
1151
-			}
1152
-		}
1153
-	}
986
+            echo '</div>';
987
+        }
988
+
989
+        /**
990
+         * Save meta terms
991
+         * Runs when a post is saved and does an action which to write panel save scripts can hook into.
992
+         *
993
+         * @access public
994
+         *
995
+         * @param mixed $tag_id Yag ID.
996
+         *
997
+         * @return bool
998
+         */
999
+        public function meta_terms_save( $tag_id ): bool {
1000
+
1001
+            // Check if our nonce is set.
1002
+            if ( ! isset( $_POST['redux_taxonomy_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
1003
+                return false;
1004
+            }
1005
+
1006
+            // Verify that the nonce is valid.
1007
+            // Validate fields (if needed).
1008
+            if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_taxonomy_meta_nonce'] ) ), 'redux_taxonomy_meta_nonce' ) ) {
1009
+                return $tag_id;
1010
+            }
1011
+
1012
+            $meta = Redux_Taxonomy::get_term_meta( array( 'taxonomy' => $tag_id ) );
1013
+
1014
+            $to_save    = array();
1015
+            $to_compare = array();
1016
+            $to_delete  = array();
1017
+            $dont_save  = true;
1018
+
1019
+            $field_args = Redux_Taxonomy::$fields[ $this->parent->args['opt_name'] ];
1020
+
1021
+            foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1022
+
1023
+                // Do not save anything the user doesn't have permissions for.
1024
+                if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1025
+                    foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1026
+
1027
+                        // Do not save anything the user doesn't have permissions for.
1028
+                        if ( isset( $field_args[ $key ] ) ) {
1029
+                            if ( user_can( get_current_user_id(), $pv ) ) {
1030
+                                break;
1031
+                            }
1032
+                        }
1033
+                    }
1034
+                }
1035
+
1036
+                // Have to remove the escaping for array comparison.
1037
+                if ( is_array( $value ) ) {
1038
+                    foreach ( $value as $k => $v ) {
1039
+                        if ( ! is_array( $v ) ) {
1040
+                            $value[ $k ] = stripslashes( $v );
1041
+                        }
1042
+                    }
1043
+                }
1044
+
1045
+                $save = true;
1046
+
1047
+                // parent_options.
1048
+                if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1049
+                    $save = false;
1050
+                }
1051
+
1052
+                if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1053
+                    $save = false;
1054
+                }
1055
+
1056
+                if ( $save ) {
1057
+                    $to_save[ $key ]    = $value;
1058
+                    $to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1059
+                } else {
1060
+                    $to_delete[ $key ] = $value;
1061
+                }
1062
+            }
1063
+
1064
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1065
+            $to_save = apply_filters( 'redux/taxonomy/save/before_validate', $to_save, $to_compare, $this->sections );
1066
+
1067
+            $validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1068
+
1069
+            // Validate fields (if needed).
1070
+            foreach ( $to_save as $key => $value ) {
1071
+                if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1072
+                    if ( isset( $meta[ $key ] ) && $validate[ $key ] === $meta[ $key ] ) {
1073
+                        unset( $to_save[ $key ] );
1074
+                    } else {
1075
+                        $to_save[ $key ] = $validate[ $key ];
1076
+                    }
1077
+                }
1078
+            }
1079
+
1080
+            if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1081
+                $this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1082
+
1083
+                if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1084
+                    $this->parent->transients['notices']['errors'] = $this->parent->errors;
1085
+                    $update_transients                             = true;
1086
+                }
1087
+
1088
+                if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1089
+                    $this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1090
+                    $update_transients                               = true;
1091
+                }
1092
+
1093
+                if ( isset( $update_transients ) ) {
1094
+                    $this->parent->transients['notices']['override'] = 1;
1095
+                    set_transient( $this->parent->args['opt_name'] . '-transients-taxonomy', $this->parent->transients );
1096
+                }
1097
+            }
1098
+
1099
+            $post_tax = isset( $_POST['taxonomy'] ) ? sanitize_text_field( wp_unslash( $_POST['taxonomy'] ) ) : '';
1100
+
1101
+            $check = $this->taxonomy_type_fields[ $post_tax ] ?? array();
1102
+
1103
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1104
+            $to_save = apply_filters( 'redux/taxonomy/save', $to_save, $to_compare, $this->sections );
1105
+
1106
+            foreach ( $to_save as $key => $value ) {
1107
+                $prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1108
+
1109
+                if ( isset( $check[ $key ] ) ) {
1110
+                    unset( $check[ $key ] );
1111
+                }
1112
+
1113
+                update_term_meta( $tag_id, $key, $value, $prev_value );
1114
+            }
1115
+
1116
+            foreach ( $to_delete as $key => $value ) {
1117
+                if ( isset( $check[ $key ] ) ) {
1118
+                    unset( $check[ $key ] );
1119
+                }
1120
+
1121
+                $prev_value = $this->meta[ $tag_id ][ $key ] ?? '';
1122
+                delete_term_meta( $tag_id, $key, $prev_value );
1123
+            }
1124
+
1125
+            if ( ! empty( $check ) ) {
1126
+                foreach ( $check as $key => $value ) {
1127
+                    delete_term_meta( $tag_id, $key );
1128
+                }
1129
+            }
1130
+
1131
+            return true;
1132
+        }
1133
+
1134
+        /**
1135
+         * Show any stored error messages.
1136
+         *
1137
+         * @access public
1138
+         * @return void
1139
+         */
1140
+        public function meta_terms_show_errors() {
1141
+            if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1142
+                echo '<div id="redux_taxonomy_errors" class="error fade">';
1143
+                echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1144
+                echo '</div>';
1145
+            }
1146
+
1147
+            if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1148
+                echo '<div id="redux_taxonomy_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1149
+                echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1150
+                echo '</div>';
1151
+            }
1152
+        }
1153
+    }
1154 1154
 }
1155 1155
 
1156 1156
 class_alias( 'Redux_Extension_Taxonomy', 'ReduxFramework_extension_taxonomy' );
Please login to merge, or discard this patch.
redux-core/inc/extensions/metaboxes/class-redux-extension-metaboxes.php 2 patches
Spacing   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
 								$box['page_template'] = array( $box['page_template'] );
317 317
 							}
318 318
 
319
-							$this->wp_links[ $box_id ]['page_template'] = isset( $this->wp_links[ $box_id ]['page_template'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['page_template'], $box['page_template'] ) : $box['page_template'];
319
+							$this->wp_links[$box_id]['page_template'] = isset( $this->wp_links[$box_id]['page_template'] ) ? wp_parse_args( $this->wp_links[$box_id]['page_template'], $box['page_template'] ) : $box['page_template'];
320 320
 						}
321 321
 
322 322
 						if ( isset( $box['post_format'] ) && ( in_array( $this->post_type, $this->post_types, true ) || '' === $this->post_type || false === $this->post_type ) ) {
@@ -324,10 +324,10 @@  discard block
 block discarded – undo
324 324
 								$box['post_format'] = array( $box['post_format'] );
325 325
 							}
326 326
 
327
-							$this->wp_links[ $box_id ]['post_format'] = isset( $this->wp_links[ $box_id ]['post_format'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['post_format'], $box['post_format'] ) : $box['post_format'];
327
+							$this->wp_links[$box_id]['post_format'] = isset( $this->wp_links[$box_id]['post_format'] ) ? wp_parse_args( $this->wp_links[$box_id]['post_format'], $box['post_format'] ) : $box['post_format'];
328 328
 						}
329 329
 
330
-						$this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
330
+						$this->meta[$this->post_id] = $this->get_meta( $this->post_id );
331 331
 
332 332
 						foreach ( $box['sections'] as $sk => $section ) {
333 333
 							if ( ! empty( $section['fields'] ) ) {
@@ -335,7 +335,7 @@  discard block
 block discarded – undo
335 335
 									if ( ! isset( $field['class'] ) ) {
336 336
 										$field['class'] = '';
337 337
 
338
-										$this->boxes[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
338
+										$this->boxes[$bk]['sections'][$sk]['fields'][$fk] = $field;
339 339
 									}
340 340
 
341 341
 									if ( $add_field || ( ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) || ( ! is_admin() ) ) ) {
@@ -344,43 +344,43 @@  discard block
 block discarded – undo
344 344
 										}
345 345
 
346 346
 										if ( isset( $field['default'] ) ) {
347
-											$this->options_defaults[ $field['id'] ] = $field['default'];
347
+											$this->options_defaults[$field['id']] = $field['default'];
348 348
 										} else {
349
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
349
+											$this->options_defaults[$field['id']] = $this->field_default( $field );
350 350
 										}
351 351
 
352 352
 										foreach ( $box['post_types'] as $type ) {
353
-											$this->post_type_fields[ $type ][ $field['id'] ] = 1;
353
+											$this->post_type_fields[$type][$field['id']] = 1;
354 354
 
355 355
 											if ( 'repeater' === $field['type'] ) {
356 356
 												foreach ( $field['fields'] as $val ) {
357
-													$this->post_type_fields[ $type ][ $val['id'] ] = 1;
357
+													$this->post_type_fields[$type][$val['id']] = 1;
358 358
 												}
359 359
 											}
360 360
 										}
361 361
 
362 362
 										if ( ! empty( $field['output'] ) ) {
363
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
363
+											$this->output[$field['id']] = isset( $this->output[$field['id']] ) ? array_merge( $field['output'], $this->output[$field['id']] ) : $field['output'];
364 364
 										}
365 365
 
366 366
 										// Detect what field types are being used.
367
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
368
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
367
+										if ( ! isset( $this->parent->fields[$field['type']][$field['id']] ) ) {
368
+											$this->parent->fields[$field['type']][$field['id']] = 1;
369 369
 										} else {
370
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
370
+											$this->parent->fields[$field['type']] = array( $field['id'] => 1 );
371 371
 										}
372 372
 
373
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
374
-											$this->to_replace[ $field['id'] ] = $field;
373
+										if ( isset( $this->options_defaults[$field['id']] ) ) {
374
+											$this->to_replace[$field['id']] = $field;
375 375
 										}
376 376
 									}
377 377
 
378
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
379
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
378
+									if ( ! isset( $this->parent->options[$field['id']] ) ) {
379
+										$this->parent->sections[( count( $this->parent->sections ) - 1 )]['fields'][] = $field;
380 380
 									}
381 381
 
382
-									if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
383
-										$this->meta[ $this->post_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
382
+									if ( ! isset( $this->meta[$this->post_id][$field['id']] ) ) {
383
+										$this->meta[$this->post_id][$field['id']] = $this->options_defaults[$field['id']];
384 384
 									}
385 385
 
386 386
 									// Only override if it exists, and it's not the default.
@@ -420,8 +420,8 @@  discard block
 block discarded – undo
420 420
 		 * @return mixed
421 421
 		 */
422 422
 		public function replace_field( array $field ) {
423
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
424
-				$field = $this->to_replace[ $field['id'] ];
423
+			if ( isset( $this->to_replace[$field['id']] ) ) {
424
+				$field = $this->to_replace[$field['id']];
425 425
 			}
426 426
 
427 427
 			return $field;
@@ -435,7 +435,7 @@  discard block
 block discarded – undo
435 435
 		 * @return array
436 436
 		 */
437 437
 		public function override_can_output_css( array $field ): array {
438
-			if ( isset( $this->output[ $field['id'] ] ) ) {
438
+			if ( isset( $this->output[$field['id']] ) ) {
439 439
 				$field['force_output'] = true;
440 440
 			}
441 441
 
@@ -450,8 +450,8 @@  discard block
 block discarded – undo
450 450
 		 * @return array
451 451
 		 */
452 452
 		public function output_css( array $field ): array {
453
-			if ( isset( $this->output[ $field['id'] ] ) ) {
454
-				$field['output'] = $this->output[ $field['id'] ];
453
+			if ( isset( $this->output[$field['id']] ) ) {
454
+				$field['output'] = $this->output[$field['id']];
455 455
 			}
456 456
 
457 457
 			return $field;
@@ -472,13 +472,13 @@  discard block
 block discarded – undo
472 472
 			$data = wp_parse_args( $meta, $this->options_defaults );
473 473
 
474 474
 			foreach ( $data as $key => $value ) {
475
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
476
-					$data[ $key ] = $meta[ $key ];
475
+				if ( isset( $meta[$key] ) && '' !== $meta[$key] ) {
476
+					$data[$key] = $meta[$key];
477 477
 					continue;
478 478
 				}
479 479
 
480
-				if ( isset( $options[ $key ] ) ) {
481
-					$data[ $key ] = $options[ $key ];
480
+				if ( isset( $options[$key] ) ) {
481
+					$data[$key] = $options[$key];
482 482
 				}
483 483
 			}
484 484
 
@@ -504,9 +504,9 @@  discard block
 block discarded – undo
504 504
 				$the_post = $post;
505 505
 			}
506 506
 
507
-			if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
508
-				$GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
509
-				unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
507
+			if ( isset( $GLOBALS[$this->parent->args['global_variable'] . '-loop'] ) ) {
508
+				$GLOBALS[$this->parent->args['global_variable']] = $GLOBALS[$this->parent->args['global_variable'] . '-loop'];
509
+				unset( $GLOBALS[$this->parent->args['global_variable'] . '-loop'] );
510 510
 			}
511 511
 
512 512
 			// Override these values if they differ from the admin panel defaults.  ;) .
@@ -517,8 +517,8 @@  discard block
 block discarded – undo
517 517
 				}
518 518
 
519 519
 				// Backup the args.
520
-				$GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] = $GLOBALS[ $this->parent->args['global_variable'] ];
521
-				$GLOBALS[ $this->parent->args['global_variable'] ]           = wp_parse_args( $meta, $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
520
+				$GLOBALS[$this->parent->args['global_variable'] . '-loop'] = $GLOBALS[$this->parent->args['global_variable']];
521
+				$GLOBALS[$this->parent->args['global_variable']]           = wp_parse_args( $meta, $GLOBALS[$this->parent->args['global_variable'] . '-loop'] );
522 522
 			}
523 523
 		}
524 524
 
@@ -526,10 +526,10 @@  discard block
 block discarded – undo
526 526
 		 * Loop end.
527 527
 		 */
528 528
 		public function loop_end() {
529
-			if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
530
-				$GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
529
+			if ( isset( $GLOBALS[$this->parent->args['global_variable'] . '-loop'] ) ) {
530
+				$GLOBALS[$this->parent->args['global_variable']] = $GLOBALS[$this->parent->args['global_variable'] . '-loop'];
531 531
 
532
-				unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
532
+				unset( $GLOBALS[$this->parent->args['global_variable'] . '-loop'] );
533 533
 			}
534 534
 		}
535 535
 
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
 				if ( ! empty( $box['post_types'] ) ) {
555 555
 					if ( ! is_array( $box['post_types'] ) ) {
556 556
 						$box['post_types']                 = array( $box['post_types'] );
557
-						$this->boxes[ $key ]['post_types'] = $box['post_types'];
557
+						$this->boxes[$key]['post_types'] = $box['post_types'];
558 558
 					}
559 559
 				}
560 560
 			}
@@ -644,7 +644,7 @@  discard block
 block discarded – undo
644 644
 			}
645 645
 
646 646
 			if ( isset( $_GET['post'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification
647
-				$post = (int) sanitize_text_field( wp_unslash( $_GET['post'] ) );  // phpcs:ignore WordPress.Security.NonceVerification
647
+				$post = ( int ) sanitize_text_field( wp_unslash( $_GET['post'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
648 648
 
649 649
 				if ( ! empty( $post ) ) {
650 650
 					return $post;
@@ -665,7 +665,7 @@  discard block
 block discarded – undo
665 665
 
666 666
 			$post_id = url_to_postid( $url );
667 667
 
668
-			if ( isset( $post_id ) && '' !== (string) $post_id && 0 !== $post_id ) {
668
+			if ( isset( $post_id ) && '' !== ( string ) $post_id && 0 !== $post_id ) {
669 669
 				return $post_id;
670 670
 			}
671 671
 
@@ -721,9 +721,9 @@  discard block
 block discarded – undo
721 721
 					}
722 722
 
723 723
 					foreach ( $GLOBALS['wp_post_types'] as $key => $value ) {
724
-						if ( ! empty( $_GET[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
724
+						if ( ! empty( $_GET[$key] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
725 725
 							$args = array(
726
-								'name'      => sanitize_text_field( wp_unslash( $_GET[ $key ] ) ), // phpcs:ignore WordPress.Security.NonceVerification
726
+								'name'      => sanitize_text_field( wp_unslash( $_GET[$key] ) ), // phpcs:ignore WordPress.Security.NonceVerification
727 727
 								'post_type' => $key,
728 728
 								'showposts' => 1,
729 729
 							);
@@ -809,7 +809,7 @@  discard block
 block discarded – undo
809 809
 
810 810
 					foreach ( $query_vars as $key => $value ) {
811 811
 						if ( in_array( $key, $wp->public_query_vars, true ) ) {
812
-							$query[ $key ] = $value;
812
+							$query[$key] = $value;
813 813
 						}
814 814
 					}
815 815
 
@@ -843,35 +843,35 @@  discard block
 block discarded – undo
843 843
 					// Taken from class-wp.php.
844 844
 					foreach ( $GLOBALS['wp_post_types'] as $post_type => $t ) {
845 845
 						if ( isset( $t->query_var ) ) {
846
-							$post_type_query_vars[ $t->query_var ] = $post_type;
846
+							$post_type_query_vars[$t->query_var] = $post_type;
847 847
 						}
848 848
 					}
849 849
 
850 850
 					foreach ( $wp->public_query_vars as $wpvar ) {
851
-						if ( isset( $wp->extra_query_vars[ $wpvar ] ) ) {
852
-							$query[ $wpvar ] = $wp->extra_query_vars[ $wpvar ];
853
-						} elseif ( isset( $_POST[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
854
-							$query[ $wpvar ] = sanitize_text_field( wp_unslash( $_POST[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
855
-						} elseif ( isset( $_GET[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
856
-							$query[ $wpvar ] = sanitize_text_field( wp_unslash( $_GET[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
857
-						} elseif ( isset( $query_vars[ $wpvar ] ) ) {
858
-							$query[ $wpvar ] = $query_vars[ $wpvar ];
851
+						if ( isset( $wp->extra_query_vars[$wpvar] ) ) {
852
+							$query[$wpvar] = $wp->extra_query_vars[$wpvar];
853
+						} elseif ( isset( $_POST[$wpvar] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
854
+							$query[$wpvar] = sanitize_text_field( wp_unslash( $_POST[$wpvar] ) ); // phpcs:ignore WordPress.Security.NonceVerification
855
+						} elseif ( isset( $_GET[$wpvar] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
856
+							$query[$wpvar] = sanitize_text_field( wp_unslash( $_GET[$wpvar] ) ); // phpcs:ignore WordPress.Security.NonceVerification
857
+						} elseif ( isset( $query_vars[$wpvar] ) ) {
858
+							$query[$wpvar] = $query_vars[$wpvar];
859 859
 						}
860 860
 
861
-						if ( ! empty( $query[ $wpvar ] ) ) {
862
-							if ( ! is_array( $query[ $wpvar ] ) ) {
863
-								$query[ $wpvar ] = (string) $query[ $wpvar ];
861
+						if ( ! empty( $query[$wpvar] ) ) {
862
+							if ( ! is_array( $query[$wpvar] ) ) {
863
+								$query[$wpvar] = ( string ) $query[$wpvar];
864 864
 							} else {
865
-								foreach ( $query[ $wpvar ] as $vkey => $v ) {
865
+								foreach ( $query[$wpvar] as $vkey => $v ) {
866 866
 									if ( ! is_object( $v ) ) {
867
-										$query[ $wpvar ][ $vkey ] = (string) $v;
867
+										$query[$wpvar][$vkey] = ( string ) $v;
868 868
 									}
869 869
 								}
870 870
 							}
871 871
 
872
-							if ( isset( $post_type_query_vars[ $wpvar ] ) ) {
873
-								$query['post_type'] = $post_type_query_vars[ $wpvar ];
874
-								$query['name']      = $query[ $wpvar ];
872
+							if ( isset( $post_type_query_vars[$wpvar] ) ) {
873
+								$query['post_type'] = $post_type_query_vars[$wpvar];
874
+								$query['name']      = $query[$wpvar];
875 875
 							}
876 876
 						}
877 877
 					}
@@ -930,7 +930,7 @@  discard block
 block discarded – undo
930 930
 							} else {
931 931
 								$section['id'] = sanitize_text_field( $section['title'] );
932 932
 							}
933
-							$this->boxes[ $key ]['sections'][ $sk ] = $section;
933
+							$this->boxes[$key]['sections'][$sk] = $section;
934 934
 						}
935 935
 						if ( isset( $section['fields'] ) ) {
936 936
 							foreach ( $section['fields'] as $k => $field ) {
@@ -940,15 +940,15 @@  discard block
 block discarded – undo
940 940
 								}
941 941
 
942 942
 								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
943
-									$this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
944
-									unset( $this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
943
+									$this->boxes[$key]['sections'][$sk]['fields'][$k]['args'] = $field['options'];
944
+									unset( $this->boxes[$key]['sections'][$sk]['fields'][$k]['options'] );
945 945
 								}
946 946
 
947 947
 								if ( 'section' === $field['type'] && isset( $field['indent'] ) && ( true === $field['indent'] || 'true' === $field['indent'] ) ) {
948 948
 									$field['class']  = $field['class'] ?? '';
949 949
 									$field['class'] .= 'redux-section-indent-start';
950 950
 
951
-									$this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
951
+									$this->boxes[$key]['sections'][$sk]['fields'][$k] = $field;
952 952
 								}
953 953
 
954 954
 								if ( ! isset( $this->parent->options_defaults_class ) ) {
@@ -970,8 +970,8 @@  discard block
 block discarded – undo
970 970
 				}
971 971
 			}
972 972
 
973
-			if ( empty( $this->meta[ $this->post_id ] ) ) {
974
-				$this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
973
+			if ( empty( $this->meta[$this->post_id] ) ) {
974
+				$this->meta[$this->post_id] = $this->get_meta( $this->post_id );
975 975
 			}
976 976
 		}
977 977
 
@@ -1085,8 +1085,8 @@  discard block
 block discarded – undo
1085 1085
 
1086 1086
 			$this->options = $this->parent->options;
1087 1087
 
1088
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
1089
-				return $this->parent->options[ $field_id['id'] ];
1088
+			if ( isset( $this->parent->options[$field_id['id']] ) && isset( $this->parent->options_defaults[$field_id['id']] ) && $this->parent->options[$field_id['id']] !== $this->parent->options_defaults[$field_id['id']] ) {
1089
+				return $this->parent->options[$field_id['id']];
1090 1090
 			} else {
1091 1091
 				if ( empty( $this->options_defaults ) ) {
1092 1092
 					$this->default_values(); // fill cache.
@@ -1094,11 +1094,11 @@  discard block
 block discarded – undo
1094 1094
 
1095 1095
 				$data = '';
1096 1096
 				if ( ! empty( $this->options_defaults ) ) {
1097
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
1097
+					$data = $this->options_defaults[$field_id['id']] ?? '';
1098 1098
 				}
1099 1099
 
1100
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
1101
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
1100
+				if ( empty( $data ) && isset( $this->parent->options_defaults[$field_id['id']] ) ) {
1101
+					$data = $this->parent->options_defaults[$field_id['id']] ?? '';
1102 1102
 				}
1103 1103
 
1104 1104
 				return $data;
@@ -1113,8 +1113,8 @@  discard block
 block discarded – undo
1113 1113
 		 * @return array
1114 1114
 		 */
1115 1115
 		private function get_meta( $id ): array {
1116
-			if ( ! isset( $this->meta[ $id ] ) ) {
1117
-				$this->meta[ $id ] = array();
1116
+			if ( ! isset( $this->meta[$id] ) ) {
1117
+				$this->meta[$id] = array();
1118 1118
 				$o_data            = get_post_meta( $id );
1119 1119
 
1120 1120
 				// phpcs:ignore WordPress.NamingConventions.ValidHookName
@@ -1123,30 +1123,30 @@  discard block
 block discarded – undo
1123 1123
 				if ( ! empty( $o_data ) ) {
1124 1124
 					foreach ( $o_data as $key => $value ) {
1125 1125
 						if ( 1 === count( $value ) ) {
1126
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
1126
+							$this->meta[$id][$key] = maybe_unserialize( $value[0] );
1127 1127
 						} else {
1128 1128
 							$new_value = array_map( 'maybe_unserialize', $value );
1129 1129
 
1130
-							$this->meta[ $id ][ $key ] = $new_value[0];
1130
+							$this->meta[$id][$key] = $new_value[0];
1131 1131
 						}
1132 1132
 					}
1133 1133
 				}
1134 1134
 
1135
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
1136
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1135
+				if ( isset( $this->meta[$id][$this->parent->args['opt_name']] ) ) {
1136
+					$data = maybe_unserialize( $this->meta[$id][$this->parent->args['opt_name']] );
1137 1137
 
1138 1138
 					foreach ( $data as $key => $value ) {
1139
-						$this->meta[ $id ][ $key ] = $value;
1139
+						$this->meta[$id][$key] = $value;
1140 1140
 						update_post_meta( $id, $key, $value );
1141 1141
 					}
1142 1142
 
1143
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1143
+					unset( $this->meta[$id][$this->parent->args['opt_name']] );
1144 1144
 
1145 1145
 					delete_post_meta( $id, $this->parent->args['opt_name'] );
1146 1146
 				}
1147 1147
 			}
1148 1148
 
1149
-			return $this->meta[ $id ];
1149
+			return $this->meta[$id];
1150 1150
 		}
1151 1151
 
1152 1152
 		/**
@@ -1162,29 +1162,29 @@  discard block
 block discarded – undo
1162 1162
 
1163 1163
 			// Override these values if they differ from the admin panel defaults.  ;) .
1164 1164
 			if ( isset( $the_post->post_type ) && in_array( $the_post->post_type, $this->post_types, true ) ) {
1165
-				if ( isset( $this->post_type_values[ $the_post->post_type ] ) ) {
1166
-					$meta = $this->post_type_fields[ $the_post->post_type ];
1165
+				if ( isset( $this->post_type_values[$the_post->post_type] ) ) {
1166
+					$meta = $this->post_type_fields[$the_post->post_type];
1167 1167
 				} else {
1168 1168
 					$defaults = array();
1169
-					if ( ! empty( $this->post_type_fields[ $the_post->post_type ] ) ) {
1170
-						foreach ( $this->post_type_fields[ $the_post->post_type ] as $key => $null ) {
1171
-							if ( isset( $this->options_defaults[ $key ] ) ) {
1172
-								$defaults[ $key ] = $this->options_defaults[ $key ];
1169
+					if ( ! empty( $this->post_type_fields[$the_post->post_type] ) ) {
1170
+						foreach ( $this->post_type_fields[$the_post->post_type] as $key => $null ) {
1171
+							if ( isset( $this->options_defaults[$key] ) ) {
1172
+								$defaults[$key] = $this->options_defaults[$key];
1173 1173
 							}
1174 1174
 						}
1175 1175
 					}
1176 1176
 
1177 1177
 					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
1178 1178
 
1179
-					$this->post_type_fields[ $the_post->post_type ] = $meta;
1179
+					$this->post_type_fields[$the_post->post_type] = $meta;
1180 1180
 				}
1181 1181
 
1182 1182
 				if ( ! empty( $meta_key ) ) {
1183
-					if ( ! isset( $meta[ $meta_key ] ) ) {
1184
-						$meta[ $meta_key ] = $def_val;
1183
+					if ( ! isset( $meta[$meta_key] ) ) {
1184
+						$meta[$meta_key] = $def_val;
1185 1185
 					}
1186 1186
 
1187
-					return $meta[ $meta_key ];
1187
+					return $meta[$meta_key];
1188 1188
 				} else {
1189 1189
 					return $meta;
1190 1190
 				}
@@ -1335,11 +1335,11 @@  discard block
 block discarded – undo
1335 1335
 									$field['class'] .= 'redux-section-indent-start';
1336 1336
 								}
1337 1337
 
1338
-								if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
1339
-									$this->meta[ $this->post_id ][ $field['id'] ] = '';
1338
+								if ( ! isset( $this->meta[$this->post_id][$field['id']] ) ) {
1339
+									$this->meta[$this->post_id][$field['id']] = '';
1340 1340
 								}
1341 1341
 
1342
-								$this->parent->render_class->field_input( $field, $this->meta[ $this->post_id ][ $field['id'] ], true );
1342
+								$this->parent->render_class->field_input( $field, $this->meta[$this->post_id][$field['id']], true );
1343 1343
 								echo '</td></tr>';
1344 1344
 							}
1345 1345
 							echo '</tbody></table>';
@@ -1374,7 +1374,7 @@  discard block
 block discarded – undo
1374 1374
 			}
1375 1375
 
1376 1376
 			// Check if our nonce is set.
1377
-			if ( ! isset( $_POST['redux_metaboxes_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
1377
+			if ( ! isset( $_POST['redux_metaboxes_meta_nonce'] ) || ! isset( $_POST[$this->parent->args['opt_name']] ) ) {
1378 1378
 				return $post_id;
1379 1379
 			}
1380 1380
 
@@ -1396,17 +1396,17 @@  discard block
 block discarded – undo
1396 1396
 			}
1397 1397
 
1398 1398
 			// Import.
1399
-			if ( isset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) && ! empty( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ) {
1400
-				$import = json_decode( sanitize_text_field( wp_unslash( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ), true );
1401
-				unset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] );
1399
+			if ( isset( $_POST[$this->parent->args['opt_name']]['import_code'] ) && ! empty( $_POST[$this->parent->args['opt_name']]['import_code'] ) ) {
1400
+				$import = json_decode( sanitize_text_field( wp_unslash( $_POST[$this->parent->args['opt_name']]['import_code'] ) ), true );
1401
+				unset( $_POST[$this->parent->args['opt_name']]['import_code'] );
1402 1402
 
1403
-				foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1404
-					if ( ! isset( $import[ $key ] ) ) {
1405
-						$import[ $key ] = $value;
1403
+				foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[$this->parent->args['opt_name']] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1404
+					if ( ! isset( $import[$key] ) ) {
1405
+						$import[$key] = $value;
1406 1406
 					}
1407 1407
 				}
1408 1408
 
1409
-				$_POST[ $this->parent->args['opt_name'] ] = $import;
1409
+				$_POST[$this->parent->args['opt_name']] = $import;
1410 1410
 			}
1411 1411
 
1412 1412
 			$to_save    = array();
@@ -1418,13 +1418,13 @@  discard block
 block discarded – undo
1418 1418
 				$dont_save = false;
1419 1419
 			}
1420 1420
 
1421
-			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1421
+			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[$this->parent->args['opt_name']] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1422 1422
 
1423 1423
 				// Have to remove the escaping for array comparison.
1424 1424
 				if ( is_array( $value ) ) {
1425 1425
 					foreach ( $value as $k => $v ) {
1426 1426
 						if ( ! is_array( $v ) ) {
1427
-							$value[ $k ] = wp_unslash( $v );
1427
+							$value[$k] = wp_unslash( $v );
1428 1428
 						}
1429 1429
 					}
1430 1430
 				}
@@ -1432,19 +1432,19 @@  discard block
 block discarded – undo
1432 1432
 				$save = true;
1433 1433
 
1434 1434
 				// parent_options.
1435
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1435
+				if ( ! $dont_save && isset( $this->options_defaults[$key] ) && $value === $this->options_defaults[$key] ) {
1436 1436
 					$save = false;
1437 1437
 				}
1438 1438
 
1439
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1439
+				if ( $save && isset( $this->parent_options[$key] ) && $this->parent_options[$key] !== $value ) {
1440 1440
 					$save = false;
1441 1441
 				}
1442 1442
 
1443 1443
 				if ( $save ) {
1444
-					$to_save[ $key ]    = $value;
1445
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1444
+					$to_save[$key]    = $value;
1445
+					$to_compare[$key] = $this->parent->options[$key] ?? '';
1446 1446
 				} else {
1447
-					$to_delete[ $key ] = $value;
1447
+					$to_delete[$key] = $value;
1448 1448
 				}
1449 1449
 			}
1450 1450
 
@@ -1455,11 +1455,11 @@  discard block
 block discarded – undo
1455 1455
 
1456 1456
 			// Validate fields (if needed).
1457 1457
 			foreach ( $to_save as $key => $value ) {
1458
-				if ( isset( $validate[ $key ] ) && $value !== $validate[ $key ] ) {
1459
-					if ( isset( $this->parent->options[ $key ] ) && $validate[ $key ] === $this->parent->options[ $key ] ) {
1460
-						unset( $to_save[ $key ] );
1458
+				if ( isset( $validate[$key] ) && $value !== $validate[$key] ) {
1459
+					if ( isset( $this->parent->options[$key] ) && $validate[$key] === $this->parent->options[$key] ) {
1460
+						unset( $to_save[$key] );
1461 1461
 					} else {
1462
-						$to_save[ $key ] = $validate[ $key ];
1462
+						$to_save[$key] = $validate[$key];
1463 1463
 					}
1464 1464
 				}
1465 1465
 			}
@@ -1484,28 +1484,28 @@  discard block
 block discarded – undo
1484 1484
 			}
1485 1485
 
1486 1486
 			if ( isset( $_POST['post_type'] ) ) {
1487
-				$check = $this->post_type_fields[ sanitize_text_field( wp_unslash( $_POST['post_type'] ) ) ];
1487
+				$check = $this->post_type_fields[sanitize_text_field( wp_unslash( $_POST['post_type'] ) )];
1488 1488
 			}
1489 1489
 
1490 1490
 			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1491 1491
 			$to_save = apply_filters( 'redux/metaboxes/save', $to_save, $to_compare, $this->sections );
1492 1492
 
1493 1493
 			foreach ( $to_save as $key => $value ) {
1494
-				$prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1494
+				$prev_value = $this->meta[$post_id][$key] ?? '';
1495 1495
 
1496
-				if ( isset( $check[ $key ] ) ) {
1497
-					unset( $check[ $key ] );
1496
+				if ( isset( $check[$key] ) ) {
1497
+					unset( $check[$key] );
1498 1498
 				}
1499 1499
 
1500 1500
 				update_post_meta( $post_id, $key, $value, $prev_value );
1501 1501
 			}
1502 1502
 
1503 1503
 			foreach ( $to_delete as $key => $value ) {
1504
-				if ( isset( $check[ $key ] ) ) {
1505
-					unset( $check[ $key ] );
1504
+				if ( isset( $check[$key] ) ) {
1505
+					unset( $check[$key] );
1506 1506
 				}
1507 1507
 
1508
-				$prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1508
+				$prev_value = $this->meta[$post_id][$key] ?? '';
1509 1509
 				delete_post_meta( $post_id, $key, $prev_value );
1510 1510
 			}
1511 1511
 
Please login to merge, or discard this patch.
Indentation   +1465 added lines, -1465 removed lines patch added patch discarded remove patch
@@ -14,1184 +14,1184 @@  discard block
 block discarded – undo
14 14
 // Don't duplicate me!
15 15
 if ( ! class_exists( 'Redux_Extension_Metaboxes', false ) ) {
16 16
 
17
-	/**
18
-	 * Main Redux_Extension_Metaboxes class
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Extension_Metaboxes extends Redux_Extension_Abstract {
23
-
24
-		/**
25
-		 * Extension version.
26
-		 *
27
-		 * @var string
28
-		 */
29
-		public static $version = '4.2.0';
30
-
31
-		/**
32
-		 * Extension friendly name.
33
-		 *
34
-		 * @var string
35
-		 */
36
-		public string $extension_name = 'Metaboxes';
37
-
38
-		/**
39
-		 * Boxes array.
40
-		 *
41
-		 * @var array|null
42
-		 */
43
-		public ?array $boxes = array();
44
-
45
-		/**
46
-		 * Post types array.
47
-		 *
48
-		 * @var array|null
49
-		 */
50
-		public ?array $post_types = array();
51
-
52
-		/**
53
-		 * Post type.
54
-		 *
55
-		 * @var string|null
56
-		 */
57
-		public ?string $post_type;
58
-
59
-		/**
60
-		 * Sections array.
61
-		 *
62
-		 * @var array|null
63
-		 */
64
-		public ?array $orig_args;
65
-
66
-		/**
67
-		 * Sections array.
68
-		 *
69
-		 * @var array|null
70
-		 */
71
-		public ?array $sections = array();
72
-
73
-		/**
74
-		 * CSS output array.
75
-		 *
76
-		 * @var array|null
77
-		 */
78
-		public ?array $output = array();
79
-
80
-		/**
81
-		 * Options array.
82
-		 *
83
-		 * @var array
84
-		 */
85
-		public array $options = array();
86
-
87
-		/**
88
-		 * Parent options array.
89
-		 *
90
-		 * @var array
91
-		 */
92
-		public array $parent_options = array();
93
-
94
-		/**
95
-		 * Parent defaults array.
96
-		 *
97
-		 * @var array
98
-		 */
99
-		public array $parent_defaults = array();
100
-
101
-		/**
102
-		 * Post type fields array.
103
-		 *
104
-		 * @var array
105
-		 */
106
-		public array $post_type_fields = array();
107
-
108
-		/**
109
-		 * Options defaults array.
110
-		 *
111
-		 * @var array
112
-		 */
113
-		public array $options_defaults = array();
114
-
115
-		/**
116
-		 * Replace array.
117
-		 *
118
-		 * @var array
119
-		 */
120
-		public array $to_replace = array();
121
-
122
-		/**
123
-		 * Meta data array.
124
-		 *
125
-		 * @var array
126
-		 */
127
-		public array $meta = array();
128
-
129
-		/**
130
-		 * Post ID.
131
-		 *
132
-		 * @var null|int
133
-		 */
134
-		public ?int $post_id = 0;
135
-
136
-		/**
137
-		 * Base URI.
138
-		 *
139
-		 * @var string|null
140
-		 */
141
-		public ?string $base_url;
142
-
143
-		/**
144
-		 * WP_Links array.
145
-		 *
146
-		 * @var array
147
-		 */
148
-		public array $wp_links = array();
149
-
150
-		/**
151
-		 * Notices.
152
-		 *
153
-		 * @var array
154
-		 */
155
-		private array $notices = array();
156
-
157
-		/**
158
-		 * ReduxFramework_extension_metaboxes constructor.
159
-		 *
160
-		 * @param object $redux ReduxFramework object.
161
-		 */
162
-		public function __construct( $redux ) {
163
-			global $pagenow;
164
-
165
-			parent::__construct( $redux, __FILE__ );
166
-
167
-			$this->parent->extensions['metaboxes'] = $this;
168
-
169
-			$this->extension_dir = trailingslashit( str_replace( '\\', '/', __DIR__ ) );
170
-			$this->extension_url = site_url( str_replace( trailingslashit( str_replace( '\\', '/', ABSPATH ) ), '', $this->extension_dir ) );
171
-
172
-			// Only run metaboxes on the pages/posts, not the front-end.
173
-			// The DOING_AJAX check allows for redux_post_meta to work inside
174
-			// AJAX calls. - kp.
175
-			if ( 'post-new.php' !== $pagenow && 'post.php' !== $pagenow ) {
176
-				if ( is_admin() ) {
177
-					if ( defined( 'DOING_AJAX' ) && ! DOING_AJAX ) {
178
-						return;
179
-					}
180
-
181
-					return;
182
-				}
183
-			}
184
-
185
-			if ( 'wp-cron.php' === $pagenow || 'wp-comments-post.php' === $pagenow ) {
186
-				return;
187
-			}
188
-
189
-			// Must not update the DB when just updating metaboxes. Sheesh.
190
-			if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
191
-				$this->parent->never_save_to_db = true;
192
-			}
193
-
194
-			include_once Redux_Core::$dir . 'inc/extensions/metaboxes/redux-metaboxes-helpers.php';
195
-
196
-			// phpcs:ignore Generic.Strings.UnnecessaryStringConcat
197
-			add_action( 'add_' . 'meta_' . 'boxes', array( $this, 'add' ) );
198
-			add_action( 'save_post', array( $this, 'meta_boxes_save' ), 1, 2 );
199
-			add_action( 'pre_post_update', array( $this, 'pre_post_update' ) );
200
-			add_action( 'admin_notices', array( $this, 'meta_boxes_show_errors' ), 0 );
201
-			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
202
-
203
-			// Global variable overrides for within loops.
204
-			add_action( 'the_post', array( $this, 'loop_start' ), 0 );
205
-			add_action( 'loop_end', array( $this, 'loop_end' ), 0 );
206
-
207
-			$this->init();
208
-		}
209
-
210
-		/**
211
-		 * Added class names to metabox DIV.
212
-		 *
213
-		 * @param array $classes Class array.
214
-		 *
215
-		 * @return array
216
-		 */
217
-		public function add_box_classes( array $classes ): array {
218
-			$classes[] = 'redux-metabox';
219
-			$classes[] = 'redux-' . $this->parent->args['opt_name'];
220
-
221
-			if ( '' !== $this->parent->args['class'] ) {
222
-				$classes[] = $this->parent->args['class'];
223
-			}
224
-
225
-			return $classes;
226
-		}
227
-
228
-		/**
229
-		 * Class init.
230
-		 */
231
-		public function init() {
232
-			global $pagenow;
233
-
234
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
235
-			$this->boxes = apply_filters( 'redux/metaboxes/' . $this->parent->args['opt_name'] . '/boxes', $this->boxes, $this->parent->args['opt_name'] );
236
-
237
-			if ( empty( $this->boxes ) && class_exists( 'Redux_Metaboxes' ) ) {
238
-				$this->boxes = Redux_Metaboxes::construct_boxes( $this->parent->args['opt_name'] );
239
-			}
240
-
241
-			if ( empty( $this->boxes ) || ! is_array( $this->boxes ) ) {
242
-				return;
243
-			}
244
-
245
-			if ( isset( Redux_Core::$server['HTTP_HOST'] ) && isset( Redux_Core::$server['REQUEST_URI'] ) ) {
246
-				$this->base_url = ( is_ssl() ? 'https://' : 'http://' ) . sanitize_text_field( wp_unslash( Redux_Core::$server['HTTP_HOST'] ) ) . sanitize_text_field( wp_unslash( Redux_Core::$server['REQUEST_URI'] ) ); // Safe & Reliable.
247
-				$this->post_id  = $this->url_to_postid( ( is_ssl() ? 'https://' : 'http://' ) . sanitize_text_field( wp_unslash( Redux_Core::$server['HTTP_HOST'] ) ) . sanitize_text_field( wp_unslash( Redux_Core::$server['REQUEST_URI'] ) ) );
248
-			}
249
-
250
-			if ( is_admin() && isset( $_GET['post_type'] ) && ! empty( $_GET['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
251
-				$this->post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
252
-			} else {
253
-				$this->post_type = get_post_type( $this->post_id );
254
-			}
255
-
256
-			foreach ( $this->boxes as $bk => $box ) {
257
-
258
-				// If the post-ids for this box are set, we're limiting to the current post id.
259
-				if ( ! empty( $box['post_ids'] ) ) {
260
-					if ( ! is_array( $box['post_ids'] ) ) {
261
-						$box['post_ids'] = array( $box['post_ids'] );
262
-					}
263
-					if ( ! in_array( $this->post_id, $box['post_ids'], true ) ) {
264
-						continue;
265
-					}
266
-				}
267
-
268
-				if ( ! empty( $box['sections'] ) ) {
269
-					$this->sections = wp_parse_args( $this->sections, $box['sections'] );
270
-
271
-					$this->post_types = wp_parse_args( $this->post_types, $box['post_types'] );
272
-
273
-					// Checking to override the parent variables.
274
-					$add_field = false;
275
-
276
-					foreach ( $box['post_types'] as $type ) {
277
-						if ( $this->post_type === $type ) {
278
-							$add_field = true;
279
-						}
280
-					}
281
-
282
-					// Replacing all the fields.
283
-					if ( $add_field || ( ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) || ( ! is_admin() ) ) ) {
284
-						$run_hooks = true;
285
-
286
-						$box_id = 'redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'];
287
-
288
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
289
-						do_action( 'redux/' . $this->parent->args['opt_name'] . '/extensions/metabox/init', $this, $box );
290
-
291
-						if ( isset( $box['page_template'] ) && 'page' === $this->post_type ) {
292
-							if ( ! is_array( $box['page_template'] ) ) {
293
-								$box['page_template'] = array( $box['page_template'] );
294
-							}
295
-
296
-							$this->wp_links[ $box_id ]['page_template'] = isset( $this->wp_links[ $box_id ]['page_template'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['page_template'], $box['page_template'] ) : $box['page_template'];
297
-						}
298
-
299
-						if ( isset( $box['post_format'] ) && ( in_array( $this->post_type, $this->post_types, true ) || '' === $this->post_type || false === $this->post_type ) ) {
300
-							if ( ! is_array( $box['post_format'] ) ) {
301
-								$box['post_format'] = array( $box['post_format'] );
302
-							}
303
-
304
-							$this->wp_links[ $box_id ]['post_format'] = isset( $this->wp_links[ $box_id ]['post_format'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['post_format'], $box['post_format'] ) : $box['post_format'];
305
-						}
306
-
307
-						$this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
308
-
309
-						foreach ( $box['sections'] as $sk => $section ) {
310
-							if ( ! empty( $section['fields'] ) ) {
311
-								foreach ( $section['fields'] as $fk => $field ) {
312
-									if ( ! isset( $field['class'] ) ) {
313
-										$field['class'] = '';
314
-
315
-										$this->boxes[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
316
-									}
317
-
318
-									if ( $add_field || ( ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) || ( ! is_admin() ) ) ) {
319
-										if ( empty( $field['id'] ) ) {
320
-											continue;
321
-										}
322
-
323
-										if ( isset( $field['default'] ) ) {
324
-											$this->options_defaults[ $field['id'] ] = $field['default'];
325
-										} else {
326
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
327
-										}
328
-
329
-										foreach ( $box['post_types'] as $type ) {
330
-											$this->post_type_fields[ $type ][ $field['id'] ] = 1;
331
-
332
-											if ( 'repeater' === $field['type'] ) {
333
-												foreach ( $field['fields'] as $val ) {
334
-													$this->post_type_fields[ $type ][ $val['id'] ] = 1;
335
-												}
336
-											}
337
-										}
338
-
339
-										if ( ! empty( $field['output'] ) ) {
340
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
341
-										}
342
-
343
-										// Detect what field types are being used.
344
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
345
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
346
-										} else {
347
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
348
-										}
349
-
350
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
351
-											$this->to_replace[ $field['id'] ] = $field;
352
-										}
353
-									}
354
-
355
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
356
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
357
-									}
358
-
359
-									if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
360
-										$this->meta[ $this->post_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
361
-									}
362
-
363
-									// Only override if it exists, and it's not the default.
364
-									// phpcs:ignore Squiz.PHP.CommentedOutCode
365
-									// if ( isset( $this->meta[ $this->post_id ][ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $this->post_id ][ $field['id'] ] === $field['default'] ) {
366
-									// unset($this->meta[$this->post_id][$field['id']]);
367
-									// } .
368
-								}
369
-							}
370
-						}
371
-					}
372
-				}
373
-			}
374
-
375
-			if ( isset( $run_hooks ) && true === $run_hooks ) {
376
-				$this->parent_options = array();
377
-
378
-				if ( ! empty( $this->to_replace ) ) {
379
-					foreach ( $this->to_replace as $id => $field ) {
380
-
381
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
382
-						add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
383
-					}
384
-				}
385
-
386
-				add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
387
-				add_filter( "redux/field/{$this->parent->args['opt_name']}/_can_output_css", array( $this, 'override_can_output_css' ) );
388
-				add_filter( "redux/field/{$this->parent->args['opt_name']}/output_css", array( $this, 'output_css' ) );
389
-			}
390
-		}
391
-
392
-		/**
393
-		 * Replace Field.
394
-		 *
395
-		 * @param array $field Field array.
396
-		 *
397
-		 * @return mixed
398
-		 */
399
-		public function replace_field( array $field ) {
400
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
401
-				$field = $this->to_replace[ $field['id'] ];
402
-			}
403
-
404
-			return $field;
405
-		}
406
-
407
-		/**
408
-		 * Override CSS output.
409
-		 *
410
-		 * @param array $field Field array.
411
-		 *
412
-		 * @return array
413
-		 */
414
-		public function override_can_output_css( array $field ): array {
415
-			if ( isset( $this->output[ $field['id'] ] ) ) {
416
-				$field['force_output'] = true;
417
-			}
418
-
419
-			return $field;
420
-		}
421
-
422
-		/**
423
-		 * Output CSS.
424
-		 *
425
-		 * @param array $field Field array.
426
-		 *
427
-		 * @return array
428
-		 */
429
-		public function output_css( array $field ): array {
430
-			if ( isset( $this->output[ $field['id'] ] ) ) {
431
-				$field['output'] = $this->output[ $field['id'] ];
432
-			}
433
-
434
-			return $field;
435
-		}
436
-
437
-		/**
438
-		 * Make sure the defaults are the defaults
439
-		 *
440
-		 * @param array $options Options array.
441
-		 *
442
-		 * @return array
443
-		 */
444
-		public function override_options( array $options ): array {
445
-			$this->parent->default_values();
446
-			$this->parent_defaults = $this->parent->options_defaults;
447
-
448
-			$meta = $this->get_meta( $this->post_id );
449
-			$data = wp_parse_args( $meta, $this->options_defaults );
450
-
451
-			foreach ( $data as $key => $value ) {
452
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
453
-					$data[ $key ] = $meta[ $key ];
454
-					continue;
455
-				}
456
-
457
-				if ( isset( $options[ $key ] ) ) {
458
-					$data[ $key ] = $options[ $key ];
459
-				}
460
-			}
461
-
462
-			$this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
463
-
464
-			return wp_parse_args( $data, $options );
465
-		}
466
-
467
-		/**
468
-		 * Loop start.
469
-		 *
470
-		 * @param mixed $the_post WP_Post object.
471
-		 *
472
-		 * @return array|void
473
-		 */
474
-		public function loop_start( $the_post = array() ) {
475
-			if ( is_admin() ) {
476
-				return $the_post;
477
-			}
478
-
479
-			if ( isset( $the_post ) && is_array( $the_post ) ) {
480
-				global $post;
481
-				$the_post = $post;
482
-			}
483
-
484
-			if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
485
-				$GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
486
-				unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
487
-			}
488
-
489
-			// Override these values if they differ from the admin panel defaults.  ;) .
490
-			if ( in_array( $the_post->post_type, $this->post_types, true ) ) {
491
-				$meta = $this->get_meta( $the_post->ID );
492
-				if ( empty( $meta ) ) {
493
-					return;
494
-				}
495
-
496
-				// Backup the args.
497
-				$GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] = $GLOBALS[ $this->parent->args['global_variable'] ];
498
-				$GLOBALS[ $this->parent->args['global_variable'] ]           = wp_parse_args( $meta, $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
499
-			}
500
-		}
501
-
502
-		/**
503
-		 * Loop end.
504
-		 */
505
-		public function loop_end() {
506
-			if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
507
-				$GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
508
-
509
-				unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
510
-			}
511
-		}
512
-
513
-		/**
514
-		 * Enqueue fields.
515
-		 */
516
-		public function enqueue() {
517
-			global $pagenow;
518
-
519
-			$types = array();
520
-
521
-			// Enqueue CSS.
522
-			foreach ( $this->boxes as $key => $box ) {
523
-				if ( empty( $box['sections'] ) ) {
524
-					continue;
525
-				}
526
-
527
-				if ( isset( $box['post_types'] ) ) {
528
-					$types = array_merge( $box['post_types'], $types );
529
-				}
530
-
531
-				if ( ! empty( $box['post_types'] ) ) {
532
-					if ( ! is_array( $box['post_types'] ) ) {
533
-						$box['post_types']                 = array( $box['post_types'] );
534
-						$this->boxes[ $key ]['post_types'] = $box['post_types'];
535
-					}
536
-				}
537
-			}
538
-
539
-			if ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) {
540
-				global $post;
541
-
542
-				if ( in_array( $post->post_type, $types, true ) ) {
543
-					$this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-metaboxes' );
544
-					$this->parent->transients_check = $this->parent->transients;
545
-
546
-					if ( isset( $this->parent->transients['notices'] ) ) {
547
-						$this->notices                              = $this->parent->transients['notices'];
548
-						$this->parent->transients['last_save_mode'] = 'metaboxes';
549
-					}
550
-
551
-					delete_transient( $this->parent->args['opt_name'] . '-transients-metaboxes' );
552
-					$this->parent->enqueue_class->init();
553
-
554
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
555
-					do_action( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue" );
556
-
557
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
558
-					do_action( "redux/{$this->parent->args['opt_name']}/extensions/metaboxes/enqueue" );
559
-
560
-					/**
561
-					 * Redux metaboxes CSS
562
-					 * filter 'redux/page/{opt_name}/enqueue/redux-extension-metaboxes-css'
563
-					 */
564
-					if ( $this->parent->args['dev_mode'] ) {
565
-						wp_enqueue_style(
566
-							'redux-extension-metaboxes',
567
-							apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue/redux-extension-metaboxes-css", $this->extension_url . 'redux-extension-metaboxes.css' ), // phpcs:ignore: WordPress.NamingConventions.ValidHookName
568
-							array(),
569
-							self::$version
570
-						);
571
-					}
572
-
573
-					/**
574
-					 * Redux metaboxes JS
575
-					 * filter 'redux/page/{opt_name}/enqueue/redux-extension-metaboxes-js
576
-					 */
577
-					wp_enqueue_script(
578
-						'redux-extension-metaboxes',
579
-						apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue/redux-extension-metaboxes-js", $this->extension_url . 'redux-extension-metaboxes' . Redux_Functions::isMin() . '.js' ), // phpcs:ignore: WordPress.NamingConventions.ValidHookName
580
-						array( 'jquery', 'redux-js' ),
581
-						self::$version,
582
-						true
583
-					);
584
-
585
-					// Values used by the javascript.
586
-					wp_localize_script(
587
-						'redux-extension-metaboxes',
588
-						'reduxMetaboxes',
589
-						$this->wp_links
590
-					);
591
-
592
-					wp_localize_script(
593
-						'redux-extension-metaboxes',
594
-						'reduxMetaboxesPageTemplate',
595
-						array(
596
-							'_wp_page_template' => get_post_meta( get_the_ID(), '_wp_page_template', true ),
597
-						)
598
-					);
599
-				}
600
-			}
601
-		}
602
-
603
-		/* Post URLs to IDs function, supports custom post types - borrowed and modified from url_to_postid() in wp-includes/rewrite.php */
604
-
605
-		// Taken from http://betterwp.net/wordpress-tips/url_to_postid-for-custom-post-types/
606
-		// Customized to work with non-rewrite URLs
607
-		// Modified by Dovy Paukstys (@dovy) of Redux Framework.
608
-
609
-		/**
610
-		 * URL to PostID.
611
-		 *
612
-		 * @param string $url URL.
613
-		 *
614
-		 * @return int|mixed|void
615
-		 */
616
-		private function url_to_postid( string $url ) {
617
-			global $wp_rewrite, $pagenow;
618
-
619
-			if ( ! empty( $this->post_id ) ) {
620
-				return $this->post_id;
621
-			}
622
-
623
-			if ( isset( $_GET['post'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification
624
-				$post = (int) sanitize_text_field( wp_unslash( $_GET['post'] ) );  // phpcs:ignore WordPress.Security.NonceVerification
625
-
626
-				if ( ! empty( $post ) ) {
627
-					return $post;
628
-				}
629
-			}
630
-
631
-			if ( 'post-new.php' === $pagenow || 'wp-login.php' === $pagenow ) {
632
-				return;
633
-			}
634
-
635
-			if ( is_admin() && 'post.php' === $pagenow && isset( $_POST['post_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
636
-				$post_id = sanitize_text_field( wp_unslash( $_POST['post_ID'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
637
-
638
-				if ( ! empty( $post_id ) && is_numeric( $post_id ) ) {
639
-					return $post_id;
640
-				}
641
-			}
642
-
643
-			$post_id = url_to_postid( $url );
644
-
645
-			if ( isset( $post_id ) && '' !== (string) $post_id && 0 !== $post_id ) {
646
-				return $post_id;
647
-			}
648
-
649
-			// First, check to see if there is a 'p=N' or 'page_id=N' to match against.
650
-			if ( preg_match( '#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values ) ) {
651
-				$id = absint( $values[2] );
652
-				if ( $id ) {
653
-					return $id;
654
-				}
655
-			}
656
-
657
-			// Check to see if we are using rewrite rules.
658
-			if ( isset( $wp_rewrite ) ) {
659
-				$rewrite = $wp_rewrite->wp_rewrite_rules();
660
-			}
661
-
662
-			// Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options.
663
-			if ( empty( $rewrite ) ) {
664
-				if ( ! empty( $_GET ) ) { // phpcs:ignore WordPress.Security.NonceVerification
665
-
666
-					/************************************************************************
17
+    /**
18
+     * Main Redux_Extension_Metaboxes class
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Extension_Metaboxes extends Redux_Extension_Abstract {
23
+
24
+        /**
25
+         * Extension version.
26
+         *
27
+         * @var string
28
+         */
29
+        public static $version = '4.2.0';
30
+
31
+        /**
32
+         * Extension friendly name.
33
+         *
34
+         * @var string
35
+         */
36
+        public string $extension_name = 'Metaboxes';
37
+
38
+        /**
39
+         * Boxes array.
40
+         *
41
+         * @var array|null
42
+         */
43
+        public ?array $boxes = array();
44
+
45
+        /**
46
+         * Post types array.
47
+         *
48
+         * @var array|null
49
+         */
50
+        public ?array $post_types = array();
51
+
52
+        /**
53
+         * Post type.
54
+         *
55
+         * @var string|null
56
+         */
57
+        public ?string $post_type;
58
+
59
+        /**
60
+         * Sections array.
61
+         *
62
+         * @var array|null
63
+         */
64
+        public ?array $orig_args;
65
+
66
+        /**
67
+         * Sections array.
68
+         *
69
+         * @var array|null
70
+         */
71
+        public ?array $sections = array();
72
+
73
+        /**
74
+         * CSS output array.
75
+         *
76
+         * @var array|null
77
+         */
78
+        public ?array $output = array();
79
+
80
+        /**
81
+         * Options array.
82
+         *
83
+         * @var array
84
+         */
85
+        public array $options = array();
86
+
87
+        /**
88
+         * Parent options array.
89
+         *
90
+         * @var array
91
+         */
92
+        public array $parent_options = array();
93
+
94
+        /**
95
+         * Parent defaults array.
96
+         *
97
+         * @var array
98
+         */
99
+        public array $parent_defaults = array();
100
+
101
+        /**
102
+         * Post type fields array.
103
+         *
104
+         * @var array
105
+         */
106
+        public array $post_type_fields = array();
107
+
108
+        /**
109
+         * Options defaults array.
110
+         *
111
+         * @var array
112
+         */
113
+        public array $options_defaults = array();
114
+
115
+        /**
116
+         * Replace array.
117
+         *
118
+         * @var array
119
+         */
120
+        public array $to_replace = array();
121
+
122
+        /**
123
+         * Meta data array.
124
+         *
125
+         * @var array
126
+         */
127
+        public array $meta = array();
128
+
129
+        /**
130
+         * Post ID.
131
+         *
132
+         * @var null|int
133
+         */
134
+        public ?int $post_id = 0;
135
+
136
+        /**
137
+         * Base URI.
138
+         *
139
+         * @var string|null
140
+         */
141
+        public ?string $base_url;
142
+
143
+        /**
144
+         * WP_Links array.
145
+         *
146
+         * @var array
147
+         */
148
+        public array $wp_links = array();
149
+
150
+        /**
151
+         * Notices.
152
+         *
153
+         * @var array
154
+         */
155
+        private array $notices = array();
156
+
157
+        /**
158
+         * ReduxFramework_extension_metaboxes constructor.
159
+         *
160
+         * @param object $redux ReduxFramework object.
161
+         */
162
+        public function __construct( $redux ) {
163
+            global $pagenow;
164
+
165
+            parent::__construct( $redux, __FILE__ );
166
+
167
+            $this->parent->extensions['metaboxes'] = $this;
168
+
169
+            $this->extension_dir = trailingslashit( str_replace( '\\', '/', __DIR__ ) );
170
+            $this->extension_url = site_url( str_replace( trailingslashit( str_replace( '\\', '/', ABSPATH ) ), '', $this->extension_dir ) );
171
+
172
+            // Only run metaboxes on the pages/posts, not the front-end.
173
+            // The DOING_AJAX check allows for redux_post_meta to work inside
174
+            // AJAX calls. - kp.
175
+            if ( 'post-new.php' !== $pagenow && 'post.php' !== $pagenow ) {
176
+                if ( is_admin() ) {
177
+                    if ( defined( 'DOING_AJAX' ) && ! DOING_AJAX ) {
178
+                        return;
179
+                    }
180
+
181
+                    return;
182
+                }
183
+            }
184
+
185
+            if ( 'wp-cron.php' === $pagenow || 'wp-comments-post.php' === $pagenow ) {
186
+                return;
187
+            }
188
+
189
+            // Must not update the DB when just updating metaboxes. Sheesh.
190
+            if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
191
+                $this->parent->never_save_to_db = true;
192
+            }
193
+
194
+            include_once Redux_Core::$dir . 'inc/extensions/metaboxes/redux-metaboxes-helpers.php';
195
+
196
+            // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
197
+            add_action( 'add_' . 'meta_' . 'boxes', array( $this, 'add' ) );
198
+            add_action( 'save_post', array( $this, 'meta_boxes_save' ), 1, 2 );
199
+            add_action( 'pre_post_update', array( $this, 'pre_post_update' ) );
200
+            add_action( 'admin_notices', array( $this, 'meta_boxes_show_errors' ), 0 );
201
+            add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
202
+
203
+            // Global variable overrides for within loops.
204
+            add_action( 'the_post', array( $this, 'loop_start' ), 0 );
205
+            add_action( 'loop_end', array( $this, 'loop_end' ), 0 );
206
+
207
+            $this->init();
208
+        }
209
+
210
+        /**
211
+         * Added class names to metabox DIV.
212
+         *
213
+         * @param array $classes Class array.
214
+         *
215
+         * @return array
216
+         */
217
+        public function add_box_classes( array $classes ): array {
218
+            $classes[] = 'redux-metabox';
219
+            $classes[] = 'redux-' . $this->parent->args['opt_name'];
220
+
221
+            if ( '' !== $this->parent->args['class'] ) {
222
+                $classes[] = $this->parent->args['class'];
223
+            }
224
+
225
+            return $classes;
226
+        }
227
+
228
+        /**
229
+         * Class init.
230
+         */
231
+        public function init() {
232
+            global $pagenow;
233
+
234
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
235
+            $this->boxes = apply_filters( 'redux/metaboxes/' . $this->parent->args['opt_name'] . '/boxes', $this->boxes, $this->parent->args['opt_name'] );
236
+
237
+            if ( empty( $this->boxes ) && class_exists( 'Redux_Metaboxes' ) ) {
238
+                $this->boxes = Redux_Metaboxes::construct_boxes( $this->parent->args['opt_name'] );
239
+            }
240
+
241
+            if ( empty( $this->boxes ) || ! is_array( $this->boxes ) ) {
242
+                return;
243
+            }
244
+
245
+            if ( isset( Redux_Core::$server['HTTP_HOST'] ) && isset( Redux_Core::$server['REQUEST_URI'] ) ) {
246
+                $this->base_url = ( is_ssl() ? 'https://' : 'http://' ) . sanitize_text_field( wp_unslash( Redux_Core::$server['HTTP_HOST'] ) ) . sanitize_text_field( wp_unslash( Redux_Core::$server['REQUEST_URI'] ) ); // Safe & Reliable.
247
+                $this->post_id  = $this->url_to_postid( ( is_ssl() ? 'https://' : 'http://' ) . sanitize_text_field( wp_unslash( Redux_Core::$server['HTTP_HOST'] ) ) . sanitize_text_field( wp_unslash( Redux_Core::$server['REQUEST_URI'] ) ) );
248
+            }
249
+
250
+            if ( is_admin() && isset( $_GET['post_type'] ) && ! empty( $_GET['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
251
+                $this->post_type = sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
252
+            } else {
253
+                $this->post_type = get_post_type( $this->post_id );
254
+            }
255
+
256
+            foreach ( $this->boxes as $bk => $box ) {
257
+
258
+                // If the post-ids for this box are set, we're limiting to the current post id.
259
+                if ( ! empty( $box['post_ids'] ) ) {
260
+                    if ( ! is_array( $box['post_ids'] ) ) {
261
+                        $box['post_ids'] = array( $box['post_ids'] );
262
+                    }
263
+                    if ( ! in_array( $this->post_id, $box['post_ids'], true ) ) {
264
+                        continue;
265
+                    }
266
+                }
267
+
268
+                if ( ! empty( $box['sections'] ) ) {
269
+                    $this->sections = wp_parse_args( $this->sections, $box['sections'] );
270
+
271
+                    $this->post_types = wp_parse_args( $this->post_types, $box['post_types'] );
272
+
273
+                    // Checking to override the parent variables.
274
+                    $add_field = false;
275
+
276
+                    foreach ( $box['post_types'] as $type ) {
277
+                        if ( $this->post_type === $type ) {
278
+                            $add_field = true;
279
+                        }
280
+                    }
281
+
282
+                    // Replacing all the fields.
283
+                    if ( $add_field || ( ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) || ( ! is_admin() ) ) ) {
284
+                        $run_hooks = true;
285
+
286
+                        $box_id = 'redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'];
287
+
288
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
289
+                        do_action( 'redux/' . $this->parent->args['opt_name'] . '/extensions/metabox/init', $this, $box );
290
+
291
+                        if ( isset( $box['page_template'] ) && 'page' === $this->post_type ) {
292
+                            if ( ! is_array( $box['page_template'] ) ) {
293
+                                $box['page_template'] = array( $box['page_template'] );
294
+                            }
295
+
296
+                            $this->wp_links[ $box_id ]['page_template'] = isset( $this->wp_links[ $box_id ]['page_template'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['page_template'], $box['page_template'] ) : $box['page_template'];
297
+                        }
298
+
299
+                        if ( isset( $box['post_format'] ) && ( in_array( $this->post_type, $this->post_types, true ) || '' === $this->post_type || false === $this->post_type ) ) {
300
+                            if ( ! is_array( $box['post_format'] ) ) {
301
+                                $box['post_format'] = array( $box['post_format'] );
302
+                            }
303
+
304
+                            $this->wp_links[ $box_id ]['post_format'] = isset( $this->wp_links[ $box_id ]['post_format'] ) ? wp_parse_args( $this->wp_links[ $box_id ]['post_format'], $box['post_format'] ) : $box['post_format'];
305
+                        }
306
+
307
+                        $this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
308
+
309
+                        foreach ( $box['sections'] as $sk => $section ) {
310
+                            if ( ! empty( $section['fields'] ) ) {
311
+                                foreach ( $section['fields'] as $fk => $field ) {
312
+                                    if ( ! isset( $field['class'] ) ) {
313
+                                        $field['class'] = '';
314
+
315
+                                        $this->boxes[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
316
+                                    }
317
+
318
+                                    if ( $add_field || ( ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) || ( ! is_admin() ) ) ) {
319
+                                        if ( empty( $field['id'] ) ) {
320
+                                            continue;
321
+                                        }
322
+
323
+                                        if ( isset( $field['default'] ) ) {
324
+                                            $this->options_defaults[ $field['id'] ] = $field['default'];
325
+                                        } else {
326
+                                            $this->options_defaults[ $field['id'] ] = $this->field_default( $field );
327
+                                        }
328
+
329
+                                        foreach ( $box['post_types'] as $type ) {
330
+                                            $this->post_type_fields[ $type ][ $field['id'] ] = 1;
331
+
332
+                                            if ( 'repeater' === $field['type'] ) {
333
+                                                foreach ( $field['fields'] as $val ) {
334
+                                                    $this->post_type_fields[ $type ][ $val['id'] ] = 1;
335
+                                                }
336
+                                            }
337
+                                        }
338
+
339
+                                        if ( ! empty( $field['output'] ) ) {
340
+                                            $this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
341
+                                        }
342
+
343
+                                        // Detect what field types are being used.
344
+                                        if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
345
+                                            $this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
346
+                                        } else {
347
+                                            $this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
348
+                                        }
349
+
350
+                                        if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
351
+                                            $this->to_replace[ $field['id'] ] = $field;
352
+                                        }
353
+                                    }
354
+
355
+                                    if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
356
+                                        $this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
357
+                                    }
358
+
359
+                                    if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
360
+                                        $this->meta[ $this->post_id ][ $field['id'] ] = $this->options_defaults[ $field['id'] ];
361
+                                    }
362
+
363
+                                    // Only override if it exists, and it's not the default.
364
+                                    // phpcs:ignore Squiz.PHP.CommentedOutCode
365
+                                    // if ( isset( $this->meta[ $this->post_id ][ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $this->post_id ][ $field['id'] ] === $field['default'] ) {
366
+                                    // unset($this->meta[$this->post_id][$field['id']]);
367
+                                    // } .
368
+                                }
369
+                            }
370
+                        }
371
+                    }
372
+                }
373
+            }
374
+
375
+            if ( isset( $run_hooks ) && true === $run_hooks ) {
376
+                $this->parent_options = array();
377
+
378
+                if ( ! empty( $this->to_replace ) ) {
379
+                    foreach ( $this->to_replace as $id => $field ) {
380
+
381
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
382
+                        add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
383
+                    }
384
+                }
385
+
386
+                add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
387
+                add_filter( "redux/field/{$this->parent->args['opt_name']}/_can_output_css", array( $this, 'override_can_output_css' ) );
388
+                add_filter( "redux/field/{$this->parent->args['opt_name']}/output_css", array( $this, 'output_css' ) );
389
+            }
390
+        }
391
+
392
+        /**
393
+         * Replace Field.
394
+         *
395
+         * @param array $field Field array.
396
+         *
397
+         * @return mixed
398
+         */
399
+        public function replace_field( array $field ) {
400
+            if ( isset( $this->to_replace[ $field['id'] ] ) ) {
401
+                $field = $this->to_replace[ $field['id'] ];
402
+            }
403
+
404
+            return $field;
405
+        }
406
+
407
+        /**
408
+         * Override CSS output.
409
+         *
410
+         * @param array $field Field array.
411
+         *
412
+         * @return array
413
+         */
414
+        public function override_can_output_css( array $field ): array {
415
+            if ( isset( $this->output[ $field['id'] ] ) ) {
416
+                $field['force_output'] = true;
417
+            }
418
+
419
+            return $field;
420
+        }
421
+
422
+        /**
423
+         * Output CSS.
424
+         *
425
+         * @param array $field Field array.
426
+         *
427
+         * @return array
428
+         */
429
+        public function output_css( array $field ): array {
430
+            if ( isset( $this->output[ $field['id'] ] ) ) {
431
+                $field['output'] = $this->output[ $field['id'] ];
432
+            }
433
+
434
+            return $field;
435
+        }
436
+
437
+        /**
438
+         * Make sure the defaults are the defaults
439
+         *
440
+         * @param array $options Options array.
441
+         *
442
+         * @return array
443
+         */
444
+        public function override_options( array $options ): array {
445
+            $this->parent->default_values();
446
+            $this->parent_defaults = $this->parent->options_defaults;
447
+
448
+            $meta = $this->get_meta( $this->post_id );
449
+            $data = wp_parse_args( $meta, $this->options_defaults );
450
+
451
+            foreach ( $data as $key => $value ) {
452
+                if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
453
+                    $data[ $key ] = $meta[ $key ];
454
+                    continue;
455
+                }
456
+
457
+                if ( isset( $options[ $key ] ) ) {
458
+                    $data[ $key ] = $options[ $key ];
459
+                }
460
+            }
461
+
462
+            $this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
463
+
464
+            return wp_parse_args( $data, $options );
465
+        }
466
+
467
+        /**
468
+         * Loop start.
469
+         *
470
+         * @param mixed $the_post WP_Post object.
471
+         *
472
+         * @return array|void
473
+         */
474
+        public function loop_start( $the_post = array() ) {
475
+            if ( is_admin() ) {
476
+                return $the_post;
477
+            }
478
+
479
+            if ( isset( $the_post ) && is_array( $the_post ) ) {
480
+                global $post;
481
+                $the_post = $post;
482
+            }
483
+
484
+            if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
485
+                $GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
486
+                unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
487
+            }
488
+
489
+            // Override these values if they differ from the admin panel defaults.  ;) .
490
+            if ( in_array( $the_post->post_type, $this->post_types, true ) ) {
491
+                $meta = $this->get_meta( $the_post->ID );
492
+                if ( empty( $meta ) ) {
493
+                    return;
494
+                }
495
+
496
+                // Backup the args.
497
+                $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] = $GLOBALS[ $this->parent->args['global_variable'] ];
498
+                $GLOBALS[ $this->parent->args['global_variable'] ]           = wp_parse_args( $meta, $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
499
+            }
500
+        }
501
+
502
+        /**
503
+         * Loop end.
504
+         */
505
+        public function loop_end() {
506
+            if ( isset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] ) ) {
507
+                $GLOBALS[ $this->parent->args['global_variable'] ] = $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ];
508
+
509
+                unset( $GLOBALS[ $this->parent->args['global_variable'] . '-loop' ] );
510
+            }
511
+        }
512
+
513
+        /**
514
+         * Enqueue fields.
515
+         */
516
+        public function enqueue() {
517
+            global $pagenow;
518
+
519
+            $types = array();
520
+
521
+            // Enqueue CSS.
522
+            foreach ( $this->boxes as $key => $box ) {
523
+                if ( empty( $box['sections'] ) ) {
524
+                    continue;
525
+                }
526
+
527
+                if ( isset( $box['post_types'] ) ) {
528
+                    $types = array_merge( $box['post_types'], $types );
529
+                }
530
+
531
+                if ( ! empty( $box['post_types'] ) ) {
532
+                    if ( ! is_array( $box['post_types'] ) ) {
533
+                        $box['post_types']                 = array( $box['post_types'] );
534
+                        $this->boxes[ $key ]['post_types'] = $box['post_types'];
535
+                    }
536
+                }
537
+            }
538
+
539
+            if ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) {
540
+                global $post;
541
+
542
+                if ( in_array( $post->post_type, $types, true ) ) {
543
+                    $this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-metaboxes' );
544
+                    $this->parent->transients_check = $this->parent->transients;
545
+
546
+                    if ( isset( $this->parent->transients['notices'] ) ) {
547
+                        $this->notices                              = $this->parent->transients['notices'];
548
+                        $this->parent->transients['last_save_mode'] = 'metaboxes';
549
+                    }
550
+
551
+                    delete_transient( $this->parent->args['opt_name'] . '-transients-metaboxes' );
552
+                    $this->parent->enqueue_class->init();
553
+
554
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
555
+                    do_action( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue" );
556
+
557
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
558
+                    do_action( "redux/{$this->parent->args['opt_name']}/extensions/metaboxes/enqueue" );
559
+
560
+                    /**
561
+                     * Redux metaboxes CSS
562
+                     * filter 'redux/page/{opt_name}/enqueue/redux-extension-metaboxes-css'
563
+                     */
564
+                    if ( $this->parent->args['dev_mode'] ) {
565
+                        wp_enqueue_style(
566
+                            'redux-extension-metaboxes',
567
+                            apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue/redux-extension-metaboxes-css", $this->extension_url . 'redux-extension-metaboxes.css' ), // phpcs:ignore: WordPress.NamingConventions.ValidHookName
568
+                            array(),
569
+                            self::$version
570
+                        );
571
+                    }
572
+
573
+                    /**
574
+                     * Redux metaboxes JS
575
+                     * filter 'redux/page/{opt_name}/enqueue/redux-extension-metaboxes-js
576
+                     */
577
+                    wp_enqueue_script(
578
+                        'redux-extension-metaboxes',
579
+                        apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/enqueue/redux-extension-metaboxes-js", $this->extension_url . 'redux-extension-metaboxes' . Redux_Functions::isMin() . '.js' ), // phpcs:ignore: WordPress.NamingConventions.ValidHookName
580
+                        array( 'jquery', 'redux-js' ),
581
+                        self::$version,
582
+                        true
583
+                    );
584
+
585
+                    // Values used by the javascript.
586
+                    wp_localize_script(
587
+                        'redux-extension-metaboxes',
588
+                        'reduxMetaboxes',
589
+                        $this->wp_links
590
+                    );
591
+
592
+                    wp_localize_script(
593
+                        'redux-extension-metaboxes',
594
+                        'reduxMetaboxesPageTemplate',
595
+                        array(
596
+                            '_wp_page_template' => get_post_meta( get_the_ID(), '_wp_page_template', true ),
597
+                        )
598
+                    );
599
+                }
600
+            }
601
+        }
602
+
603
+        /* Post URLs to IDs function, supports custom post types - borrowed and modified from url_to_postid() in wp-includes/rewrite.php */
604
+
605
+        // Taken from http://betterwp.net/wordpress-tips/url_to_postid-for-custom-post-types/
606
+        // Customized to work with non-rewrite URLs
607
+        // Modified by Dovy Paukstys (@dovy) of Redux Framework.
608
+
609
+        /**
610
+         * URL to PostID.
611
+         *
612
+         * @param string $url URL.
613
+         *
614
+         * @return int|mixed|void
615
+         */
616
+        private function url_to_postid( string $url ) {
617
+            global $wp_rewrite, $pagenow;
618
+
619
+            if ( ! empty( $this->post_id ) ) {
620
+                return $this->post_id;
621
+            }
622
+
623
+            if ( isset( $_GET['post'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification
624
+                $post = (int) sanitize_text_field( wp_unslash( $_GET['post'] ) );  // phpcs:ignore WordPress.Security.NonceVerification
625
+
626
+                if ( ! empty( $post ) ) {
627
+                    return $post;
628
+                }
629
+            }
630
+
631
+            if ( 'post-new.php' === $pagenow || 'wp-login.php' === $pagenow ) {
632
+                return;
633
+            }
634
+
635
+            if ( is_admin() && 'post.php' === $pagenow && isset( $_POST['post_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
636
+                $post_id = sanitize_text_field( wp_unslash( $_POST['post_ID'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
637
+
638
+                if ( ! empty( $post_id ) && is_numeric( $post_id ) ) {
639
+                    return $post_id;
640
+                }
641
+            }
642
+
643
+            $post_id = url_to_postid( $url );
644
+
645
+            if ( isset( $post_id ) && '' !== (string) $post_id && 0 !== $post_id ) {
646
+                return $post_id;
647
+            }
648
+
649
+            // First, check to see if there is a 'p=N' or 'page_id=N' to match against.
650
+            if ( preg_match( '#[?&](p|page_id|attachment_id)=(\d+)#', $url, $values ) ) {
651
+                $id = absint( $values[2] );
652
+                if ( $id ) {
653
+                    return $id;
654
+                }
655
+            }
656
+
657
+            // Check to see if we are using rewrite rules.
658
+            if ( isset( $wp_rewrite ) ) {
659
+                $rewrite = $wp_rewrite->wp_rewrite_rules();
660
+            }
661
+
662
+            // Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options.
663
+            if ( empty( $rewrite ) ) {
664
+                if ( ! empty( $_GET ) ) { // phpcs:ignore WordPress.Security.NonceVerification
665
+
666
+                    /************************************************************************
667 667
 					 * ADDED: Trys checks URL for ?posttype=postname
668 668
 					 ************************************************************************ */
669 669
 
670
-					// Assign $url to $temp_url just in case. :) .
671
-					$temp_url = $url;
672
-
673
-					// Get rid of the #anchor.
674
-					$url_split = explode( '#', $temp_url );
675
-					$temp_url  = $url_split[0];
676
-
677
-					// Get rid of URL ?query=string.
678
-					$url_query = explode( '&', $temp_url );
679
-					$temp_url  = $url_query[0];
680
-
681
-					// Get rid of ? mark.
682
-					$url_query = explode( '?', $temp_url );
683
-
684
-					if ( ! empty( $url_query[1] ) && strpos( $url_query[1], '=' ) ) {
685
-						$url_query = explode( '=', $url_query[1] );
686
-
687
-						if ( isset( $url_query[0] ) && isset( $url_query[1] ) ) {
688
-							$args = array(
689
-								'name'      => $url_query[1],
690
-								'post_type' => $url_query[0],
691
-								'showposts' => 1,
692
-							);
693
-
694
-							if ( get_posts( $args ) === $post ) {
695
-								return $post[0]->ID;
696
-							}
697
-						}
698
-					}
699
-
700
-					foreach ( $GLOBALS['wp_post_types'] as $key => $value ) {
701
-						if ( ! empty( $_GET[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
702
-							$args = array(
703
-								'name'      => sanitize_text_field( wp_unslash( $_GET[ $key ] ) ), // phpcs:ignore WordPress.Security.NonceVerification
704
-								'post_type' => $key,
705
-								'showposts' => 1,
706
-							);
707
-
708
-							if ( get_posts( $args ) === $post ) {
709
-								return $post[0]->ID;
710
-							}
711
-						}
712
-					}
713
-				}
714
-			}
715
-
716
-			// Get rid of the #anchor.
717
-			$url_split = explode( '#', $url );
718
-			$url       = $url_split[0];
719
-
720
-			// Get rid of URL ?query=string.
721
-			$url_query = explode( '?', $url );
722
-			$url       = $url_query[0];
723
-
724
-			// Set the correct URL scheme.
725
-			$scheme = wp_parse_url( home_url(), PHP_URL_SCHEME );
726
-			$url    = set_url_scheme( $url, $scheme );
727
-
728
-			// Add 'www.' if it is absent and should be there.
729
-			if ( false !== strpos( home_url(), '://www.' ) && false === strpos( $url, '://www.' ) ) {
730
-				$url = str_replace( '://', '://www.', $url );
731
-			}
732
-
733
-			// Strip 'www.' if it is present and shouldn't be.
734
-			if ( false === strpos( home_url(), '://www.' ) ) {
735
-				$url = str_replace( '://www.', '://', $url );
736
-			}
737
-
738
-			// Strip 'index.php/' if we're not using path info permalinks.
739
-			if ( isset( $wp_rewrite ) && ! $wp_rewrite->using_index_permalinks() ) {
740
-				$url = str_replace( 'index.php/', '', $url );
741
-			}
742
-
743
-			if ( false !== strpos( $url, home_url() ) ) {
744
-				// Chop off http://domain.com.
745
-				$url = str_replace( home_url(), '', $url );
746
-			} else {
747
-				// Chop off /path/to/blog.
748
-				$home_path = wp_parse_url( home_url() );
749
-				$home_path = $home_path['path'] ?? '';
750
-				$url       = str_replace( $home_path, '', $url );
751
-			}
752
-
753
-			// Trim leading and lagging slashes.
754
-			$url = trim( $url, '/' );
755
-
756
-			$request = $url;
757
-
758
-			if ( empty( $request ) && ( empty( $_GET ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
759
-				return get_option( 'page_on_front' );
760
-			}
761
-
762
-			// Look for matches.
763
-			$request_match = $request;
764
-
765
-			foreach ( $rewrite as $match => $query ) {
766
-				// If the requesting file is the anchor of the match, prepend it
767
-				// to the path info.
768
-				if ( ! empty( $url ) && ( $url !== $request ) && ( strpos( $match, $url ) === 0 ) ) {
769
-					$request_match = $url . '/' . $request;
770
-				}
771
-
772
-				if ( preg_match( "!^$match!", $request_match, $matches ) ) {
773
-					global $wp;
774
-
775
-					// Got a match.
776
-					// Trim the query of everything up to the '?'.
777
-					$query = preg_replace( '!^.+\?!', '', $query );
778
-
779
-					// Substitute the substring matches into the query.
780
-					$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );
781
-
782
-					// Filter out non-public query vars.
783
-					parse_str( $query, $query_vars );
784
-
785
-					$query = array();
786
-
787
-					foreach ( $query_vars as $key => $value ) {
788
-						if ( in_array( $key, $wp->public_query_vars, true ) ) {
789
-							$query[ $key ] = $value;
790
-						}
791
-					}
792
-
793
-					/************************************************************************
670
+                    // Assign $url to $temp_url just in case. :) .
671
+                    $temp_url = $url;
672
+
673
+                    // Get rid of the #anchor.
674
+                    $url_split = explode( '#', $temp_url );
675
+                    $temp_url  = $url_split[0];
676
+
677
+                    // Get rid of URL ?query=string.
678
+                    $url_query = explode( '&', $temp_url );
679
+                    $temp_url  = $url_query[0];
680
+
681
+                    // Get rid of ? mark.
682
+                    $url_query = explode( '?', $temp_url );
683
+
684
+                    if ( ! empty( $url_query[1] ) && strpos( $url_query[1], '=' ) ) {
685
+                        $url_query = explode( '=', $url_query[1] );
686
+
687
+                        if ( isset( $url_query[0] ) && isset( $url_query[1] ) ) {
688
+                            $args = array(
689
+                                'name'      => $url_query[1],
690
+                                'post_type' => $url_query[0],
691
+                                'showposts' => 1,
692
+                            );
693
+
694
+                            if ( get_posts( $args ) === $post ) {
695
+                                return $post[0]->ID;
696
+                            }
697
+                        }
698
+                    }
699
+
700
+                    foreach ( $GLOBALS['wp_post_types'] as $key => $value ) {
701
+                        if ( ! empty( $_GET[ $key ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
702
+                            $args = array(
703
+                                'name'      => sanitize_text_field( wp_unslash( $_GET[ $key ] ) ), // phpcs:ignore WordPress.Security.NonceVerification
704
+                                'post_type' => $key,
705
+                                'showposts' => 1,
706
+                            );
707
+
708
+                            if ( get_posts( $args ) === $post ) {
709
+                                return $post[0]->ID;
710
+                            }
711
+                        }
712
+                    }
713
+                }
714
+            }
715
+
716
+            // Get rid of the #anchor.
717
+            $url_split = explode( '#', $url );
718
+            $url       = $url_split[0];
719
+
720
+            // Get rid of URL ?query=string.
721
+            $url_query = explode( '?', $url );
722
+            $url       = $url_query[0];
723
+
724
+            // Set the correct URL scheme.
725
+            $scheme = wp_parse_url( home_url(), PHP_URL_SCHEME );
726
+            $url    = set_url_scheme( $url, $scheme );
727
+
728
+            // Add 'www.' if it is absent and should be there.
729
+            if ( false !== strpos( home_url(), '://www.' ) && false === strpos( $url, '://www.' ) ) {
730
+                $url = str_replace( '://', '://www.', $url );
731
+            }
732
+
733
+            // Strip 'www.' if it is present and shouldn't be.
734
+            if ( false === strpos( home_url(), '://www.' ) ) {
735
+                $url = str_replace( '://www.', '://', $url );
736
+            }
737
+
738
+            // Strip 'index.php/' if we're not using path info permalinks.
739
+            if ( isset( $wp_rewrite ) && ! $wp_rewrite->using_index_permalinks() ) {
740
+                $url = str_replace( 'index.php/', '', $url );
741
+            }
742
+
743
+            if ( false !== strpos( $url, home_url() ) ) {
744
+                // Chop off http://domain.com.
745
+                $url = str_replace( home_url(), '', $url );
746
+            } else {
747
+                // Chop off /path/to/blog.
748
+                $home_path = wp_parse_url( home_url() );
749
+                $home_path = $home_path['path'] ?? '';
750
+                $url       = str_replace( $home_path, '', $url );
751
+            }
752
+
753
+            // Trim leading and lagging slashes.
754
+            $url = trim( $url, '/' );
755
+
756
+            $request = $url;
757
+
758
+            if ( empty( $request ) && ( empty( $_GET ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
759
+                return get_option( 'page_on_front' );
760
+            }
761
+
762
+            // Look for matches.
763
+            $request_match = $request;
764
+
765
+            foreach ( $rewrite as $match => $query ) {
766
+                // If the requesting file is the anchor of the match, prepend it
767
+                // to the path info.
768
+                if ( ! empty( $url ) && ( $url !== $request ) && ( strpos( $match, $url ) === 0 ) ) {
769
+                    $request_match = $url . '/' . $request;
770
+                }
771
+
772
+                if ( preg_match( "!^$match!", $request_match, $matches ) ) {
773
+                    global $wp;
774
+
775
+                    // Got a match.
776
+                    // Trim the query of everything up to the '?'.
777
+                    $query = preg_replace( '!^.+\?!', '', $query );
778
+
779
+                    // Substitute the substring matches into the query.
780
+                    $query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );
781
+
782
+                    // Filter out non-public query vars.
783
+                    parse_str( $query, $query_vars );
784
+
785
+                    $query = array();
786
+
787
+                    foreach ( $query_vars as $key => $value ) {
788
+                        if ( in_array( $key, $wp->public_query_vars, true ) ) {
789
+                            $query[ $key ] = $value;
790
+                        }
791
+                    }
792
+
793
+                    /************************************************************************
794 794
 					 * ADDED: $GLOBALS['wp_post_types'] doesn't seem to have custom posttypes
795 795
 					 * Trying below to find posttypes in $rewrite rules
796 796
 					 ************************************************************************ */
797 797
 
798
-					// PostType Array.
799
-					$post_types = array();
800
-
801
-					foreach ( $rewrite as $value ) {
802
-						if ( preg_match( '/post_type=([^&]+)/i', $value, $matched ) ) {
803
-							if ( isset( $matched[1] ) && ! in_array( $matched[1], $post_types, true ) ) {
804
-								$post_types[] = $matched[1];
805
-							}
806
-						}
807
-					}
808
-
809
-					foreach ( $query_vars as $key => $value ) {
810
-						if ( in_array( $key, $post_types, true ) ) {
811
-							$query['post_type'] = $key;
812
-							$query['postname']  = $value;
813
-						}
814
-					}
815
-
816
-					/************************************************************************
798
+                    // PostType Array.
799
+                    $post_types = array();
800
+
801
+                    foreach ( $rewrite as $value ) {
802
+                        if ( preg_match( '/post_type=([^&]+)/i', $value, $matched ) ) {
803
+                            if ( isset( $matched[1] ) && ! in_array( $matched[1], $post_types, true ) ) {
804
+                                $post_types[] = $matched[1];
805
+                            }
806
+                        }
807
+                    }
808
+
809
+                    foreach ( $query_vars as $key => $value ) {
810
+                        if ( in_array( $key, $post_types, true ) ) {
811
+                            $query['post_type'] = $key;
812
+                            $query['postname']  = $value;
813
+                        }
814
+                    }
815
+
816
+                    /************************************************************************
817 817
 					 * END ADD
818 818
 					 ************************************************************************ */
819 819
 
820
-					// Taken from class-wp.php.
821
-					foreach ( $GLOBALS['wp_post_types'] as $post_type => $t ) {
822
-						if ( isset( $t->query_var ) ) {
823
-							$post_type_query_vars[ $t->query_var ] = $post_type;
824
-						}
825
-					}
826
-
827
-					foreach ( $wp->public_query_vars as $wpvar ) {
828
-						if ( isset( $wp->extra_query_vars[ $wpvar ] ) ) {
829
-							$query[ $wpvar ] = $wp->extra_query_vars[ $wpvar ];
830
-						} elseif ( isset( $_POST[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
831
-							$query[ $wpvar ] = sanitize_text_field( wp_unslash( $_POST[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
832
-						} elseif ( isset( $_GET[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
833
-							$query[ $wpvar ] = sanitize_text_field( wp_unslash( $_GET[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
834
-						} elseif ( isset( $query_vars[ $wpvar ] ) ) {
835
-							$query[ $wpvar ] = $query_vars[ $wpvar ];
836
-						}
837
-
838
-						if ( ! empty( $query[ $wpvar ] ) ) {
839
-							if ( ! is_array( $query[ $wpvar ] ) ) {
840
-								$query[ $wpvar ] = (string) $query[ $wpvar ];
841
-							} else {
842
-								foreach ( $query[ $wpvar ] as $vkey => $v ) {
843
-									if ( ! is_object( $v ) ) {
844
-										$query[ $wpvar ][ $vkey ] = (string) $v;
845
-									}
846
-								}
847
-							}
848
-
849
-							if ( isset( $post_type_query_vars[ $wpvar ] ) ) {
850
-								$query['post_type'] = $post_type_query_vars[ $wpvar ];
851
-								$query['name']      = $query[ $wpvar ];
852
-							}
853
-						}
854
-					}
855
-
856
-					// Do the query.
857
-					if ( ! empty( $query['pagename'] ) ) {
858
-						$args = array(
859
-							'name'      => $query['pagename'],
860
-							'post_type' => 'page',
861
-							'showposts' => 1,
862
-						);
863
-
864
-						if ( isset( $post ) && get_posts( $args ) === $post ) {
865
-							return $post[0]->ID;
866
-						}
867
-					}
868
-
869
-					$query = new WP_Query( $query );
870
-
871
-					if ( ! empty( $query->posts ) && $query->is_singular ) {
872
-						return $query->post->ID;
873
-					} else {
874
-
875
-						// WooCommerce override.
876
-						if ( isset( $query->query['post_type'] ) && 'product' === $query->query['post_type'] && class_exists( 'WooCommerce' ) ) {
877
-							return get_option( 'woocommerce_shop_page_id' );
878
-						}
879
-					}
880
-
881
-					if ( ( empty( $query->page ) ) && ( empty( $query->pagename ) ) ) {
882
-						return 0;
883
-					}
884
-				}
885
-			}
886
-
887
-			return 0;
888
-		}
889
-
890
-		/**
891
-		 * Get default values.
892
-		 */
893
-		public function default_values() {
894
-			if ( ! empty( $this->boxes ) && empty( $this->options_defaults ) ) {
895
-				foreach ( $this->boxes as $key => $box ) {
896
-					if ( empty( $box['sections'] ) ) {
897
-						continue;
898
-					}
899
-
900
-					// fill the cache.
901
-					foreach ( $box['sections'] as $sk => $section ) {
902
-						if ( ! isset( $section['id'] ) ) {
903
-							if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
904
-								$section['id'] = $sk;
905
-							} else {
906
-								$section['id'] = sanitize_text_field( $section['title'] );
907
-							}
908
-							$this->boxes[ $key ]['sections'][ $sk ] = $section;
909
-						}
910
-						if ( isset( $section['fields'] ) ) {
911
-							foreach ( $section['fields'] as $k => $field ) {
912
-
913
-								if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
914
-									continue;
915
-								}
916
-
917
-								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
918
-									$this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
919
-									unset( $this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
920
-								}
921
-
922
-								if ( 'section' === $field['type'] && isset( $field['indent'] ) && ( true === $field['indent'] || 'true' === $field['indent'] ) ) {
923
-									$field['class']  = $field['class'] ?? '';
924
-									$field['class'] .= 'redux-section-indent-start';
925
-
926
-									$this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
927
-								}
928
-
929
-								if ( ! isset( $this->parent->options_defaults_class ) ) {
930
-									$this->parent->options_defaults_class = new Redux_Options_Defaults();
931
-								}
932
-
933
-								$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
934
-
935
-								if ( 'repeater' === $field['type'] ) {
936
-									foreach ( $field['fields'] as $f ) {
937
-										$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
938
-									}
939
-								}
940
-
941
-								$this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
942
-							}
943
-						}
944
-					}
945
-				}
946
-			}
947
-
948
-			if ( empty( $this->meta[ $this->post_id ] ) ) {
949
-				$this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
950
-			}
951
-		}
952
-
953
-		/**
954
-		 * Add Meta Boxes
955
-		 */
956
-		public function add() {
957
-			if ( empty( $this->boxes ) || ! is_array( $this->boxes ) ) {
958
-				return;
959
-			}
960
-
961
-			foreach ( $this->boxes as $key => $box ) {
962
-				if ( empty( $box['sections'] ) ) {
963
-					continue;
964
-				}
965
-
966
-				// Save users from themselves.
967
-				if ( isset( $box['position'] ) && ! in_array( strtolower( $box['position'] ), array( 'normal', 'advanced', 'side' ), true ) ) {
968
-					unset( $box['position'] );
969
-				}
970
-
971
-				if ( isset( $box['priority'] ) && ! in_array( strtolower( $box['priority'] ), array( 'high', 'core', 'default', 'low' ), true ) ) {
972
-					unset( $box['priority'] );
973
-				}
974
-
975
-				$defaults = array(
976
-					'id'         => $key . '-' . $this->parent->args['opt_name'],
977
-					'post_types' => array( 'page', 'post' ),
978
-					'position'   => 'normal',
979
-					'priority'   => 'high',
980
-				);
981
-
982
-				$box = wp_parse_args( $box, $defaults );
983
-				if ( ! empty( $box['post_types'] ) ) {
984
-					foreach ( $box['post_types'] as $posttype ) {
985
-						if ( isset( $box['title'] ) ) {
986
-							$title = $box['title'];
987
-						} elseif ( isset( $box['sections'] ) && 1 === count( $box['sections'] ) && isset( $box['sections'][0]['fields'] ) && 1 === count( $box['sections'][0]['fields'] ) && isset( $box['sections'][0]['fields'][0]['title'] ) ) {
988
-
989
-								// If only one field in this box.
990
-								$title = $box['sections'][0]['fields'][0]['title'];
991
-						} else {
992
-							$title = ucfirst( $posttype ) . ' ' . __( 'Options', 'redux-framework' );
993
-						}
994
-
995
-						$args = array(
996
-							'position' => $box['position'],
997
-							'sections' => $box['sections'],
998
-							'key'      => $key,
999
-						);
1000
-
1001
-						// Override the parent args on a metabox level.
1002
-						if ( empty( $this->orig_args ) ) {
1003
-							$this->orig_args = $this->parent->args;
1004
-						}
1005
-
1006
-						if ( isset( $box['args'] ) ) {
1007
-							$this->parent->args = wp_parse_args( $box['args'], $this->orig_args );
1008
-						} elseif ( $this->parent->args !== $this->orig_args ) {
1009
-							$this->parent->args = $this->orig_args;
1010
-						}
1011
-
1012
-						add_filter( 'postbox_classes_' . $posttype . '_redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], array( $this, 'add_box_classes' ) );
1013
-
1014
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
1015
-						do_action( 'redux/' . $this->parent->args['opt_name'] . '/extensions/metabox/add', $this, $box, $posttype );
1016
-
1017
-						if ( isset( $box['post_format'] ) ) {
1018
-							add_filter( 'postbox_classes_' . $posttype . '_redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], array( $this, 'add_box_hide_class' ) );
1019
-						}
1020
-
1021
-						// phpcs:ignore Generic.Strings.UnnecessaryStringConcat
1022
-						call_user_func( 'add' . '_meta' . '_box', 'redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], $title, array( $this, 'generate_boxes' ), $posttype, $box['position'], $box['priority'], $args );
1023
-					}
1024
-				}
1025
-			}
1026
-		}
1027
-
1028
-		/**
1029
-		 * Add hidden class to metabox DIV.
1030
-		 *
1031
-		 * @param array $classes Class array.
1032
-		 *
1033
-		 * @return array
1034
-		 */
1035
-		public function add_box_hide_class( array $classes ): array {
1036
-			$classes[] = 'hide';
1037
-
1038
-			return $classes;
1039
-		}
1040
-
1041
-		/**
1042
-		 * Field Defaults.
1043
-		 *
1044
-		 * @param mixed $field_id ID.
1045
-		 *
1046
-		 * @return mixed|string
1047
-		 */
1048
-		private function field_default( $field_id ) {
1049
-			if ( ! isset( $this->parent->options_defaults ) ) {
1050
-				$this->parent->options_defaults = $this->parent->default_values();
1051
-			}
1052
-
1053
-			if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
1054
-				if ( ! isset( $this->parent->options_class ) ) {
1055
-					$this->parent->options_class = new Redux_Options_Constructor( $this->parent );
1056
-				}
1057
-
1058
-				$this->parent->options_class->get();
1059
-			}
1060
-
1061
-			$this->options = $this->parent->options;
1062
-
1063
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
1064
-				return $this->parent->options[ $field_id['id'] ];
1065
-			} else {
1066
-				if ( empty( $this->options_defaults ) ) {
1067
-					$this->default_values(); // fill cache.
1068
-				}
1069
-
1070
-				$data = '';
1071
-				if ( ! empty( $this->options_defaults ) ) {
1072
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
1073
-				}
1074
-
1075
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
1076
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
1077
-				}
1078
-
1079
-				return $data;
1080
-			}
1081
-		}
1082
-
1083
-		/**
1084
-		 * Function to get and cache the post meta.
1085
-		 *
1086
-		 * @param mixed $id ID.
1087
-		 *
1088
-		 * @return array
1089
-		 */
1090
-		private function get_meta( $id ): array {
1091
-			if ( ! isset( $this->meta[ $id ] ) ) {
1092
-				$this->meta[ $id ] = array();
1093
-				$o_data            = get_post_meta( $id );
1094
-
1095
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
1096
-				$o_data = apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/get_meta", $o_data );
1097
-
1098
-				if ( ! empty( $o_data ) ) {
1099
-					foreach ( $o_data as $key => $value ) {
1100
-						if ( 1 === count( $value ) ) {
1101
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
1102
-						} else {
1103
-							$new_value = array_map( 'maybe_unserialize', $value );
1104
-
1105
-							$this->meta[ $id ][ $key ] = $new_value[0];
1106
-						}
1107
-					}
1108
-				}
1109
-
1110
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
1111
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1112
-
1113
-					foreach ( $data as $key => $value ) {
1114
-						$this->meta[ $id ][ $key ] = $value;
1115
-						update_post_meta( $id, $key, $value );
1116
-					}
1117
-
1118
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1119
-
1120
-					delete_post_meta( $id, $this->parent->args['opt_name'] );
1121
-				}
1122
-			}
1123
-
1124
-			return $this->meta[ $id ];
1125
-		}
1126
-
1127
-		/**
1128
-		 * Get values.
1129
-		 *
1130
-		 * @param mixed  $the_post Post object/id.
1131
-		 * @param string $meta_key Meta key.
1132
-		 * @param mixed  $def_val  Def value.
1133
-		 *
1134
-		 * @return array|mixed|string
1135
-		 */
1136
-		public function get_values( $the_post, string $meta_key = '', $def_val = '' ) {
1137
-
1138
-			// Override these values if they differ from the admin panel defaults.  ;) .
1139
-			if ( isset( $the_post->post_type ) && in_array( $the_post->post_type, $this->post_types, true ) ) {
1140
-				if ( isset( $this->post_type_values[ $the_post->post_type ] ) ) {
1141
-					$meta = $this->post_type_fields[ $the_post->post_type ];
1142
-				} else {
1143
-					$defaults = array();
1144
-					if ( ! empty( $this->post_type_fields[ $the_post->post_type ] ) ) {
1145
-						foreach ( $this->post_type_fields[ $the_post->post_type ] as $key => $null ) {
1146
-							if ( isset( $this->options_defaults[ $key ] ) ) {
1147
-								$defaults[ $key ] = $this->options_defaults[ $key ];
1148
-							}
1149
-						}
1150
-					}
1151
-
1152
-					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
1153
-
1154
-					$this->post_type_fields[ $the_post->post_type ] = $meta;
1155
-				}
1156
-
1157
-				if ( ! empty( $meta_key ) ) {
1158
-					if ( ! isset( $meta[ $meta_key ] ) ) {
1159
-						$meta[ $meta_key ] = $def_val;
1160
-					}
1161
-
1162
-					return $meta[ $meta_key ];
1163
-				} else {
1164
-					return $meta;
1165
-				}
1166
-			}
1167
-
1168
-			return $def_val;
1169
-		}
1170
-
1171
-		/**
1172
-		 * Generate Boxes.
1173
-		 *
1174
-		 * @param mixed $post Post.
1175
-		 * @param array $metabox Metabox array.
1176
-		 */
1177
-		public function generate_boxes( $post, array $metabox ) {
1178
-			if ( ! empty( $metabox['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metabox['args']['permissions'] ) ) {
1179
-				return;
1180
-			}
1181
-
1182
-			$sections = $metabox['args']['sections'];
1183
-
1184
-			wp_nonce_field( 'redux_metaboxes_meta_nonce', 'redux_metaboxes_meta_nonce' );
1185
-
1186
-			wp_dequeue_script( 'json-view-js' );
1187
-
1188
-			$sidebar = true;
1189
-
1190
-			if ( 'side' === $metabox['args']['position'] || 1 === count( $sections ) || ( isset( $metabox['args']['sidebar'] ) && false === $metabox['args']['sidebar'] ) ) {
1191
-				$sidebar = false; // Show the section dividers or not.
1192
-			}
1193
-
1194
-			?>
820
+                    // Taken from class-wp.php.
821
+                    foreach ( $GLOBALS['wp_post_types'] as $post_type => $t ) {
822
+                        if ( isset( $t->query_var ) ) {
823
+                            $post_type_query_vars[ $t->query_var ] = $post_type;
824
+                        }
825
+                    }
826
+
827
+                    foreach ( $wp->public_query_vars as $wpvar ) {
828
+                        if ( isset( $wp->extra_query_vars[ $wpvar ] ) ) {
829
+                            $query[ $wpvar ] = $wp->extra_query_vars[ $wpvar ];
830
+                        } elseif ( isset( $_POST[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
831
+                            $query[ $wpvar ] = sanitize_text_field( wp_unslash( $_POST[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
832
+                        } elseif ( isset( $_GET[ $wpvar ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
833
+                            $query[ $wpvar ] = sanitize_text_field( wp_unslash( $_GET[ $wpvar ] ) ); // phpcs:ignore WordPress.Security.NonceVerification
834
+                        } elseif ( isset( $query_vars[ $wpvar ] ) ) {
835
+                            $query[ $wpvar ] = $query_vars[ $wpvar ];
836
+                        }
837
+
838
+                        if ( ! empty( $query[ $wpvar ] ) ) {
839
+                            if ( ! is_array( $query[ $wpvar ] ) ) {
840
+                                $query[ $wpvar ] = (string) $query[ $wpvar ];
841
+                            } else {
842
+                                foreach ( $query[ $wpvar ] as $vkey => $v ) {
843
+                                    if ( ! is_object( $v ) ) {
844
+                                        $query[ $wpvar ][ $vkey ] = (string) $v;
845
+                                    }
846
+                                }
847
+                            }
848
+
849
+                            if ( isset( $post_type_query_vars[ $wpvar ] ) ) {
850
+                                $query['post_type'] = $post_type_query_vars[ $wpvar ];
851
+                                $query['name']      = $query[ $wpvar ];
852
+                            }
853
+                        }
854
+                    }
855
+
856
+                    // Do the query.
857
+                    if ( ! empty( $query['pagename'] ) ) {
858
+                        $args = array(
859
+                            'name'      => $query['pagename'],
860
+                            'post_type' => 'page',
861
+                            'showposts' => 1,
862
+                        );
863
+
864
+                        if ( isset( $post ) && get_posts( $args ) === $post ) {
865
+                            return $post[0]->ID;
866
+                        }
867
+                    }
868
+
869
+                    $query = new WP_Query( $query );
870
+
871
+                    if ( ! empty( $query->posts ) && $query->is_singular ) {
872
+                        return $query->post->ID;
873
+                    } else {
874
+
875
+                        // WooCommerce override.
876
+                        if ( isset( $query->query['post_type'] ) && 'product' === $query->query['post_type'] && class_exists( 'WooCommerce' ) ) {
877
+                            return get_option( 'woocommerce_shop_page_id' );
878
+                        }
879
+                    }
880
+
881
+                    if ( ( empty( $query->page ) ) && ( empty( $query->pagename ) ) ) {
882
+                        return 0;
883
+                    }
884
+                }
885
+            }
886
+
887
+            return 0;
888
+        }
889
+
890
+        /**
891
+         * Get default values.
892
+         */
893
+        public function default_values() {
894
+            if ( ! empty( $this->boxes ) && empty( $this->options_defaults ) ) {
895
+                foreach ( $this->boxes as $key => $box ) {
896
+                    if ( empty( $box['sections'] ) ) {
897
+                        continue;
898
+                    }
899
+
900
+                    // fill the cache.
901
+                    foreach ( $box['sections'] as $sk => $section ) {
902
+                        if ( ! isset( $section['id'] ) ) {
903
+                            if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
904
+                                $section['id'] = $sk;
905
+                            } else {
906
+                                $section['id'] = sanitize_text_field( $section['title'] );
907
+                            }
908
+                            $this->boxes[ $key ]['sections'][ $sk ] = $section;
909
+                        }
910
+                        if ( isset( $section['fields'] ) ) {
911
+                            foreach ( $section['fields'] as $k => $field ) {
912
+
913
+                                if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
914
+                                    continue;
915
+                                }
916
+
917
+                                if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
918
+                                    $this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
919
+                                    unset( $this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
920
+                                }
921
+
922
+                                if ( 'section' === $field['type'] && isset( $field['indent'] ) && ( true === $field['indent'] || 'true' === $field['indent'] ) ) {
923
+                                    $field['class']  = $field['class'] ?? '';
924
+                                    $field['class'] .= 'redux-section-indent-start';
925
+
926
+                                    $this->boxes[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
927
+                                }
928
+
929
+                                if ( ! isset( $this->parent->options_defaults_class ) ) {
930
+                                    $this->parent->options_defaults_class = new Redux_Options_Defaults();
931
+                                }
932
+
933
+                                $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
934
+
935
+                                if ( 'repeater' === $field['type'] ) {
936
+                                    foreach ( $field['fields'] as $f ) {
937
+                                        $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
938
+                                    }
939
+                                }
940
+
941
+                                $this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
942
+                            }
943
+                        }
944
+                    }
945
+                }
946
+            }
947
+
948
+            if ( empty( $this->meta[ $this->post_id ] ) ) {
949
+                $this->meta[ $this->post_id ] = $this->get_meta( $this->post_id );
950
+            }
951
+        }
952
+
953
+        /**
954
+         * Add Meta Boxes
955
+         */
956
+        public function add() {
957
+            if ( empty( $this->boxes ) || ! is_array( $this->boxes ) ) {
958
+                return;
959
+            }
960
+
961
+            foreach ( $this->boxes as $key => $box ) {
962
+                if ( empty( $box['sections'] ) ) {
963
+                    continue;
964
+                }
965
+
966
+                // Save users from themselves.
967
+                if ( isset( $box['position'] ) && ! in_array( strtolower( $box['position'] ), array( 'normal', 'advanced', 'side' ), true ) ) {
968
+                    unset( $box['position'] );
969
+                }
970
+
971
+                if ( isset( $box['priority'] ) && ! in_array( strtolower( $box['priority'] ), array( 'high', 'core', 'default', 'low' ), true ) ) {
972
+                    unset( $box['priority'] );
973
+                }
974
+
975
+                $defaults = array(
976
+                    'id'         => $key . '-' . $this->parent->args['opt_name'],
977
+                    'post_types' => array( 'page', 'post' ),
978
+                    'position'   => 'normal',
979
+                    'priority'   => 'high',
980
+                );
981
+
982
+                $box = wp_parse_args( $box, $defaults );
983
+                if ( ! empty( $box['post_types'] ) ) {
984
+                    foreach ( $box['post_types'] as $posttype ) {
985
+                        if ( isset( $box['title'] ) ) {
986
+                            $title = $box['title'];
987
+                        } elseif ( isset( $box['sections'] ) && 1 === count( $box['sections'] ) && isset( $box['sections'][0]['fields'] ) && 1 === count( $box['sections'][0]['fields'] ) && isset( $box['sections'][0]['fields'][0]['title'] ) ) {
988
+
989
+                                // If only one field in this box.
990
+                                $title = $box['sections'][0]['fields'][0]['title'];
991
+                        } else {
992
+                            $title = ucfirst( $posttype ) . ' ' . __( 'Options', 'redux-framework' );
993
+                        }
994
+
995
+                        $args = array(
996
+                            'position' => $box['position'],
997
+                            'sections' => $box['sections'],
998
+                            'key'      => $key,
999
+                        );
1000
+
1001
+                        // Override the parent args on a metabox level.
1002
+                        if ( empty( $this->orig_args ) ) {
1003
+                            $this->orig_args = $this->parent->args;
1004
+                        }
1005
+
1006
+                        if ( isset( $box['args'] ) ) {
1007
+                            $this->parent->args = wp_parse_args( $box['args'], $this->orig_args );
1008
+                        } elseif ( $this->parent->args !== $this->orig_args ) {
1009
+                            $this->parent->args = $this->orig_args;
1010
+                        }
1011
+
1012
+                        add_filter( 'postbox_classes_' . $posttype . '_redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], array( $this, 'add_box_classes' ) );
1013
+
1014
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
1015
+                        do_action( 'redux/' . $this->parent->args['opt_name'] . '/extensions/metabox/add', $this, $box, $posttype );
1016
+
1017
+                        if ( isset( $box['post_format'] ) ) {
1018
+                            add_filter( 'postbox_classes_' . $posttype . '_redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], array( $this, 'add_box_hide_class' ) );
1019
+                        }
1020
+
1021
+                        // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
1022
+                        call_user_func( 'add' . '_meta' . '_box', 'redux-' . $this->parent->args['opt_name'] . '-metabox-' . $box['id'], $title, array( $this, 'generate_boxes' ), $posttype, $box['position'], $box['priority'], $args );
1023
+                    }
1024
+                }
1025
+            }
1026
+        }
1027
+
1028
+        /**
1029
+         * Add hidden class to metabox DIV.
1030
+         *
1031
+         * @param array $classes Class array.
1032
+         *
1033
+         * @return array
1034
+         */
1035
+        public function add_box_hide_class( array $classes ): array {
1036
+            $classes[] = 'hide';
1037
+
1038
+            return $classes;
1039
+        }
1040
+
1041
+        /**
1042
+         * Field Defaults.
1043
+         *
1044
+         * @param mixed $field_id ID.
1045
+         *
1046
+         * @return mixed|string
1047
+         */
1048
+        private function field_default( $field_id ) {
1049
+            if ( ! isset( $this->parent->options_defaults ) ) {
1050
+                $this->parent->options_defaults = $this->parent->default_values();
1051
+            }
1052
+
1053
+            if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
1054
+                if ( ! isset( $this->parent->options_class ) ) {
1055
+                    $this->parent->options_class = new Redux_Options_Constructor( $this->parent );
1056
+                }
1057
+
1058
+                $this->parent->options_class->get();
1059
+            }
1060
+
1061
+            $this->options = $this->parent->options;
1062
+
1063
+            if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
1064
+                return $this->parent->options[ $field_id['id'] ];
1065
+            } else {
1066
+                if ( empty( $this->options_defaults ) ) {
1067
+                    $this->default_values(); // fill cache.
1068
+                }
1069
+
1070
+                $data = '';
1071
+                if ( ! empty( $this->options_defaults ) ) {
1072
+                    $data = $this->options_defaults[ $field_id['id'] ] ?? '';
1073
+                }
1074
+
1075
+                if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
1076
+                    $data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
1077
+                }
1078
+
1079
+                return $data;
1080
+            }
1081
+        }
1082
+
1083
+        /**
1084
+         * Function to get and cache the post meta.
1085
+         *
1086
+         * @param mixed $id ID.
1087
+         *
1088
+         * @return array
1089
+         */
1090
+        private function get_meta( $id ): array {
1091
+            if ( ! isset( $this->meta[ $id ] ) ) {
1092
+                $this->meta[ $id ] = array();
1093
+                $o_data            = get_post_meta( $id );
1094
+
1095
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
1096
+                $o_data = apply_filters( "redux/metaboxes/{$this->parent->args['opt_name']}/get_meta", $o_data );
1097
+
1098
+                if ( ! empty( $o_data ) ) {
1099
+                    foreach ( $o_data as $key => $value ) {
1100
+                        if ( 1 === count( $value ) ) {
1101
+                            $this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
1102
+                        } else {
1103
+                            $new_value = array_map( 'maybe_unserialize', $value );
1104
+
1105
+                            $this->meta[ $id ][ $key ] = $new_value[0];
1106
+                        }
1107
+                    }
1108
+                }
1109
+
1110
+                if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
1111
+                    $data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1112
+
1113
+                    foreach ( $data as $key => $value ) {
1114
+                        $this->meta[ $id ][ $key ] = $value;
1115
+                        update_post_meta( $id, $key, $value );
1116
+                    }
1117
+
1118
+                    unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
1119
+
1120
+                    delete_post_meta( $id, $this->parent->args['opt_name'] );
1121
+                }
1122
+            }
1123
+
1124
+            return $this->meta[ $id ];
1125
+        }
1126
+
1127
+        /**
1128
+         * Get values.
1129
+         *
1130
+         * @param mixed  $the_post Post object/id.
1131
+         * @param string $meta_key Meta key.
1132
+         * @param mixed  $def_val  Def value.
1133
+         *
1134
+         * @return array|mixed|string
1135
+         */
1136
+        public function get_values( $the_post, string $meta_key = '', $def_val = '' ) {
1137
+
1138
+            // Override these values if they differ from the admin panel defaults.  ;) .
1139
+            if ( isset( $the_post->post_type ) && in_array( $the_post->post_type, $this->post_types, true ) ) {
1140
+                if ( isset( $this->post_type_values[ $the_post->post_type ] ) ) {
1141
+                    $meta = $this->post_type_fields[ $the_post->post_type ];
1142
+                } else {
1143
+                    $defaults = array();
1144
+                    if ( ! empty( $this->post_type_fields[ $the_post->post_type ] ) ) {
1145
+                        foreach ( $this->post_type_fields[ $the_post->post_type ] as $key => $null ) {
1146
+                            if ( isset( $this->options_defaults[ $key ] ) ) {
1147
+                                $defaults[ $key ] = $this->options_defaults[ $key ];
1148
+                            }
1149
+                        }
1150
+                    }
1151
+
1152
+                    $meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
1153
+
1154
+                    $this->post_type_fields[ $the_post->post_type ] = $meta;
1155
+                }
1156
+
1157
+                if ( ! empty( $meta_key ) ) {
1158
+                    if ( ! isset( $meta[ $meta_key ] ) ) {
1159
+                        $meta[ $meta_key ] = $def_val;
1160
+                    }
1161
+
1162
+                    return $meta[ $meta_key ];
1163
+                } else {
1164
+                    return $meta;
1165
+                }
1166
+            }
1167
+
1168
+            return $def_val;
1169
+        }
1170
+
1171
+        /**
1172
+         * Generate Boxes.
1173
+         *
1174
+         * @param mixed $post Post.
1175
+         * @param array $metabox Metabox array.
1176
+         */
1177
+        public function generate_boxes( $post, array $metabox ) {
1178
+            if ( ! empty( $metabox['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metabox['args']['permissions'] ) ) {
1179
+                return;
1180
+            }
1181
+
1182
+            $sections = $metabox['args']['sections'];
1183
+
1184
+            wp_nonce_field( 'redux_metaboxes_meta_nonce', 'redux_metaboxes_meta_nonce' );
1185
+
1186
+            wp_dequeue_script( 'json-view-js' );
1187
+
1188
+            $sidebar = true;
1189
+
1190
+            if ( 'side' === $metabox['args']['position'] || 1 === count( $sections ) || ( isset( $metabox['args']['sidebar'] ) && false === $metabox['args']['sidebar'] ) ) {
1191
+                $sidebar = false; // Show the section dividers or not.
1192
+            }
1193
+
1194
+            ?>
1195 1195
 			<input
1196 1196
 					type="hidden"
1197 1197
 					id="currentSection"
@@ -1221,21 +1221,21 @@  discard block
 block discarded – undo
1221 1221
 					</div>
1222 1222
 				</div>
1223 1223
 				<?php
1224
-				echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
1225
-				if ( $sidebar ) {
1226
-					?>
1224
+                echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
1225
+                if ( $sidebar ) {
1226
+                    ?>
1227 1227
 					<div class="redux-sidebar">
1228 1228
 						<ul class="redux-group-menu">
1229 1229
 							<?php
1230 1230
 
1231
-							foreach ( $sections as $s_key => $section ) {
1232
-								if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
1233
-									continue;
1234
-								}
1231
+                            foreach ( $sections as $s_key => $section ) {
1232
+                                if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
1233
+                                    continue;
1234
+                                }
1235 1235
 
1236
-								echo $this->parent->render_class->section_menu( $s_key, $section, '_box_' . $metabox['id'], $sections ); // phpcs:ignore WordPress.Security.EscapeOutput
1237
-							}
1238
-							?>
1236
+                                echo $this->parent->render_class->section_menu( $s_key, $section, '_box_' . $metabox['id'], $sections ); // phpcs:ignore WordPress.Security.EscapeOutput
1237
+                            }
1238
+                            ?>
1239 1239
 						</ul>
1240 1240
 					</div>
1241 1241
 				<?php } ?>
@@ -1243,295 +1243,295 @@  discard block
 block discarded – undo
1243 1243
 				<div class="redux-main">
1244 1244
 					<?php
1245 1245
 
1246
-					foreach ( $sections as $s_key => $section ) {
1247
-						if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
1248
-							continue;
1249
-						}
1250
-						if ( ! empty( $section['fields'] ) ) {
1251
-							if ( isset( $section['args'] ) ) {
1252
-								$this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
1253
-							} elseif ( $this->parent->args !== $this->orig_args ) {
1254
-								$this->parent->args = $this->orig_args;
1255
-							}
1256
-
1257
-							$hide             = $sidebar ? '' : ' display-group';
1258
-							$section['class'] = isset( $section['class'] ) ? ' ' . $section['class'] : '';
1259
-							echo '<div id="' . esc_attr( $s_key ) . '_box_' . esc_attr( $metabox['id'] ) . '_section_group" class="redux-group-tab' . esc_attr( $section['class'] ) . ' redux_metabox_panel' . esc_attr( $hide ) . '">';
1260
-
1261
-							if ( ! empty( $section['title'] ) ) {
1262
-								echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
1263
-							}
1264
-
1265
-							if ( ! empty( $section['desc'] ) ) {
1266
-								echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
1267
-							}
1268
-
1269
-							echo '<table class="form-table"><tbody>';
1270
-							foreach ( $section['fields'] as $field ) {
1271
-								if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
1272
-									continue;
1273
-								}
1274
-								$field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
1275
-
1276
-								$is_hidden = false;
1277
-								$ex_style  = '';
1278
-								if ( isset( $field['hidden'] ) && $field['hidden'] ) {
1279
-									$is_hidden = true;
1280
-									$ex_style  = ' style="border-bottom: none;"';
1281
-								}
1282
-
1283
-								echo '<tr valign="top"' . $ex_style . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
1284
-
1285
-								$th = $this->parent->render_class->get_header_html( $field );
1286
-
1287
-								if ( $is_hidden ) {
1288
-									$str_pos = strpos( $th, 'redux_field_th' );
1289
-
1290
-									if ( $str_pos > - 1 ) {
1291
-										$th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
1292
-									}
1293
-								}
1294
-
1295
-								if ( $sidebar ) {
1296
-									if ( ! ( isset( $metabox['args']['sections'] ) && 1 === count( $metabox['args']['sections'] ) && isset( $metabox['args']['sections'][0]['fields'] ) && 1 === count( $metabox['args']['sections'][0]['fields'] ) ) && isset( $field['title'] ) ) {
1297
-										echo '<th scope="row">';
1298
-										if ( ! empty( $th ) ) {
1299
-											echo $th; // phpcs:ignore WordPress.Security.EscapeOutput
1300
-										}
1301
-										echo '</th>';
1302
-										echo '<td>';
1303
-									}
1304
-								} else {
1305
-									echo '<td>' . $th; // phpcs:ignore WordPress.Security.EscapeOutput
1306
-								}
1307
-
1308
-								if ( 'section' === $field['type'] && ( 'true' === $field['indent'] || true === $field['indent'] ) ) {
1309
-									$field['class']  = $field['class'] ?? '';
1310
-									$field['class'] .= 'redux-section-indent-start';
1311
-								}
1312
-
1313
-								if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
1314
-									$this->meta[ $this->post_id ][ $field['id'] ] = '';
1315
-								}
1316
-
1317
-								$this->parent->render_class->field_input( $field, $this->meta[ $this->post_id ][ $field['id'] ], true );
1318
-								echo '</td></tr>';
1319
-							}
1320
-							echo '</tbody></table>';
1321
-							echo '</div>';
1322
-						}
1323
-					}
1324
-					?>
1246
+                    foreach ( $sections as $s_key => $section ) {
1247
+                        if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
1248
+                            continue;
1249
+                        }
1250
+                        if ( ! empty( $section['fields'] ) ) {
1251
+                            if ( isset( $section['args'] ) ) {
1252
+                                $this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
1253
+                            } elseif ( $this->parent->args !== $this->orig_args ) {
1254
+                                $this->parent->args = $this->orig_args;
1255
+                            }
1256
+
1257
+                            $hide             = $sidebar ? '' : ' display-group';
1258
+                            $section['class'] = isset( $section['class'] ) ? ' ' . $section['class'] : '';
1259
+                            echo '<div id="' . esc_attr( $s_key ) . '_box_' . esc_attr( $metabox['id'] ) . '_section_group" class="redux-group-tab' . esc_attr( $section['class'] ) . ' redux_metabox_panel' . esc_attr( $hide ) . '">';
1260
+
1261
+                            if ( ! empty( $section['title'] ) ) {
1262
+                                echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
1263
+                            }
1264
+
1265
+                            if ( ! empty( $section['desc'] ) ) {
1266
+                                echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
1267
+                            }
1268
+
1269
+                            echo '<table class="form-table"><tbody>';
1270
+                            foreach ( $section['fields'] as $field ) {
1271
+                                if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
1272
+                                    continue;
1273
+                                }
1274
+                                $field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
1275
+
1276
+                                $is_hidden = false;
1277
+                                $ex_style  = '';
1278
+                                if ( isset( $field['hidden'] ) && $field['hidden'] ) {
1279
+                                    $is_hidden = true;
1280
+                                    $ex_style  = ' style="border-bottom: none;"';
1281
+                                }
1282
+
1283
+                                echo '<tr valign="top"' . $ex_style . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
1284
+
1285
+                                $th = $this->parent->render_class->get_header_html( $field );
1286
+
1287
+                                if ( $is_hidden ) {
1288
+                                    $str_pos = strpos( $th, 'redux_field_th' );
1289
+
1290
+                                    if ( $str_pos > - 1 ) {
1291
+                                        $th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
1292
+                                    }
1293
+                                }
1294
+
1295
+                                if ( $sidebar ) {
1296
+                                    if ( ! ( isset( $metabox['args']['sections'] ) && 1 === count( $metabox['args']['sections'] ) && isset( $metabox['args']['sections'][0]['fields'] ) && 1 === count( $metabox['args']['sections'][0]['fields'] ) ) && isset( $field['title'] ) ) {
1297
+                                        echo '<th scope="row">';
1298
+                                        if ( ! empty( $th ) ) {
1299
+                                            echo $th; // phpcs:ignore WordPress.Security.EscapeOutput
1300
+                                        }
1301
+                                        echo '</th>';
1302
+                                        echo '<td>';
1303
+                                    }
1304
+                                } else {
1305
+                                    echo '<td>' . $th; // phpcs:ignore WordPress.Security.EscapeOutput
1306
+                                }
1307
+
1308
+                                if ( 'section' === $field['type'] && ( 'true' === $field['indent'] || true === $field['indent'] ) ) {
1309
+                                    $field['class']  = $field['class'] ?? '';
1310
+                                    $field['class'] .= 'redux-section-indent-start';
1311
+                                }
1312
+
1313
+                                if ( ! isset( $this->meta[ $this->post_id ][ $field['id'] ] ) ) {
1314
+                                    $this->meta[ $this->post_id ][ $field['id'] ] = '';
1315
+                                }
1316
+
1317
+                                $this->parent->render_class->field_input( $field, $this->meta[ $this->post_id ][ $field['id'] ], true );
1318
+                                echo '</td></tr>';
1319
+                            }
1320
+                            echo '</tbody></table>';
1321
+                            echo '</div>';
1322
+                        }
1323
+                    }
1324
+                    ?>
1325 1325
 				</div>
1326 1326
 				<div class="clear"></div>
1327 1327
 			</div>
1328 1328
 			<?php
1329
-		}
1330
-
1331
-		/**
1332
-		 * Save meta boxes
1333
-		 * Runs when a post is saved and does an action which the write panel save scripts can hook into.
1334
-		 *
1335
-		 * @access public
1336
-		 *
1337
-		 * @param mixed $post_id Post ID.
1338
-		 * @param mixed $post Post.
1339
-		 *
1340
-		 * @return mixed
1341
-		 */
1342
-		public function meta_boxes_save( $post_id, $post ) {
1343
-			if ( isset( $_POST['vc_inline'] ) && sanitize_text_field( wp_unslash( $_POST['vc_inline'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1344
-				return $post_id;
1345
-			}
1346
-
1347
-			if ( isset( $_POST['post_ID'] ) && strval( $post_id ) !== $_POST['post_ID'] ) { // phpcs:ignore WordPress.Security.NonceVerification
1348
-				return $post_id;
1349
-			}
1350
-
1351
-			// Check if our nonce is set.
1352
-			if ( ! isset( $_POST['redux_metaboxes_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
1353
-				return $post_id;
1354
-			}
1355
-
1356
-			// Verify that the nonce is valid.
1357
-			// Validate fields (if needed).
1358
-			if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_metaboxes_meta_nonce'] ) ), 'redux_metaboxes_meta_nonce' ) ) {
1359
-				return $post_id;
1360
-			}
1361
-
1362
-			// If this is an autosave, our form has not been submitted, so we don't want to do anything.
1363
-			if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
1364
-				return $post_id;
1365
-			}
1366
-
1367
-			// Check the user's permissions, even allowing custom capabilities.
1368
-			$obj = get_post_type_object( $post->post_type );
1369
-			if ( ! current_user_can( $obj->cap->edit_post, $post_id ) ) {
1370
-				return $post_id;
1371
-			}
1372
-
1373
-			// Import.
1374
-			if ( isset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) && ! empty( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ) {
1375
-				$import = json_decode( sanitize_text_field( wp_unslash( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ), true );
1376
-				unset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] );
1377
-
1378
-				foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1379
-					if ( ! isset( $import[ $key ] ) ) {
1380
-						$import[ $key ] = $value;
1381
-					}
1382
-				}
1383
-
1384
-				$_POST[ $this->parent->args['opt_name'] ] = $import;
1385
-			}
1386
-
1387
-			$to_save    = array();
1388
-			$to_compare = array();
1389
-			$to_delete  = array();
1390
-			$dont_save  = true;
1391
-
1392
-			if ( isset( $this->parent->args['metaboxes_save_defaults'] ) && $this->parent->args['metaboxes_save_defaults'] ) {
1393
-				$dont_save = false;
1394
-			}
1395
-
1396
-			foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1397
-
1398
-				// Have to remove the escaping for array comparison.
1399
-				if ( is_array( $value ) ) {
1400
-					foreach ( $value as $k => $v ) {
1401
-						if ( ! is_array( $v ) ) {
1402
-							$value[ $k ] = wp_unslash( $v );
1403
-						}
1404
-					}
1405
-				}
1406
-
1407
-				$save = true;
1408
-
1409
-				// parent_options.
1410
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1411
-					$save = false;
1412
-				}
1413
-
1414
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1415
-					$save = false;
1416
-				}
1417
-
1418
-				if ( $save ) {
1419
-					$to_save[ $key ]    = $value;
1420
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1421
-				} else {
1422
-					$to_delete[ $key ] = $value;
1423
-				}
1424
-			}
1425
-
1426
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1427
-			$to_save = apply_filters( 'redux/metaboxes/save/before_validate', $to_save, $to_compare, $this->sections );
1428
-
1429
-			$validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1430
-
1431
-			// Validate fields (if needed).
1432
-			foreach ( $to_save as $key => $value ) {
1433
-				if ( isset( $validate[ $key ] ) && $value !== $validate[ $key ] ) {
1434
-					if ( isset( $this->parent->options[ $key ] ) && $validate[ $key ] === $this->parent->options[ $key ] ) {
1435
-						unset( $to_save[ $key ] );
1436
-					} else {
1437
-						$to_save[ $key ] = $validate[ $key ];
1438
-					}
1439
-				}
1440
-			}
1441
-
1442
-			if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1443
-				$this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1444
-
1445
-				if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1446
-					$this->parent->transients['notices']['errors'] = $this->parent->errors;
1447
-					$update_transients                             = true;
1448
-				}
1449
-
1450
-				if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1451
-					$this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1452
-					$update_transients                               = true;
1453
-				}
1454
-
1455
-				if ( isset( $update_transients ) ) {
1456
-					$this->parent->transients['notices']['override'] = 1;
1457
-					set_transient( $this->parent->args['opt_name'] . '-transients-metaboxes', $this->parent->transients );
1458
-				}
1459
-			}
1460
-
1461
-			if ( isset( $_POST['post_type'] ) ) {
1462
-				$check = $this->post_type_fields[ sanitize_text_field( wp_unslash( $_POST['post_type'] ) ) ];
1463
-			}
1464
-
1465
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1466
-			$to_save = apply_filters( 'redux/metaboxes/save', $to_save, $to_compare, $this->sections );
1467
-
1468
-			foreach ( $to_save as $key => $value ) {
1469
-				$prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1470
-
1471
-				if ( isset( $check[ $key ] ) ) {
1472
-					unset( $check[ $key ] );
1473
-				}
1474
-
1475
-				update_post_meta( $post_id, $key, $value, $prev_value );
1476
-			}
1477
-
1478
-			foreach ( $to_delete as $key => $value ) {
1479
-				if ( isset( $check[ $key ] ) ) {
1480
-					unset( $check[ $key ] );
1481
-				}
1482
-
1483
-				$prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1484
-				delete_post_meta( $post_id, $key, $prev_value );
1485
-			}
1486
-
1487
-			if ( ! empty( $check ) ) {
1488
-				foreach ( $check as $key => $value ) {
1489
-					delete_post_meta( $post_id, $key );
1490
-				}
1491
-			}
1492
-
1493
-			return $post_id;
1494
-		}
1495
-
1496
-		/**
1497
-		 * Some functions, like the term recount, require the visibility to be set prior. Lets save that here.
1498
-		 *
1499
-		 * @access public
1500
-		 *
1501
-		 * @param mixed $post_id Post ID.
1502
-		 *
1503
-		 * @return void
1504
-		 */
1505
-		public function pre_post_update( $post_id ) {
1506
-			if ( isset( $_POST['_visibility'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1507
-				update_post_meta( $post_id, '_visibility', sanitize_text_field( wp_unslash( $_POST['_visibility'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
1508
-			}
1509
-
1510
-			if ( isset( $_POST['_stock_status'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1511
-				update_post_meta( $post_id, '_stock_status', sanitize_text_field( wp_unslash( $_POST['_stock_status'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
1512
-			}
1513
-		}
1514
-
1515
-		/**
1516
-		 * Show any stored error messages.
1517
-		 *
1518
-		 * @access public
1519
-		 * @return void
1520
-		 */
1521
-		public function meta_boxes_show_errors() {
1522
-			if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1523
-				echo '<div id="redux_metaboxes_errors" class="error fade">';
1524
-				echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1525
-				echo '</div>';
1526
-			}
1527
-
1528
-			if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1529
-				echo '<div id="redux_metaboxes_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1530
-				echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1531
-				echo '</div>';
1532
-			}
1533
-		}
1534
-	}
1535
-
1536
-	class_alias( Redux_Extension_Metaboxes::class, 'ReduxFramework_Extension_metaboxes' );
1329
+        }
1330
+
1331
+        /**
1332
+         * Save meta boxes
1333
+         * Runs when a post is saved and does an action which the write panel save scripts can hook into.
1334
+         *
1335
+         * @access public
1336
+         *
1337
+         * @param mixed $post_id Post ID.
1338
+         * @param mixed $post Post.
1339
+         *
1340
+         * @return mixed
1341
+         */
1342
+        public function meta_boxes_save( $post_id, $post ) {
1343
+            if ( isset( $_POST['vc_inline'] ) && sanitize_text_field( wp_unslash( $_POST['vc_inline'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1344
+                return $post_id;
1345
+            }
1346
+
1347
+            if ( isset( $_POST['post_ID'] ) && strval( $post_id ) !== $_POST['post_ID'] ) { // phpcs:ignore WordPress.Security.NonceVerification
1348
+                return $post_id;
1349
+            }
1350
+
1351
+            // Check if our nonce is set.
1352
+            if ( ! isset( $_POST['redux_metaboxes_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
1353
+                return $post_id;
1354
+            }
1355
+
1356
+            // Verify that the nonce is valid.
1357
+            // Validate fields (if needed).
1358
+            if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_metaboxes_meta_nonce'] ) ), 'redux_metaboxes_meta_nonce' ) ) {
1359
+                return $post_id;
1360
+            }
1361
+
1362
+            // If this is an autosave, our form has not been submitted, so we don't want to do anything.
1363
+            if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
1364
+                return $post_id;
1365
+            }
1366
+
1367
+            // Check the user's permissions, even allowing custom capabilities.
1368
+            $obj = get_post_type_object( $post->post_type );
1369
+            if ( ! current_user_can( $obj->cap->edit_post, $post_id ) ) {
1370
+                return $post_id;
1371
+            }
1372
+
1373
+            // Import.
1374
+            if ( isset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) && ! empty( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ) {
1375
+                $import = json_decode( sanitize_text_field( wp_unslash( $_POST[ $this->parent->args['opt_name'] ]['import_code'] ) ), true );
1376
+                unset( $_POST[ $this->parent->args['opt_name'] ]['import_code'] );
1377
+
1378
+                foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1379
+                    if ( ! isset( $import[ $key ] ) ) {
1380
+                        $import[ $key ] = $value;
1381
+                    }
1382
+                }
1383
+
1384
+                $_POST[ $this->parent->args['opt_name'] ] = $import;
1385
+            }
1386
+
1387
+            $to_save    = array();
1388
+            $to_compare = array();
1389
+            $to_delete  = array();
1390
+            $dont_save  = true;
1391
+
1392
+            if ( isset( $this->parent->args['metaboxes_save_defaults'] ) && $this->parent->args['metaboxes_save_defaults'] ) {
1393
+                $dont_save = false;
1394
+            }
1395
+
1396
+            foreach ( Redux_Helpers::sanitize_array( wp_unslash( $_POST[ $this->parent->args['opt_name'] ] ) ) as $key => $value ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
1397
+
1398
+                // Have to remove the escaping for array comparison.
1399
+                if ( is_array( $value ) ) {
1400
+                    foreach ( $value as $k => $v ) {
1401
+                        if ( ! is_array( $v ) ) {
1402
+                            $value[ $k ] = wp_unslash( $v );
1403
+                        }
1404
+                    }
1405
+                }
1406
+
1407
+                $save = true;
1408
+
1409
+                // parent_options.
1410
+                if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1411
+                    $save = false;
1412
+                }
1413
+
1414
+                if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1415
+                    $save = false;
1416
+                }
1417
+
1418
+                if ( $save ) {
1419
+                    $to_save[ $key ]    = $value;
1420
+                    $to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1421
+                } else {
1422
+                    $to_delete[ $key ] = $value;
1423
+                }
1424
+            }
1425
+
1426
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1427
+            $to_save = apply_filters( 'redux/metaboxes/save/before_validate', $to_save, $to_compare, $this->sections );
1428
+
1429
+            $validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1430
+
1431
+            // Validate fields (if needed).
1432
+            foreach ( $to_save as $key => $value ) {
1433
+                if ( isset( $validate[ $key ] ) && $value !== $validate[ $key ] ) {
1434
+                    if ( isset( $this->parent->options[ $key ] ) && $validate[ $key ] === $this->parent->options[ $key ] ) {
1435
+                        unset( $to_save[ $key ] );
1436
+                    } else {
1437
+                        $to_save[ $key ] = $validate[ $key ];
1438
+                    }
1439
+                }
1440
+            }
1441
+
1442
+            if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1443
+                $this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1444
+
1445
+                if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1446
+                    $this->parent->transients['notices']['errors'] = $this->parent->errors;
1447
+                    $update_transients                             = true;
1448
+                }
1449
+
1450
+                if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1451
+                    $this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1452
+                    $update_transients                               = true;
1453
+                }
1454
+
1455
+                if ( isset( $update_transients ) ) {
1456
+                    $this->parent->transients['notices']['override'] = 1;
1457
+                    set_transient( $this->parent->args['opt_name'] . '-transients-metaboxes', $this->parent->transients );
1458
+                }
1459
+            }
1460
+
1461
+            if ( isset( $_POST['post_type'] ) ) {
1462
+                $check = $this->post_type_fields[ sanitize_text_field( wp_unslash( $_POST['post_type'] ) ) ];
1463
+            }
1464
+
1465
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1466
+            $to_save = apply_filters( 'redux/metaboxes/save', $to_save, $to_compare, $this->sections );
1467
+
1468
+            foreach ( $to_save as $key => $value ) {
1469
+                $prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1470
+
1471
+                if ( isset( $check[ $key ] ) ) {
1472
+                    unset( $check[ $key ] );
1473
+                }
1474
+
1475
+                update_post_meta( $post_id, $key, $value, $prev_value );
1476
+            }
1477
+
1478
+            foreach ( $to_delete as $key => $value ) {
1479
+                if ( isset( $check[ $key ] ) ) {
1480
+                    unset( $check[ $key ] );
1481
+                }
1482
+
1483
+                $prev_value = $this->meta[ $post_id ][ $key ] ?? '';
1484
+                delete_post_meta( $post_id, $key, $prev_value );
1485
+            }
1486
+
1487
+            if ( ! empty( $check ) ) {
1488
+                foreach ( $check as $key => $value ) {
1489
+                    delete_post_meta( $post_id, $key );
1490
+                }
1491
+            }
1492
+
1493
+            return $post_id;
1494
+        }
1495
+
1496
+        /**
1497
+         * Some functions, like the term recount, require the visibility to be set prior. Lets save that here.
1498
+         *
1499
+         * @access public
1500
+         *
1501
+         * @param mixed $post_id Post ID.
1502
+         *
1503
+         * @return void
1504
+         */
1505
+        public function pre_post_update( $post_id ) {
1506
+            if ( isset( $_POST['_visibility'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1507
+                update_post_meta( $post_id, '_visibility', sanitize_text_field( wp_unslash( $_POST['_visibility'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
1508
+            }
1509
+
1510
+            if ( isset( $_POST['_stock_status'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
1511
+                update_post_meta( $post_id, '_stock_status', sanitize_text_field( wp_unslash( $_POST['_stock_status'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification
1512
+            }
1513
+        }
1514
+
1515
+        /**
1516
+         * Show any stored error messages.
1517
+         *
1518
+         * @access public
1519
+         * @return void
1520
+         */
1521
+        public function meta_boxes_show_errors() {
1522
+            if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1523
+                echo '<div id="redux_metaboxes_errors" class="error fade">';
1524
+                echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1525
+                echo '</div>';
1526
+            }
1527
+
1528
+            if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1529
+                echo '<div id="redux_metaboxes_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1530
+                echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1531
+                echo '</div>';
1532
+            }
1533
+        }
1534
+    }
1535
+
1536
+    class_alias( Redux_Extension_Metaboxes::class, 'ReduxFramework_Extension_metaboxes' );
1537 1537
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/metaboxes/redux-metaboxes-helpers.php 1 patch
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -8,49 +8,49 @@
 block discarded – undo
8 8
 defined( 'ABSPATH' ) || exit;
9 9
 
10 10
 if ( ! function_exists( 'redux_metaboxes_loop_start' ) ) {
11
-	/**
12
-	 * Start loop.
13
-	 *
14
-	 * @param string $opt_name Panel opt_name.
15
-	 * @param array  $the_post Post object.
16
-	 */
17
-	function redux_metaboxes_loop_start( string $opt_name, array $the_post = array() ) {
18
-		$redux     = ReduxFrameworkInstances::get_instance( $opt_name );
19
-		$metaboxes = $redux->extensions['metaboxes'];
11
+    /**
12
+     * Start loop.
13
+     *
14
+     * @param string $opt_name Panel opt_name.
15
+     * @param array  $the_post Post object.
16
+     */
17
+    function redux_metaboxes_loop_start( string $opt_name, array $the_post = array() ) {
18
+        $redux     = ReduxFrameworkInstances::get_instance( $opt_name );
19
+        $metaboxes = $redux->extensions['metaboxes'];
20 20
 
21
-		$metaboxes->loop_start( $the_post );
22
-	}
21
+        $metaboxes->loop_start( $the_post );
22
+    }
23 23
 }
24 24
 
25 25
 if ( ! function_exists( 'redux_metaboxes_loop_end' ) ) {
26
-	/**
27
-	 * End loop.
28
-	 *
29
-	 * @param string $opt_name Panel opt_name.
30
-	 * @param array  $the_post Deprecated.
31
-	 */
32
-	function redux_metaboxes_loop_end( string $opt_name, array $the_post = array() ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
33
-		_deprecated_argument( __FUNCTION__, '4.5', '$the_post argument has been deprecated and will be removed in a future version. Please update your code accordingly!' );
26
+    /**
27
+     * End loop.
28
+     *
29
+     * @param string $opt_name Panel opt_name.
30
+     * @param array  $the_post Deprecated.
31
+     */
32
+    function redux_metaboxes_loop_end( string $opt_name, array $the_post = array() ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
33
+        _deprecated_argument( __FUNCTION__, '4.5', '$the_post argument has been deprecated and will be removed in a future version. Please update your code accordingly!' );
34 34
 
35
-		$redux     = ReduxFrameworkInstances::get_instance( $opt_name );
36
-		$metaboxes = $redux->extensions['metaboxes'];
35
+        $redux     = ReduxFrameworkInstances::get_instance( $opt_name );
36
+        $metaboxes = $redux->extensions['metaboxes'];
37 37
 
38
-		$metaboxes->loop_end();
39
-	}
38
+        $metaboxes->loop_end();
39
+    }
40 40
 }
41 41
 
42 42
 if ( ! function_exists( 'redux_post_meta' ) ) {
43
-	/**
44
-	 * Retrieve post meta values/settings.
45
-	 *
46
-	 * @param string $opt_name Panel opt_name.
47
-	 * @param mixed  $the_post Post ID.
48
-	 * @param string $meta_key Meta key.
49
-	 * @param mixed  $def_val  Default value.
50
-	 *
51
-	 * @return string|void
52
-	 */
53
-	function redux_post_meta( string $opt_name = '', $the_post = array(), string $meta_key = '', $def_val = '' ) {
54
-		return Redux::get_post_meta( $opt_name, $the_post, $meta_key, $def_val );
55
-	}
43
+    /**
44
+     * Retrieve post meta values/settings.
45
+     *
46
+     * @param string $opt_name Panel opt_name.
47
+     * @param mixed  $the_post Post ID.
48
+     * @param string $meta_key Meta key.
49
+     * @param mixed  $def_val  Default value.
50
+     *
51
+     * @return string|void
52
+     */
53
+    function redux_post_meta( string $opt_name = '', $the_post = array(), string $meta_key = '', $def_val = '' ) {
54
+        return Redux::get_post_meta( $opt_name, $the_post, $meta_key, $def_val );
55
+    }
56 56
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/users/class-redux-extension-users.php 2 patches
Spacing   +79 added lines, -79 removed lines patch added patch discarded remove patch
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
 			}
220 220
 
221 221
 			foreach ( $this->profiles as $bk => $profile ) {
222
-				$profile['roles'] = isset( $profile['roles'] ) ? (array) $profile['roles'] : array( 'read' );
222
+				$profile['roles'] = isset( $profile['roles'] ) ? ( array ) $profile['roles'] : array( 'read' );
223 223
 
224 224
 				if ( ! empty( $profile['sections'] ) ) {
225 225
 					$this->sections = $profile['sections'];
@@ -243,7 +243,7 @@  discard block
 block discarded – undo
243 243
 									if ( ! isset( $field['class'] ) ) {
244 244
 										$field['class'] = '';
245 245
 
246
-										$this->profiles[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
246
+										$this->profiles[$bk]['sections'][$sk]['fields'][$fk] = $field;
247 247
 									}
248 248
 
249 249
 									$this->parent->required_class->check_dependencies( $field );
@@ -254,37 +254,37 @@  discard block
 block discarded – undo
254 254
 										}
255 255
 
256 256
 										if ( isset( $field['default'] ) ) {
257
-											$this->options_defaults[ $field['id'] ] = $field['default'];
257
+											$this->options_defaults[$field['id']] = $field['default'];
258 258
 										} else {
259
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
259
+											$this->options_defaults[$field['id']] = $this->field_default( $field );
260 260
 										}
261 261
 
262 262
 										foreach ( $profile['roles'] as $type ) {
263
-											$this->profile_fields[ $type ][ $field['id'] ] = 1;
263
+											$this->profile_fields[$type][$field['id']] = 1;
264 264
 										}
265 265
 
266 266
 										if ( ! empty( $field['output'] ) ) {
267
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
267
+											$this->output[$field['id']] = isset( $this->output[$field['id']] ) ? array_merge( $field['output'], $this->output[$field['id']] ) : $field['output'];
268 268
 										}
269 269
 
270 270
 										// Detect what field types are being used.
271
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
272
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
271
+										if ( ! isset( $this->parent->fields[$field['type']][$field['id']] ) ) {
272
+											$this->parent->fields[$field['type']][$field['id']] = 1;
273 273
 										} else {
274
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
274
+											$this->parent->fields[$field['type']] = array( $field['id'] => 1 );
275 275
 										}
276 276
 
277
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
278
-											$this->to_replace[ $field['id'] ] = $field;
277
+										if ( isset( $this->options_defaults[$field['id']] ) ) {
278
+											$this->to_replace[$field['id']] = $field;
279 279
 										}
280 280
 									}
281 281
 
282
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
283
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
282
+									if ( ! isset( $this->parent->options[$field['id']] ) ) {
283
+										$this->parent->sections[( count( $this->parent->sections ) - 1 )]['fields'][] = $field;
284 284
 									}
285 285
 
286
-									if ( ! isset( $this->meta[ $field['id'] ] ) ) {
287
-										$this->meta[ $field['id'] ] = $this->options_defaults[ $field['id'] ];
286
+									if ( ! isset( $this->meta[$field['id']] ) ) {
287
+										$this->meta[$field['id']] = $this->options_defaults[$field['id']];
288 288
 									}
289 289
 
290 290
 									// Only override if it exists, and it's not the default.
@@ -326,8 +326,8 @@  discard block
 block discarded – undo
326 326
 		 * @return mixed
327 327
 		 */
328 328
 		public function replace_field( array $field ) {
329
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
330
-				$field = $this->to_replace[ $field['id'] ];
329
+			if ( isset( $this->to_replace[$field['id']] ) ) {
330
+				$field = $this->to_replace[$field['id']];
331 331
 			}
332 332
 
333 333
 			return $field;
@@ -341,8 +341,8 @@  discard block
 block discarded – undo
341 341
 		 * @return array
342 342
 		 */
343 343
 		public function output_css( array $field ): array {
344
-			if ( isset( $this->output[ $field['id'] ] ) ) {
345
-				$field['output'] = $this->output[ $field['id'] ];
344
+			if ( isset( $this->output[$field['id']] ) ) {
345
+				$field['output'] = $this->output[$field['id']];
346 346
 			}
347 347
 
348 348
 			return $field;
@@ -368,13 +368,13 @@  discard block
 block discarded – undo
368 368
 			$data = wp_parse_args( $this->meta, $this->options_defaults );
369 369
 
370 370
 			foreach ( $data as $key => $value ) {
371
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
372
-					$data[ $key ] = $meta[ $key ];
371
+				if ( isset( $meta[$key] ) && '' !== $meta[$key] ) {
372
+					$data[$key] = $meta[$key];
373 373
 					continue;
374 374
 				}
375 375
 
376
-				if ( isset( $options[ $key ] ) ) {
377
-					$data[ $key ] = $options[ $key ];
376
+				if ( isset( $options[$key] ) ) {
377
+					$data[$key] = $options[$key];
378 378
 				}
379 379
 			}
380 380
 
@@ -398,7 +398,7 @@  discard block
 block discarded – undo
398 398
 					$relation = $query;
399 399
 
400 400
 				} elseif ( ! is_array( $query ) ) {
401
-					$clean_queries[ $key ]['values'] = array( $query );
401
+					$clean_queries[$key]['values'] = array( $query );
402 402
 
403 403
 					// First-order clause.
404 404
 				} elseif ( $this->is_first_order_clause( $query ) ) {
@@ -407,7 +407,7 @@  discard block
 block discarded – undo
407 407
 						unset( $query['value'] );
408 408
 					}
409 409
 
410
-					$clean_queries[ $key ] = $query;
410
+					$clean_queries[$key] = $query;
411 411
 
412 412
 					// Otherwise, it's a nested query, so we recurse.
413 413
 				} else {
@@ -415,7 +415,7 @@  discard block
 block discarded – undo
415 415
 					$cleaned_query = $this->sanitize_query( $query );
416 416
 
417 417
 					if ( ! empty( $cleaned_query ) ) {
418
-						$clean_queries[ $key ] = $cleaned_query;
418
+						$clean_queries[$key] = $cleaned_query;
419 419
 					}
420 420
 				}
421 421
 			}
@@ -534,7 +534,7 @@  discard block
 block discarded – undo
534 534
 							} else {
535 535
 								$section['id'] = sanitize_title( $section['title'], $sk );
536 536
 							}
537
-							$this->profiles[ $key ]['sections'][ $sk ] = $section;
537
+							$this->profiles[$key]['sections'][$sk] = $section;
538 538
 						}
539 539
 						if ( isset( $section['fields'] ) ) {
540 540
 							foreach ( $section['fields'] as $k => $field ) {
@@ -543,15 +543,15 @@  discard block
 block discarded – undo
543 543
 								}
544 544
 
545 545
 								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
546
-									$this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
547
-									unset( $this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
546
+									$this->profiles[$key]['sections'][$sk]['fields'][$k]['args'] = $field['options'];
547
+									unset( $this->profiles[$key]['sections'][$sk]['fields'][$k]['options'] );
548 548
 								}
549 549
 
550 550
 								if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
551 551
 									$field['class']  = $field['class'] ?? '';
552 552
 									$field['class'] .= 'redux-section-indent-start';
553 553
 
554
-									$this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
554
+									$this->profiles[$key]['sections'][$sk]['fields'][$k] = $field;
555 555
 								}
556 556
 
557 557
 								if ( ! isset( $this->parent->options_defaults_class ) ) {
@@ -660,8 +660,8 @@  discard block
 block discarded – undo
660 660
 				$this->parent->options_class->get();
661 661
 			}
662 662
 
663
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
664
-				return $this->parent->options[ $field_id['id'] ];
663
+			if ( isset( $this->parent->options[$field_id['id']] ) && isset( $this->parent->options_defaults[$field_id['id']] ) && $this->parent->options[$field_id['id']] !== $this->parent->options_defaults[$field_id['id']] ) {
664
+				return $this->parent->options[$field_id['id']];
665 665
 			} else {
666 666
 				if ( empty( $this->options_defaults ) ) {
667 667
 					$this->default_values(); // fill cache.
@@ -669,11 +669,11 @@  discard block
 block discarded – undo
669 669
 
670 670
 				$data = '';
671 671
 				if ( ! empty( $this->options_defaults ) ) {
672
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
672
+					$data = $this->options_defaults[$field_id['id']] ?? '';
673 673
 				}
674 674
 
675
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
676
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
675
+				if ( empty( $data ) && isset( $this->parent->options_defaults[$field_id['id']] ) ) {
676
+					$data = $this->parent->options_defaults[$field_id['id']] ?? '';
677 677
 				}
678 678
 
679 679
 				return $data;
@@ -688,8 +688,8 @@  discard block
 block discarded – undo
688 688
 		 * @return array
689 689
 		 */
690 690
 		private function get_meta( string $id ): array {
691
-			if ( ! isset( $this->meta[ $id ] ) ) {
692
-				$this->meta[ $id ] = array();
691
+			if ( ! isset( $this->meta[$id] ) ) {
692
+				$this->meta[$id] = array();
693 693
 				$o_data            = get_post_meta( $id );
694 694
 
695 695
 				// phpcs:ignore WordPress.NamingConventions.ValidHookName
@@ -698,30 +698,30 @@  discard block
 block discarded – undo
698 698
 				if ( ! empty( $o_data ) ) {
699 699
 					foreach ( $o_data as $key => $value ) {
700 700
 						if ( count( $value ) === 1 ) {
701
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
701
+							$this->meta[$id][$key] = maybe_unserialize( $value[0] );
702 702
 						} else {
703 703
 							$new_value = array_map( 'maybe_unserialize', $value );
704 704
 
705
-							$this->meta[ $id ][ $key ] = $new_value[0];
705
+							$this->meta[$id][$key] = $new_value[0];
706 706
 						}
707 707
 					}
708 708
 				}
709 709
 
710
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
711
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
710
+				if ( isset( $this->meta[$id][$this->parent->args['opt_name']] ) ) {
711
+					$data = maybe_unserialize( $this->meta[$id][$this->parent->args['opt_name']] );
712 712
 
713 713
 					foreach ( $data as $key => $value ) {
714
-						$this->meta[ $id ][ $key ] = $value;
714
+						$this->meta[$id][$key] = $value;
715 715
 						update_post_meta( $id, $key, $value );
716 716
 					}
717 717
 
718
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
718
+					unset( $this->meta[$id][$this->parent->args['opt_name']] );
719 719
 
720 720
 					delete_post_meta( $id, $this->parent->args['opt_name'] );
721 721
 				}
722 722
 			}
723 723
 
724
-			return $this->meta[ $id ];
724
+			return $this->meta[$id];
725 725
 		}
726 726
 
727 727
 		/**
@@ -737,29 +737,29 @@  discard block
 block discarded – undo
737 737
 
738 738
 			// Override these values if they differ from the admin panel defaults.  ;).
739 739
 			if ( isset( $the_post->users_role ) && in_array( $the_post->users_role, $this->users_roles, true ) ) {
740
-				if ( isset( $this->users_role_values[ $the_post->users_role ] ) ) {
741
-					$meta = $this->profile_fields[ $the_post->users_role ];
740
+				if ( isset( $this->users_role_values[$the_post->users_role] ) ) {
741
+					$meta = $this->profile_fields[$the_post->users_role];
742 742
 				} else {
743 743
 					$defaults = array();
744
-					if ( ! empty( $this->profile_fields[ $the_post->users_role ] ) ) {
745
-						foreach ( $this->profile_fields[ $the_post->users_role ] as $key => $null ) {
746
-							if ( isset( $this->options_defaults[ $key ] ) ) {
747
-								$defaults[ $key ] = $this->options_defaults[ $key ];
744
+					if ( ! empty( $this->profile_fields[$the_post->users_role] ) ) {
745
+						foreach ( $this->profile_fields[$the_post->users_role] as $key => $null ) {
746
+							if ( isset( $this->options_defaults[$key] ) ) {
747
+								$defaults[$key] = $this->options_defaults[$key];
748 748
 							}
749 749
 						}
750 750
 					}
751 751
 
752 752
 					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
753 753
 
754
-					$this->profile_fields[ $the_post->users_role ] = $meta;
754
+					$this->profile_fields[$the_post->users_role] = $meta;
755 755
 				}
756 756
 
757 757
 				if ( ! empty( $meta_key ) ) {
758
-					if ( ! isset( $meta[ $meta_key ] ) ) {
759
-						$meta[ $meta_key ] = $def_val;
758
+					if ( ! isset( $meta[$meta_key] ) ) {
759
+						$meta[$meta_key] = $def_val;
760 760
 					}
761 761
 
762
-					return $meta[ $meta_key ];
762
+					return $meta[$meta_key];
763 763
 				} else {
764 764
 					return $meta;
765 765
 				}
@@ -958,11 +958,11 @@  discard block
 block discarded – undo
958 958
 									$field['class'] .= 'redux-section-indent-start';
959 959
 								}
960 960
 
961
-								if ( ! isset( $this->meta[ $field['id'] ] ) ) {
962
-									$this->meta[ $field['id'] ] = '';
961
+								if ( ! isset( $this->meta[$field['id']] ) ) {
962
+									$this->meta[$field['id']] = '';
963 963
 								}
964 964
 
965
-								$this->parent->render_class->field_input( $field, $this->meta[ $field['id'] ] );
965
+								$this->parent->render_class->field_input( $field, $this->meta[$field['id']] );
966 966
 								echo '</td></tr>';
967 967
 							}
968 968
 							echo '</tbody></table>';
@@ -994,7 +994,7 @@  discard block
 block discarded – undo
994 994
 			}
995 995
 
996 996
 			// Check if our nonce is set.
997
-			if ( ! isset( $_POST['redux_users_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
997
+			if ( ! isset( $_POST['redux_users_meta_nonce'] ) || ! isset( $_POST[$this->parent->args['opt_name']] ) ) {
998 998
 				return false;
999 999
 			}
1000 1000
 
@@ -1013,16 +1013,16 @@  discard block
 block discarded – undo
1013 1013
 			$to_delete  = array();
1014 1014
 			$dont_save  = true;
1015 1015
 
1016
-			$field_args = Redux_Users::$fields[ $this->parent->args['opt_name'] ];
1016
+			$field_args = Redux_Users::$fields[$this->parent->args['opt_name']];
1017 1017
 
1018
-			foreach ( $_POST[ $this->parent->args['opt_name'] ] as $key => $value ) { // phpcs:ignore WordPress.Security
1018
+			foreach ( $_POST[$this->parent->args['opt_name']] as $key => $value ) { // phpcs:ignore WordPress.Security
1019 1019
 				$key = sanitize_text_field( wp_unslash( $key ) );
1020 1020
 
1021
-				if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1022
-					foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1021
+				if ( ! empty( $field_args[$key]['permissions'] ) ) {
1022
+					foreach ( ( array ) $field_args[$key]['permissions'] as $pv ) {
1023 1023
 
1024 1024
 						// Do not save anything the user doesn't have permissions for.
1025
-						if ( isset( $field_args[ $key ] ) ) {
1025
+						if ( isset( $field_args[$key] ) ) {
1026 1026
 							if ( user_can( $user_id, $pv ) && user_can( $check_user_id, $pv ) ) {
1027 1027
 								break;
1028 1028
 							}
@@ -1034,7 +1034,7 @@  discard block
 block discarded – undo
1034 1034
 				if ( is_array( $value ) ) {
1035 1035
 					foreach ( $value as $k => $v ) {
1036 1036
 						if ( ! is_array( $v ) ) {
1037
-							$value[ $k ] = sanitize_text_field( wp_unslash( $v ) );
1037
+							$value[$k] = sanitize_text_field( wp_unslash( $v ) );
1038 1038
 						}
1039 1039
 					}
1040 1040
 				}
@@ -1042,19 +1042,19 @@  discard block
 block discarded – undo
1042 1042
 				$save = true;
1043 1043
 
1044 1044
 				// parent_options.
1045
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1045
+				if ( ! $dont_save && isset( $this->options_defaults[$key] ) && $value === $this->options_defaults[$key] ) {
1046 1046
 					$save = false;
1047 1047
 				}
1048 1048
 
1049
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1049
+				if ( $save && isset( $this->parent_options[$key] ) && $this->parent_options[$key] !== $value ) {
1050 1050
 					$save = false;
1051 1051
 				}
1052 1052
 
1053 1053
 				if ( $save ) {
1054
-					$to_save[ $key ]    = $value;
1055
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1054
+					$to_save[$key]    = $value;
1055
+					$to_compare[$key] = $this->parent->options[$key] ?? '';
1056 1056
 				} else {
1057
-					$to_delete[ $key ] = $value;
1057
+					$to_delete[$key] = $value;
1058 1058
 				}
1059 1059
 			}
1060 1060
 
@@ -1065,11 +1065,11 @@  discard block
 block discarded – undo
1065 1065
 
1066 1066
 			// Validate fields (if needed).
1067 1067
 			foreach ( $to_save as $key => $value ) {
1068
-				if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1069
-					if ( isset( $this->meta[ $key ] ) && $validate[ $key ] === $this->meta[ $key ] ) {
1070
-						unset( $to_save[ $key ] );
1068
+				if ( isset( $validate[$key] ) && $validate[$key] !== $value ) {
1069
+					if ( isset( $this->meta[$key] ) && $validate[$key] === $this->meta[$key] ) {
1070
+						unset( $to_save[$key] );
1071 1071
 					} else {
1072
-						$to_save[ $key ] = $validate[ $key ];
1072
+						$to_save[$key] = $validate[$key];
1073 1073
 					}
1074 1074
 				}
1075 1075
 			}
@@ -1099,21 +1099,21 @@  discard block
 block discarded – undo
1099 1099
 			$to_save = apply_filters( 'redux/users/save', $to_save, $to_compare, $this->sections );
1100 1100
 
1101 1101
 			foreach ( $to_save as $key => $value ) {
1102
-				$prev_value = $this->meta[ $key ] ?? '';
1102
+				$prev_value = $this->meta[$key] ?? '';
1103 1103
 
1104
-				if ( isset( $check[ $key ] ) ) {
1105
-					unset( $check[ $key ] );
1104
+				if ( isset( $check[$key] ) ) {
1105
+					unset( $check[$key] );
1106 1106
 				}
1107 1107
 
1108 1108
 				update_user_meta( $user_id, $key, $value, $prev_value );
1109 1109
 			}
1110 1110
 
1111 1111
 			foreach ( $to_delete as $key => $value ) {
1112
-				if ( isset( $check[ $key ] ) ) {
1113
-					unset( $check[ $key ] );
1112
+				if ( isset( $check[$key] ) ) {
1113
+					unset( $check[$key] );
1114 1114
 				}
1115 1115
 
1116
-				$prev_value = $this->meta[ $key ] ?? '';
1116
+				$prev_value = $this->meta[$key] ?? '';
1117 1117
 				delete_user_meta( $user_id, $key, $prev_value );
1118 1118
 			}
1119 1119
 			if ( ! empty( $check ) ) {
Please login to merge, or discard this patch.
Indentation   +1091 added lines, -1091 removed lines patch added patch discarded remove patch
@@ -13,827 +13,827 @@  discard block
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Extension_Users' ) ) {
15 15
 
16
-	/**
17
-	 * Main Redux_Extension_Users class
18
-	 *
19
-	 * @since       1.0.0
20
-	 */
21
-	class Redux_Extension_Users extends Redux_Extension_Abstract {
22
-
23
-		/**
24
-		 * Extension version.
25
-		 *
26
-		 * @var string
27
-		 */
28
-		public static $version = '4.5.6';
29
-
30
-		/**
31
-		 * Extension friendly name.
32
-		 *
33
-		 * @var string
34
-		 */
35
-		public string $extension_name = 'Users';
36
-
37
-
38
-		/**
39
-		 * Profiles array.
40
-		 *
41
-		 * @var null|array
42
-		 */
43
-		public ?array $profiles = array();
44
-
45
-		/**
46
-		 * User roles array.
47
-		 *
48
-		 * @var null|array
49
-		 */
50
-		public ?array $users_roles = array();
51
-
52
-		/**
53
-		 * User role array.
54
-		 *
55
-		 * @var null|array
56
-		 */
57
-		public ?array $users_role = array();
58
-
59
-		/**
60
-		 * Sections array.
61
-		 *
62
-		 * @var null|array
63
-		 */
64
-		public ?array $sections = array();
65
-
66
-		/**
67
-		 * Original args array.
68
-		 *
69
-		 * @var null|array
70
-		 */
71
-		public ?array $orig_args = array();
72
-
73
-		/**
74
-		 * Output array.
75
-		 *
76
-		 * @var null|array
77
-		 */
78
-		public ?array $output = array();
79
-
80
-		/**
81
-		 * Parent options array.
82
-		 *
83
-		 * @var null|array
84
-		 */
85
-		public ?array $parent_options = array();
86
-
87
-		/**
88
-		 * Parent defaults.
89
-		 *
90
-		 * @var null|array
91
-		 */
92
-		public ?array $parent_defaults = array();
93
-
94
-		/**
95
-		 * Profile fields array.
96
-		 *
97
-		 * @var null|array
98
-		 */
99
-		public ?array $profile_fields = array();
100
-
101
-		/**
102
-		 * Options defaults.
103
-		 *
104
-		 * @var null|array
105
-		 */
106
-		public ?array $options_defaults = array();
107
-
108
-		/**
109
-		 * To replace array.
110
-		 *
111
-		 * @var null|array
112
-		 */
113
-		public ?array $to_replace = array();
114
-
115
-		/**
116
-		 * Meta array.
117
-		 *
118
-		 * @var null|array
119
-		 */
120
-		public ?array $meta = array();
121
-
122
-		/**
123
-		 * Array of page names.
124
-		 *
125
-		 * @var null|array
126
-		 */
127
-		public ?array $pagenows;
128
-
129
-		/**
130
-		 * Notices array.
131
-		 *
132
-		 * @var null|array
133
-		 */
134
-		public ?array $notices;
135
-
136
-		/**
137
-		 * Redux_Extension_Users constructor.
138
-		 *
139
-		 * @param object $redux ReduxFramework pointer.
140
-		 */
141
-		public function __construct( $redux ) {
142
-			global $pagenow;
143
-
144
-			parent::__construct( $redux, __FILE__ );
145
-
146
-			$this->parent = $redux;
147
-
148
-			$this->add_field( 'users' );
149
-			$this->parent->extensions['users'] = $this;
150
-
151
-			$this->pagenows = array( 'user-new.php', 'profile.php', 'user-edit.php' );
152
-
153
-			require_once __DIR__ . '/redux-users-helpers.php';
154
-
155
-			add_action( 'admin_notices', array( $this, 'meta_profiles_show_errors' ), 0 );
156
-			add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
157
-
158
-			if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
159
-				$this->init();
160
-
161
-				add_action( 'personal_options_update', array( $this, 'user_meta_save' ) );
162
-				add_action( 'edit_user_profile_update', array( $this, 'user_meta_save' ) );
163
-
164
-			}
165
-		}
166
-
167
-		/**
168
-		 * Add term classes.
169
-		 *
170
-		 * @param array $classes Classes.
171
-		 *
172
-		 * @return array
173
-		 */
174
-		public function add_user_classes( array $classes ): array {
175
-			$classes[] = 'redux-users';
176
-			$classes[] = 'redux-' . $this->parent->args['opt_name'];
177
-
178
-			if ( '' !== $this->parent->args['class'] ) {
179
-				$classes[] = $this->parent->args['class'];
180
-			}
181
-
182
-			return $classes;
183
-		}
184
-
185
-		/**
186
-		 * Add hide term class.
187
-		 *
188
-		 * @param array $classes Classes.
189
-		 *
190
-		 * @return array
191
-		 */
192
-		public function add_user_hide_class( array $classes ): array {
193
-			$classes[] = 'hide';
194
-
195
-			return $classes;
196
-		}
197
-
198
-		/**
199
-		 * Init.
200
-		 */
201
-		public function init() {
202
-			global $pagenow;
203
-
204
-			if ( isset( $_POST['action'] ) && 'redux_demo_customizer_save' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification
205
-				return;
206
-			}
207
-
208
-			$this->parent->transients['run_compiler'] = false;
209
-
210
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
211
-			$this->profiles = apply_filters( 'redux/users/' . $this->parent->args['opt_name'] . '/profiles', $this->profiles, $this->parent->args['opt_name'] );
212
-
213
-			if ( empty( $this->profiles ) && class_exists( 'Redux_Users' ) ) {
214
-				$this->profiles = Redux_Users::construct_profiles( $this->parent->args['opt_name'] );
215
-			}
216
-
217
-			if ( empty( $this->profiles ) || ! is_array( $this->profiles ) ) {
218
-				return;
219
-			}
220
-
221
-			foreach ( $this->profiles as $bk => $profile ) {
222
-				$profile['roles'] = isset( $profile['roles'] ) ? (array) $profile['roles'] : array( 'read' );
223
-
224
-				if ( ! empty( $profile['sections'] ) ) {
225
-					$this->sections = $profile['sections'];
226
-
227
-					$this->users_roles = wp_parse_args( $this->users_roles, $profile['roles'] );
228
-
229
-					// Checking to override the parent variables.
230
-					$add_field = false;
231
-
232
-					foreach ( $profile['roles'] as $role ) {
233
-						if ( $this->users_role === $role ) {
234
-							$add_field = true;
235
-						}
236
-					}
237
-
238
-					// Replacing all the fields.
239
-					if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
240
-						foreach ( $profile['sections'] as $sk => $section ) {
241
-							if ( ! empty( $section['fields'] ) ) {
242
-								foreach ( $section['fields'] as $fk => $field ) {
243
-									if ( ! isset( $field['class'] ) ) {
244
-										$field['class'] = '';
245
-
246
-										$this->profiles[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
247
-									}
248
-
249
-									$this->parent->required_class->check_dependencies( $field );
250
-
251
-									if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
252
-										if ( empty( $field['id'] ) ) {
253
-											continue;
254
-										}
255
-
256
-										if ( isset( $field['default'] ) ) {
257
-											$this->options_defaults[ $field['id'] ] = $field['default'];
258
-										} else {
259
-											$this->options_defaults[ $field['id'] ] = $this->field_default( $field );
260
-										}
261
-
262
-										foreach ( $profile['roles'] as $type ) {
263
-											$this->profile_fields[ $type ][ $field['id'] ] = 1;
264
-										}
265
-
266
-										if ( ! empty( $field['output'] ) ) {
267
-											$this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
268
-										}
269
-
270
-										// Detect what field types are being used.
271
-										if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
272
-											$this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
273
-										} else {
274
-											$this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
275
-										}
276
-
277
-										if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
278
-											$this->to_replace[ $field['id'] ] = $field;
279
-										}
280
-									}
281
-
282
-									if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
283
-										$this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
284
-									}
285
-
286
-									if ( ! isset( $this->meta[ $field['id'] ] ) ) {
287
-										$this->meta[ $field['id'] ] = $this->options_defaults[ $field['id'] ];
288
-									}
289
-
290
-									// Only override if it exists, and it's not the default.
291
-									/** If ( isset( $this->meta[ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $field['id'] ] === $field['default'] ) {
292
-									 *    // unset($this->meta[$this->tag_id][$field['id']]);
293
-									 *  }
294
-									 */
295
-								}
296
-							}
297
-						}
298
-					}
299
-				}
300
-			}
301
-
302
-			$this->parent_options = array();
303
-
304
-			if ( ! empty( $this->to_replace ) ) {
305
-				foreach ( $this->to_replace as $id => $field ) {
306
-					add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
307
-				}
308
-			}
309
-
310
-			add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
311
-
312
-			if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
313
-				$priority = $this->parent->args['user_priority'] ?? 3;
314
-
315
-				add_action( 'show_user_profile', array( $this, 'add_profiles' ), $priority );
316
-				add_action( 'edit_user_profile', array( $this, 'add_profiles' ), $priority );
317
-				add_action( 'user_new_form', array( $this, 'add_profiles' ), $priority );
318
-			}
319
-		}
320
-
321
-		/**
322
-		 * Replace field.
323
-		 *
324
-		 * @param array $field Field array.
325
-		 *
326
-		 * @return mixed
327
-		 */
328
-		public function replace_field( array $field ) {
329
-			if ( isset( $this->to_replace[ $field['id'] ] ) ) {
330
-				$field = $this->to_replace[ $field['id'] ];
331
-			}
332
-
333
-			return $field;
334
-		}
335
-
336
-		/**
337
-		 * Output CSS.
338
-		 *
339
-		 * @param array $field Field array.
340
-		 *
341
-		 * @return array
342
-		 */
343
-		public function output_css( array $field ): array {
344
-			if ( isset( $this->output[ $field['id'] ] ) ) {
345
-				$field['output'] = $this->output[ $field['id'] ];
346
-			}
347
-
348
-			return $field;
349
-		}
350
-
351
-		/**
352
-		 * Make sure the defaults are the defaults
353
-		 *
354
-		 * @param array $options Option array.
355
-		 *
356
-		 * @return array
357
-		 */
358
-		public function override_options( array $options ): array {
359
-			$this->parent->options_class->default_values();
360
-			$this->parent_defaults = $this->parent->options_defaults;
361
-
362
-			if ( empty( $this->meta ) ) {
363
-				// phpcs:ignore WordPress.Security.NonceVerification
364
-				$user       = isset( $_GET['user_id'] ) ? sanitize_text_field( wp_unslash( $_GET['user_id'] ) ) : get_current_user_id();
365
-				$this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
366
-			}
367
-
368
-			$data = wp_parse_args( $this->meta, $this->options_defaults );
369
-
370
-			foreach ( $data as $key => $value ) {
371
-				if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
372
-					$data[ $key ] = $meta[ $key ];
373
-					continue;
374
-				}
375
-
376
-				if ( isset( $options[ $key ] ) ) {
377
-					$data[ $key ] = $options[ $key ];
378
-				}
379
-			}
380
-
381
-			$this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
382
-
383
-			return wp_parse_args( $data, $options );
384
-		}
385
-
386
-		/**
387
-		 * Sanitize Query.
388
-		 *
389
-		 * @param array $queries Queries.
390
-		 *
391
-		 * @return array
392
-		 */
393
-		public function sanitize_query( array $queries ): array {
394
-			$clean_queries = array();
395
-
396
-			foreach ( $queries as $key => $query ) {
397
-				if ( 'relation' === $key ) {
398
-					$relation = $query;
399
-
400
-				} elseif ( ! is_array( $query ) ) {
401
-					$clean_queries[ $key ]['values'] = array( $query );
402
-
403
-					// First-order clause.
404
-				} elseif ( $this->is_first_order_clause( $query ) ) {
405
-					print( 'h3' );
406
-					if ( isset( $query['value'] ) && array() === $query['value'] ) {
407
-						unset( $query['value'] );
408
-					}
409
-
410
-					$clean_queries[ $key ] = $query;
411
-
412
-					// Otherwise, it's a nested query, so we recurse.
413
-				} else {
414
-					print( 'h4' );
415
-					$cleaned_query = $this->sanitize_query( $query );
416
-
417
-					if ( ! empty( $cleaned_query ) ) {
418
-						$clean_queries[ $key ] = $cleaned_query;
419
-					}
420
-				}
421
-			}
422
-
423
-			if ( empty( $clean_queries ) ) {
424
-				return $clean_queries;
425
-			}
426
-
427
-			// Sanitize the 'relation' key provided in the query.
428
-			if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) {
429
-				$clean_queries['relation'] = 'OR';
430
-
431
-				/*
16
+    /**
17
+     * Main Redux_Extension_Users class
18
+     *
19
+     * @since       1.0.0
20
+     */
21
+    class Redux_Extension_Users extends Redux_Extension_Abstract {
22
+
23
+        /**
24
+         * Extension version.
25
+         *
26
+         * @var string
27
+         */
28
+        public static $version = '4.5.6';
29
+
30
+        /**
31
+         * Extension friendly name.
32
+         *
33
+         * @var string
34
+         */
35
+        public string $extension_name = 'Users';
36
+
37
+
38
+        /**
39
+         * Profiles array.
40
+         *
41
+         * @var null|array
42
+         */
43
+        public ?array $profiles = array();
44
+
45
+        /**
46
+         * User roles array.
47
+         *
48
+         * @var null|array
49
+         */
50
+        public ?array $users_roles = array();
51
+
52
+        /**
53
+         * User role array.
54
+         *
55
+         * @var null|array
56
+         */
57
+        public ?array $users_role = array();
58
+
59
+        /**
60
+         * Sections array.
61
+         *
62
+         * @var null|array
63
+         */
64
+        public ?array $sections = array();
65
+
66
+        /**
67
+         * Original args array.
68
+         *
69
+         * @var null|array
70
+         */
71
+        public ?array $orig_args = array();
72
+
73
+        /**
74
+         * Output array.
75
+         *
76
+         * @var null|array
77
+         */
78
+        public ?array $output = array();
79
+
80
+        /**
81
+         * Parent options array.
82
+         *
83
+         * @var null|array
84
+         */
85
+        public ?array $parent_options = array();
86
+
87
+        /**
88
+         * Parent defaults.
89
+         *
90
+         * @var null|array
91
+         */
92
+        public ?array $parent_defaults = array();
93
+
94
+        /**
95
+         * Profile fields array.
96
+         *
97
+         * @var null|array
98
+         */
99
+        public ?array $profile_fields = array();
100
+
101
+        /**
102
+         * Options defaults.
103
+         *
104
+         * @var null|array
105
+         */
106
+        public ?array $options_defaults = array();
107
+
108
+        /**
109
+         * To replace array.
110
+         *
111
+         * @var null|array
112
+         */
113
+        public ?array $to_replace = array();
114
+
115
+        /**
116
+         * Meta array.
117
+         *
118
+         * @var null|array
119
+         */
120
+        public ?array $meta = array();
121
+
122
+        /**
123
+         * Array of page names.
124
+         *
125
+         * @var null|array
126
+         */
127
+        public ?array $pagenows;
128
+
129
+        /**
130
+         * Notices array.
131
+         *
132
+         * @var null|array
133
+         */
134
+        public ?array $notices;
135
+
136
+        /**
137
+         * Redux_Extension_Users constructor.
138
+         *
139
+         * @param object $redux ReduxFramework pointer.
140
+         */
141
+        public function __construct( $redux ) {
142
+            global $pagenow;
143
+
144
+            parent::__construct( $redux, __FILE__ );
145
+
146
+            $this->parent = $redux;
147
+
148
+            $this->add_field( 'users' );
149
+            $this->parent->extensions['users'] = $this;
150
+
151
+            $this->pagenows = array( 'user-new.php', 'profile.php', 'user-edit.php' );
152
+
153
+            require_once __DIR__ . '/redux-users-helpers.php';
154
+
155
+            add_action( 'admin_notices', array( $this, 'meta_profiles_show_errors' ), 0 );
156
+            add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 20 );
157
+
158
+            if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
159
+                $this->init();
160
+
161
+                add_action( 'personal_options_update', array( $this, 'user_meta_save' ) );
162
+                add_action( 'edit_user_profile_update', array( $this, 'user_meta_save' ) );
163
+
164
+            }
165
+        }
166
+
167
+        /**
168
+         * Add term classes.
169
+         *
170
+         * @param array $classes Classes.
171
+         *
172
+         * @return array
173
+         */
174
+        public function add_user_classes( array $classes ): array {
175
+            $classes[] = 'redux-users';
176
+            $classes[] = 'redux-' . $this->parent->args['opt_name'];
177
+
178
+            if ( '' !== $this->parent->args['class'] ) {
179
+                $classes[] = $this->parent->args['class'];
180
+            }
181
+
182
+            return $classes;
183
+        }
184
+
185
+        /**
186
+         * Add hide term class.
187
+         *
188
+         * @param array $classes Classes.
189
+         *
190
+         * @return array
191
+         */
192
+        public function add_user_hide_class( array $classes ): array {
193
+            $classes[] = 'hide';
194
+
195
+            return $classes;
196
+        }
197
+
198
+        /**
199
+         * Init.
200
+         */
201
+        public function init() {
202
+            global $pagenow;
203
+
204
+            if ( isset( $_POST['action'] ) && 'redux_demo_customizer_save' === $_POST['action'] ) { // phpcs:ignore WordPress.Security.NonceVerification
205
+                return;
206
+            }
207
+
208
+            $this->parent->transients['run_compiler'] = false;
209
+
210
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
211
+            $this->profiles = apply_filters( 'redux/users/' . $this->parent->args['opt_name'] . '/profiles', $this->profiles, $this->parent->args['opt_name'] );
212
+
213
+            if ( empty( $this->profiles ) && class_exists( 'Redux_Users' ) ) {
214
+                $this->profiles = Redux_Users::construct_profiles( $this->parent->args['opt_name'] );
215
+            }
216
+
217
+            if ( empty( $this->profiles ) || ! is_array( $this->profiles ) ) {
218
+                return;
219
+            }
220
+
221
+            foreach ( $this->profiles as $bk => $profile ) {
222
+                $profile['roles'] = isset( $profile['roles'] ) ? (array) $profile['roles'] : array( 'read' );
223
+
224
+                if ( ! empty( $profile['sections'] ) ) {
225
+                    $this->sections = $profile['sections'];
226
+
227
+                    $this->users_roles = wp_parse_args( $this->users_roles, $profile['roles'] );
228
+
229
+                    // Checking to override the parent variables.
230
+                    $add_field = false;
231
+
232
+                    foreach ( $profile['roles'] as $role ) {
233
+                        if ( $this->users_role === $role ) {
234
+                            $add_field = true;
235
+                        }
236
+                    }
237
+
238
+                    // Replacing all the fields.
239
+                    if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
240
+                        foreach ( $profile['sections'] as $sk => $section ) {
241
+                            if ( ! empty( $section['fields'] ) ) {
242
+                                foreach ( $section['fields'] as $fk => $field ) {
243
+                                    if ( ! isset( $field['class'] ) ) {
244
+                                        $field['class'] = '';
245
+
246
+                                        $this->profiles[ $bk ]['sections'][ $sk ]['fields'][ $fk ] = $field;
247
+                                    }
248
+
249
+                                    $this->parent->required_class->check_dependencies( $field );
250
+
251
+                                    if ( $add_field || ( ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) || ( ! is_admin() ) ) ) {
252
+                                        if ( empty( $field['id'] ) ) {
253
+                                            continue;
254
+                                        }
255
+
256
+                                        if ( isset( $field['default'] ) ) {
257
+                                            $this->options_defaults[ $field['id'] ] = $field['default'];
258
+                                        } else {
259
+                                            $this->options_defaults[ $field['id'] ] = $this->field_default( $field );
260
+                                        }
261
+
262
+                                        foreach ( $profile['roles'] as $type ) {
263
+                                            $this->profile_fields[ $type ][ $field['id'] ] = 1;
264
+                                        }
265
+
266
+                                        if ( ! empty( $field['output'] ) ) {
267
+                                            $this->output[ $field['id'] ] = isset( $this->output[ $field['id'] ] ) ? array_merge( $field['output'], $this->output[ $field['id'] ] ) : $field['output'];
268
+                                        }
269
+
270
+                                        // Detect what field types are being used.
271
+                                        if ( ! isset( $this->parent->fields[ $field['type'] ][ $field['id'] ] ) ) {
272
+                                            $this->parent->fields[ $field['type'] ][ $field['id'] ] = 1;
273
+                                        } else {
274
+                                            $this->parent->fields[ $field['type'] ] = array( $field['id'] => 1 );
275
+                                        }
276
+
277
+                                        if ( isset( $this->options_defaults[ $field['id'] ] ) ) {
278
+                                            $this->to_replace[ $field['id'] ] = $field;
279
+                                        }
280
+                                    }
281
+
282
+                                    if ( ! isset( $this->parent->options[ $field['id'] ] ) ) {
283
+                                        $this->parent->sections[ ( count( $this->parent->sections ) - 1 ) ]['fields'][] = $field;
284
+                                    }
285
+
286
+                                    if ( ! isset( $this->meta[ $field['id'] ] ) ) {
287
+                                        $this->meta[ $field['id'] ] = $this->options_defaults[ $field['id'] ];
288
+                                    }
289
+
290
+                                    // Only override if it exists, and it's not the default.
291
+                                    /** If ( isset( $this->meta[ $field['id'] ] ) && isset( $field['default'] ) && $this->meta[ $field['id'] ] === $field['default'] ) {
292
+                                     *    // unset($this->meta[$this->tag_id][$field['id']]);
293
+                                     *  }
294
+                                     */
295
+                                }
296
+                            }
297
+                        }
298
+                    }
299
+                }
300
+            }
301
+
302
+            $this->parent_options = array();
303
+
304
+            if ( ! empty( $this->to_replace ) ) {
305
+                foreach ( $this->to_replace as $id => $field ) {
306
+                    add_filter( "redux/options/{$this->parent->args['opt_name']}/field/$id/register", array( $this, 'replace_field' ) );
307
+                }
308
+            }
309
+
310
+            add_filter( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_options' ) );
311
+
312
+            if ( is_admin() && in_array( $pagenow, $this->pagenows, true ) ) {
313
+                $priority = $this->parent->args['user_priority'] ?? 3;
314
+
315
+                add_action( 'show_user_profile', array( $this, 'add_profiles' ), $priority );
316
+                add_action( 'edit_user_profile', array( $this, 'add_profiles' ), $priority );
317
+                add_action( 'user_new_form', array( $this, 'add_profiles' ), $priority );
318
+            }
319
+        }
320
+
321
+        /**
322
+         * Replace field.
323
+         *
324
+         * @param array $field Field array.
325
+         *
326
+         * @return mixed
327
+         */
328
+        public function replace_field( array $field ) {
329
+            if ( isset( $this->to_replace[ $field['id'] ] ) ) {
330
+                $field = $this->to_replace[ $field['id'] ];
331
+            }
332
+
333
+            return $field;
334
+        }
335
+
336
+        /**
337
+         * Output CSS.
338
+         *
339
+         * @param array $field Field array.
340
+         *
341
+         * @return array
342
+         */
343
+        public function output_css( array $field ): array {
344
+            if ( isset( $this->output[ $field['id'] ] ) ) {
345
+                $field['output'] = $this->output[ $field['id'] ];
346
+            }
347
+
348
+            return $field;
349
+        }
350
+
351
+        /**
352
+         * Make sure the defaults are the defaults
353
+         *
354
+         * @param array $options Option array.
355
+         *
356
+         * @return array
357
+         */
358
+        public function override_options( array $options ): array {
359
+            $this->parent->options_class->default_values();
360
+            $this->parent_defaults = $this->parent->options_defaults;
361
+
362
+            if ( empty( $this->meta ) ) {
363
+                // phpcs:ignore WordPress.Security.NonceVerification
364
+                $user       = isset( $_GET['user_id'] ) ? sanitize_text_field( wp_unslash( $_GET['user_id'] ) ) : get_current_user_id();
365
+                $this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
366
+            }
367
+
368
+            $data = wp_parse_args( $this->meta, $this->options_defaults );
369
+
370
+            foreach ( $data as $key => $value ) {
371
+                if ( isset( $meta[ $key ] ) && '' !== $meta[ $key ] ) {
372
+                    $data[ $key ] = $meta[ $key ];
373
+                    continue;
374
+                }
375
+
376
+                if ( isset( $options[ $key ] ) ) {
377
+                    $data[ $key ] = $options[ $key ];
378
+                }
379
+            }
380
+
381
+            $this->parent->options_defaults = wp_parse_args( $this->options_defaults, $this->parent->options_defaults );
382
+
383
+            return wp_parse_args( $data, $options );
384
+        }
385
+
386
+        /**
387
+         * Sanitize Query.
388
+         *
389
+         * @param array $queries Queries.
390
+         *
391
+         * @return array
392
+         */
393
+        public function sanitize_query( array $queries ): array {
394
+            $clean_queries = array();
395
+
396
+            foreach ( $queries as $key => $query ) {
397
+                if ( 'relation' === $key ) {
398
+                    $relation = $query;
399
+
400
+                } elseif ( ! is_array( $query ) ) {
401
+                    $clean_queries[ $key ]['values'] = array( $query );
402
+
403
+                    // First-order clause.
404
+                } elseif ( $this->is_first_order_clause( $query ) ) {
405
+                    print( 'h3' );
406
+                    if ( isset( $query['value'] ) && array() === $query['value'] ) {
407
+                        unset( $query['value'] );
408
+                    }
409
+
410
+                    $clean_queries[ $key ] = $query;
411
+
412
+                    // Otherwise, it's a nested query, so we recurse.
413
+                } else {
414
+                    print( 'h4' );
415
+                    $cleaned_query = $this->sanitize_query( $query );
416
+
417
+                    if ( ! empty( $cleaned_query ) ) {
418
+                        $clean_queries[ $key ] = $cleaned_query;
419
+                    }
420
+                }
421
+            }
422
+
423
+            if ( empty( $clean_queries ) ) {
424
+                return $clean_queries;
425
+            }
426
+
427
+            // Sanitize the 'relation' key provided in the query.
428
+            if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) {
429
+                $clean_queries['relation'] = 'OR';
430
+
431
+                /*
432 432
 				 * If there is only a single clause, call the relation 'OR'.
433 433
 				 * This value will not be used to join clauses, but it
434 434
 				 * simplifies the logic around combining key-only queries.
435 435
 				 */
436
-			} elseif ( 1 === count( $clean_queries ) ) {
437
-				$clean_queries['relation'] = 'OR';
438
-
439
-				// Default to AND.
440
-			} else {
441
-				$clean_queries['relation'] = 'AND';
442
-			}
443
-
444
-			return $clean_queries;
445
-		}
446
-
447
-		/**
448
-		 * Is the first order clause.
449
-		 *
450
-		 * @param array $query Query array.
451
-		 *
452
-		 * @return bool
453
-		 */
454
-		protected function is_first_order_clause( array $query ): bool {
455
-			return isset( $query['key'] ) || isset( $query['value'] );
456
-		}
457
-
458
-		/**
459
-		 * Support file and field enqueue.
460
-		 */
461
-		public function enqueue() {
462
-			global $pagenow;
463
-
464
-			if ( in_array( $pagenow, $this->pagenows, true ) ) {
465
-
466
-				if ( 'user-new.php' === $pagenow ) {
467
-					$this->parent->args['disable_save_warn'] = true;
468
-				}
469
-
470
-				$this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-users' );
471
-				$this->parent->transients_check = $this->parent->transients;
472
-
473
-				if ( isset( $this->parent->transients['notices'] ) ) {
474
-					$this->notices                              = $this->parent->transients['notices'];
475
-					$this->parent->transients['last_save_mode'] = 'users';
476
-				}
477
-
478
-				delete_transient( $this->parent->args['opt_name'] . '-transients-users' );
479
-
480
-				$this->parent->enqueue_class->init();
481
-
482
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
483
-				do_action( "redux/users/{$this->parent->args['opt_name']}/enqueue" );
484
-
485
-				/**
486
-				 * Redux users CSS
487
-				 * filter 'redux/page/{opt_name}/enqueue/redux-extension-users-css'
488
-				 */
489
-				if ( true === $this->parent->args['dev_mode'] ) {
490
-					wp_enqueue_style(
491
-						'redux-extension-users',
492
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
493
-						apply_filters( "redux/users/{$this->parent->args['opt_name']}/enqueue/redux-extension-users-css", $this->extension_url . 'redux-extension-users.css' ),
494
-						array(),
495
-						self::$version
496
-					);
497
-				}
498
-
499
-				/**
500
-				 * Redux users JS
501
-				 * filter 'redux/page/{opt_name}/enqueue/redux-extension-users-js
502
-				 */
503
-				wp_enqueue_script(
504
-					'redux-extension-users',
505
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
506
-					apply_filters( "redux/users/{$this->parent->args['opt_name']}/enqueue/redux-extension-users-js", $this->extension_url . 'redux-extension-users' . Redux_Functions::is_min() . '.js' ),
507
-					array( 'jquery', 'redux-js' ),
508
-					self::$version,
509
-					true
510
-				);
511
-
512
-				// Values used by the JavaScript.
513
-				wp_localize_script( 'redux-extension-users', 'reduxUsers', $this->users_roles );
514
-
515
-			}
516
-		}
517
-
518
-
519
-		/**
520
-		 * DEPRECATED
521
-		 */
522
-		public function default_values() {
523
-			if ( ! empty( $this->profiles ) && empty( $this->options_defaults ) ) {
524
-				foreach ( $this->profiles as $key => $profile ) {
525
-					if ( empty( $profile['sections'] ) ) {
526
-						continue;
527
-					}
528
-
529
-					// fill the cache.
530
-					foreach ( $profile['sections'] as $sk => $section ) {
531
-						if ( ! isset( $section['id'] ) ) {
532
-							if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
533
-								$section['id'] = $sk;
534
-							} else {
535
-								$section['id'] = sanitize_title( $section['title'], $sk );
536
-							}
537
-							$this->profiles[ $key ]['sections'][ $sk ] = $section;
538
-						}
539
-						if ( isset( $section['fields'] ) ) {
540
-							foreach ( $section['fields'] as $k => $field ) {
541
-								if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
542
-									continue;
543
-								}
544
-
545
-								if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
546
-									$this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
547
-									unset( $this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
548
-								}
549
-
550
-								if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
551
-									$field['class']  = $field['class'] ?? '';
552
-									$field['class'] .= 'redux-section-indent-start';
553
-
554
-									$this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
555
-								}
556
-
557
-								if ( ! isset( $this->parent->options_defaults_class ) ) {
558
-									$this->parent->options_defaults_class = new Redux_Options_Defaults();
559
-								}
560
-
561
-								$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
562
-
563
-								if ( 'repeater' === $field['type'] ) {
564
-									foreach ( $field['fields'] as $f ) {
565
-										$this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
566
-									}
567
-								}
568
-
569
-								$this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
570
-							}
571
-						}
572
-					}
573
-				}
574
-			}
575
-
576
-			if ( empty( $this->meta ) ) {
577
-				// phpcs:ignore WordPress.Security.NonceVerification
578
-				$user       = isset( $_GET['user_id'] ) ? sanitize_text_field( wp_unslash( $_GET['user_id'] ) ) : get_current_user_id();
579
-				$this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
580
-			}
581
-		}
582
-
583
-		/**
584
-		 * Add Profiles.
585
-		 */
586
-		public function add_profiles() {
587
-			if ( empty( $this->profiles ) || ! is_array( $this->profiles ) ) {
588
-				return;
589
-			}
590
-
591
-			foreach ( $this->profiles as $key => $profile ) {
592
-				if ( empty( $profile['sections'] ) ) {
593
-					continue;
594
-				}
595
-
596
-				$defaults = array(
597
-					'id'         => "$key",
598
-					'section_id' => $key,
599
-					'profiles'   => array(),
600
-				);
601
-
602
-				$profile = wp_parse_args( $profile, $defaults );
603
-
604
-				// Override the parent args on a meta-term level.
605
-				if ( empty( $this->orig_args ) ) {
606
-					$this->orig_args = $this->parent->args;
607
-				}
608
-
609
-				if ( isset( $profile['args'] ) ) {
610
-					$this->parent->args = wp_parse_args( $profile['args'], $this->orig_args );
611
-				} elseif ( $this->parent->args !== $this->orig_args ) {
612
-					$this->parent->args = $this->orig_args;
613
-				}
614
-
615
-				if ( ! isset( $profile['class'] ) ) {
616
-					$profile['class'] = array();
617
-				}
618
-
619
-				if ( ! empty( $profile['class'] ) ) {
620
-					if ( ! is_array( $profile['class'] ) ) {
621
-						$profile['class'] = array( $profile['class'] );
622
-					}
623
-				}
624
-
625
-				$profile['class'] = $this->add_user_classes( $profile['class'] );
626
-
627
-				if ( isset( $profile['post_format'] ) ) {
628
-					$profile['class'] = $this->add_user_hide_class( $profile['class'] );
629
-				}
630
-
631
-				global $pagenow;
632
-				if ( strpos( $pagenow, 'edit-' ) !== false ) {
633
-
634
-					$profile['style']   = 'wp';
635
-					$profile['class'][] = ' edit-page';
636
-					$profile['class'][] = ' redux-wp-style';
637
-				}
638
-
639
-				$this->generate_profiles( array( 'args' => $profile ) );
640
-			}
641
-		}
642
-
643
-		/**
644
-		 * Field Default.
645
-		 *
646
-		 * @param array $field_id ID.
647
-		 *
648
-		 * @return mixed|string
649
-		 */
650
-		public function field_default( array $field_id ) {
651
-			if ( ! isset( $this->parent->options_defaults ) ) {
652
-				$this->parent->options_defaults = $this->parent->default_values();
653
-			}
654
-
655
-			if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
656
-				if ( ! isset( $this->parent->options_class ) ) {
657
-					$this->parent->options_class = new Redux_Options_Constructor( $this->parent );
658
-				}
659
-
660
-				$this->parent->options_class->get();
661
-			}
662
-
663
-			if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
664
-				return $this->parent->options[ $field_id['id'] ];
665
-			} else {
666
-				if ( empty( $this->options_defaults ) ) {
667
-					$this->default_values(); // fill cache.
668
-				}
669
-
670
-				$data = '';
671
-				if ( ! empty( $this->options_defaults ) ) {
672
-					$data = $this->options_defaults[ $field_id['id'] ] ?? '';
673
-				}
674
-
675
-				if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
676
-					$data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
677
-				}
678
-
679
-				return $data;
680
-			}
681
-		}
682
-
683
-		/**
684
-		 * Function to get and cache the post-meta.
685
-		 *
686
-		 * @param string $id ID.
687
-		 *
688
-		 * @return array
689
-		 */
690
-		private function get_meta( string $id ): array {
691
-			if ( ! isset( $this->meta[ $id ] ) ) {
692
-				$this->meta[ $id ] = array();
693
-				$o_data            = get_post_meta( $id );
694
-
695
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
696
-				$o_data = apply_filters( "redux/users/{$this->parent->args['opt_name']}/get_meta", $o_data );
697
-
698
-				if ( ! empty( $o_data ) ) {
699
-					foreach ( $o_data as $key => $value ) {
700
-						if ( count( $value ) === 1 ) {
701
-							$this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
702
-						} else {
703
-							$new_value = array_map( 'maybe_unserialize', $value );
704
-
705
-							$this->meta[ $id ][ $key ] = $new_value[0];
706
-						}
707
-					}
708
-				}
709
-
710
-				if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
711
-					$data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
712
-
713
-					foreach ( $data as $key => $value ) {
714
-						$this->meta[ $id ][ $key ] = $value;
715
-						update_post_meta( $id, $key, $value );
716
-					}
717
-
718
-					unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
719
-
720
-					delete_post_meta( $id, $this->parent->args['opt_name'] );
721
-				}
722
-			}
723
-
724
-			return $this->meta[ $id ];
725
-		}
726
-
727
-		/**
728
-		 * Get values.
729
-		 *
730
-		 * @param mixed  $the_post Post array.
731
-		 * @param string $meta_key Meta key.
732
-		 * @param string $def_val  Default value.
733
-		 *
734
-		 * @return mixed|string
735
-		 */
736
-		public function get_values( $the_post, string $meta_key = '', string $def_val = '' ) {
737
-
738
-			// Override these values if they differ from the admin panel defaults.  ;).
739
-			if ( isset( $the_post->users_role ) && in_array( $the_post->users_role, $this->users_roles, true ) ) {
740
-				if ( isset( $this->users_role_values[ $the_post->users_role ] ) ) {
741
-					$meta = $this->profile_fields[ $the_post->users_role ];
742
-				} else {
743
-					$defaults = array();
744
-					if ( ! empty( $this->profile_fields[ $the_post->users_role ] ) ) {
745
-						foreach ( $this->profile_fields[ $the_post->users_role ] as $key => $null ) {
746
-							if ( isset( $this->options_defaults[ $key ] ) ) {
747
-								$defaults[ $key ] = $this->options_defaults[ $key ];
748
-							}
749
-						}
750
-					}
751
-
752
-					$meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
753
-
754
-					$this->profile_fields[ $the_post->users_role ] = $meta;
755
-				}
756
-
757
-				if ( ! empty( $meta_key ) ) {
758
-					if ( ! isset( $meta[ $meta_key ] ) ) {
759
-						$meta[ $meta_key ] = $def_val;
760
-					}
761
-
762
-					return $meta[ $meta_key ];
763
-				} else {
764
-					return $meta;
765
-				}
766
-			}
767
-
768
-			return $def_val;
769
-		}
770
-
771
-		/**
772
-		 * Check Edit Visibility.
773
-		 *
774
-		 * @param array $params Array.
775
-		 *
776
-		 * @return bool
777
-		 */
778
-		private function check_edit_visibility( array $params = array() ): bool {
779
-			global $pagenow;
780
-
781
-			// Edit page visibility.
782
-			if ( strpos( $pagenow, 'edit-' ) !== false ) {
783
-				if ( isset( $params['fields'] ) ) {
784
-					foreach ( $params['fields'] as $field ) {
785
-						if ( in_array( $field['id'], Redux_Core::$fields_hidden, true ) ) { //phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
786
-							// Not visible.
787
-						} elseif ( isset( $field['add_visibility'] ) && $field['add_visibility'] ) {
788
-							return true;
789
-						}
790
-					}
791
-
792
-					return false;
793
-				}
794
-				if ( isset( $params['add_visibility'] ) && $params['add_visibility'] ) {
795
-					return true;
796
-				}
797
-
798
-				return false;
799
-			}
800
-
801
-			return true;
802
-		}
803
-
804
-		/**
805
-		 * Generate Profiles.
806
-		 *
807
-		 * @param array $metaterm Meta term.
808
-		 */
809
-		private function generate_profiles( array $metaterm ) {
810
-			if ( ! empty( $metaterm['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metaterm['args']['permissions'] ) ) {
811
-				return;
812
-			}
813
-
814
-			if ( isset( $metaterm['args']['style'] ) && in_array( $metaterm['args']['style'], array( 'wp', 'wordpress' ), true ) ) {
815
-				$container_class             = 'redux-wp-style';
816
-				$metaterm['args']['sidebar'] = false;
817
-			} elseif ( isset( $metaterm['args']['sidebar'] ) && ! $metaterm['args']['sidebar'] ) {
818
-				$container_class = 'redux-no-sections';
819
-			} else {
820
-				$container_class = 'redux-has-sections';
821
-			}
822
-
823
-			$class = implode( ' ', $metaterm['args']['class'] );
824
-			echo '<div class="' . esc_attr( $class ) . '">';
825
-
826
-			$sections = $metaterm['args']['sections'];
827
-
828
-			wp_nonce_field( 'redux_users_meta_nonce', 'redux_users_meta_nonce' );
829
-
830
-			wp_dequeue_script( 'json-view-js' );
831
-
832
-			$sidebar = true;
833
-			if ( count( $sections ) === 1 || ( isset( $metaterm['args']['sidebar'] ) && false === $metaterm['args']['sidebar'] ) ) {
834
-				$sidebar = false; // Show the section dividers or not.
835
-			}
836
-			?>
436
+            } elseif ( 1 === count( $clean_queries ) ) {
437
+                $clean_queries['relation'] = 'OR';
438
+
439
+                // Default to AND.
440
+            } else {
441
+                $clean_queries['relation'] = 'AND';
442
+            }
443
+
444
+            return $clean_queries;
445
+        }
446
+
447
+        /**
448
+         * Is the first order clause.
449
+         *
450
+         * @param array $query Query array.
451
+         *
452
+         * @return bool
453
+         */
454
+        protected function is_first_order_clause( array $query ): bool {
455
+            return isset( $query['key'] ) || isset( $query['value'] );
456
+        }
457
+
458
+        /**
459
+         * Support file and field enqueue.
460
+         */
461
+        public function enqueue() {
462
+            global $pagenow;
463
+
464
+            if ( in_array( $pagenow, $this->pagenows, true ) ) {
465
+
466
+                if ( 'user-new.php' === $pagenow ) {
467
+                    $this->parent->args['disable_save_warn'] = true;
468
+                }
469
+
470
+                $this->parent->transients       = get_transient( $this->parent->args['opt_name'] . '-transients-users' );
471
+                $this->parent->transients_check = $this->parent->transients;
472
+
473
+                if ( isset( $this->parent->transients['notices'] ) ) {
474
+                    $this->notices                              = $this->parent->transients['notices'];
475
+                    $this->parent->transients['last_save_mode'] = 'users';
476
+                }
477
+
478
+                delete_transient( $this->parent->args['opt_name'] . '-transients-users' );
479
+
480
+                $this->parent->enqueue_class->init();
481
+
482
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
483
+                do_action( "redux/users/{$this->parent->args['opt_name']}/enqueue" );
484
+
485
+                /**
486
+                 * Redux users CSS
487
+                 * filter 'redux/page/{opt_name}/enqueue/redux-extension-users-css'
488
+                 */
489
+                if ( true === $this->parent->args['dev_mode'] ) {
490
+                    wp_enqueue_style(
491
+                        'redux-extension-users',
492
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
493
+                        apply_filters( "redux/users/{$this->parent->args['opt_name']}/enqueue/redux-extension-users-css", $this->extension_url . 'redux-extension-users.css' ),
494
+                        array(),
495
+                        self::$version
496
+                    );
497
+                }
498
+
499
+                /**
500
+                 * Redux users JS
501
+                 * filter 'redux/page/{opt_name}/enqueue/redux-extension-users-js
502
+                 */
503
+                wp_enqueue_script(
504
+                    'redux-extension-users',
505
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
506
+                    apply_filters( "redux/users/{$this->parent->args['opt_name']}/enqueue/redux-extension-users-js", $this->extension_url . 'redux-extension-users' . Redux_Functions::is_min() . '.js' ),
507
+                    array( 'jquery', 'redux-js' ),
508
+                    self::$version,
509
+                    true
510
+                );
511
+
512
+                // Values used by the JavaScript.
513
+                wp_localize_script( 'redux-extension-users', 'reduxUsers', $this->users_roles );
514
+
515
+            }
516
+        }
517
+
518
+
519
+        /**
520
+         * DEPRECATED
521
+         */
522
+        public function default_values() {
523
+            if ( ! empty( $this->profiles ) && empty( $this->options_defaults ) ) {
524
+                foreach ( $this->profiles as $key => $profile ) {
525
+                    if ( empty( $profile['sections'] ) ) {
526
+                        continue;
527
+                    }
528
+
529
+                    // fill the cache.
530
+                    foreach ( $profile['sections'] as $sk => $section ) {
531
+                        if ( ! isset( $section['id'] ) ) {
532
+                            if ( ! is_numeric( $sk ) || ! isset( $section['title'] ) ) {
533
+                                $section['id'] = $sk;
534
+                            } else {
535
+                                $section['id'] = sanitize_title( $section['title'], $sk );
536
+                            }
537
+                            $this->profiles[ $key ]['sections'][ $sk ] = $section;
538
+                        }
539
+                        if ( isset( $section['fields'] ) ) {
540
+                            foreach ( $section['fields'] as $k => $field ) {
541
+                                if ( empty( $field['id'] ) && empty( $field['type'] ) ) {
542
+                                    continue;
543
+                                }
544
+
545
+                                if ( 'ace_editor' === $field['type'] && isset( $field['options'] ) ) {
546
+                                    $this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['args'] = $field['options'];
547
+                                    unset( $this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ]['options'] );
548
+                                }
549
+
550
+                                if ( 'section' === $field['type'] && isset( $field['indent'] ) && true === $field['indent'] ) {
551
+                                    $field['class']  = $field['class'] ?? '';
552
+                                    $field['class'] .= 'redux-section-indent-start';
553
+
554
+                                    $this->profiles[ $key ]['sections'][ $sk ]['fields'][ $k ] = $field;
555
+                                }
556
+
557
+                                if ( ! isset( $this->parent->options_defaults_class ) ) {
558
+                                    $this->parent->options_defaults_class = new Redux_Options_Defaults();
559
+                                }
560
+
561
+                                $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $field );
562
+
563
+                                if ( 'repeater' === $field['type'] ) {
564
+                                    foreach ( $field['fields'] as $f ) {
565
+                                        $this->parent->options_defaults_class->field_default_values( $this->parent->args['opt_name'], $f, null, true );
566
+                                    }
567
+                                }
568
+
569
+                                $this->parent->options_defaults = $this->parent->options_defaults_class->options_defaults;
570
+                            }
571
+                        }
572
+                    }
573
+                }
574
+            }
575
+
576
+            if ( empty( $this->meta ) ) {
577
+                // phpcs:ignore WordPress.Security.NonceVerification
578
+                $user       = isset( $_GET['user_id'] ) ? sanitize_text_field( wp_unslash( $_GET['user_id'] ) ) : get_current_user_id();
579
+                $this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
580
+            }
581
+        }
582
+
583
+        /**
584
+         * Add Profiles.
585
+         */
586
+        public function add_profiles() {
587
+            if ( empty( $this->profiles ) || ! is_array( $this->profiles ) ) {
588
+                return;
589
+            }
590
+
591
+            foreach ( $this->profiles as $key => $profile ) {
592
+                if ( empty( $profile['sections'] ) ) {
593
+                    continue;
594
+                }
595
+
596
+                $defaults = array(
597
+                    'id'         => "$key",
598
+                    'section_id' => $key,
599
+                    'profiles'   => array(),
600
+                );
601
+
602
+                $profile = wp_parse_args( $profile, $defaults );
603
+
604
+                // Override the parent args on a meta-term level.
605
+                if ( empty( $this->orig_args ) ) {
606
+                    $this->orig_args = $this->parent->args;
607
+                }
608
+
609
+                if ( isset( $profile['args'] ) ) {
610
+                    $this->parent->args = wp_parse_args( $profile['args'], $this->orig_args );
611
+                } elseif ( $this->parent->args !== $this->orig_args ) {
612
+                    $this->parent->args = $this->orig_args;
613
+                }
614
+
615
+                if ( ! isset( $profile['class'] ) ) {
616
+                    $profile['class'] = array();
617
+                }
618
+
619
+                if ( ! empty( $profile['class'] ) ) {
620
+                    if ( ! is_array( $profile['class'] ) ) {
621
+                        $profile['class'] = array( $profile['class'] );
622
+                    }
623
+                }
624
+
625
+                $profile['class'] = $this->add_user_classes( $profile['class'] );
626
+
627
+                if ( isset( $profile['post_format'] ) ) {
628
+                    $profile['class'] = $this->add_user_hide_class( $profile['class'] );
629
+                }
630
+
631
+                global $pagenow;
632
+                if ( strpos( $pagenow, 'edit-' ) !== false ) {
633
+
634
+                    $profile['style']   = 'wp';
635
+                    $profile['class'][] = ' edit-page';
636
+                    $profile['class'][] = ' redux-wp-style';
637
+                }
638
+
639
+                $this->generate_profiles( array( 'args' => $profile ) );
640
+            }
641
+        }
642
+
643
+        /**
644
+         * Field Default.
645
+         *
646
+         * @param array $field_id ID.
647
+         *
648
+         * @return mixed|string
649
+         */
650
+        public function field_default( array $field_id ) {
651
+            if ( ! isset( $this->parent->options_defaults ) ) {
652
+                $this->parent->options_defaults = $this->parent->default_values();
653
+            }
654
+
655
+            if ( ! isset( $this->parent->options ) || empty( $this->parent->options ) ) {
656
+                if ( ! isset( $this->parent->options_class ) ) {
657
+                    $this->parent->options_class = new Redux_Options_Constructor( $this->parent );
658
+                }
659
+
660
+                $this->parent->options_class->get();
661
+            }
662
+
663
+            if ( isset( $this->parent->options[ $field_id['id'] ] ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) && $this->parent->options[ $field_id['id'] ] !== $this->parent->options_defaults[ $field_id['id'] ] ) {
664
+                return $this->parent->options[ $field_id['id'] ];
665
+            } else {
666
+                if ( empty( $this->options_defaults ) ) {
667
+                    $this->default_values(); // fill cache.
668
+                }
669
+
670
+                $data = '';
671
+                if ( ! empty( $this->options_defaults ) ) {
672
+                    $data = $this->options_defaults[ $field_id['id'] ] ?? '';
673
+                }
674
+
675
+                if ( empty( $data ) && isset( $this->parent->options_defaults[ $field_id['id'] ] ) ) {
676
+                    $data = $this->parent->options_defaults[ $field_id['id'] ] ?? '';
677
+                }
678
+
679
+                return $data;
680
+            }
681
+        }
682
+
683
+        /**
684
+         * Function to get and cache the post-meta.
685
+         *
686
+         * @param string $id ID.
687
+         *
688
+         * @return array
689
+         */
690
+        private function get_meta( string $id ): array {
691
+            if ( ! isset( $this->meta[ $id ] ) ) {
692
+                $this->meta[ $id ] = array();
693
+                $o_data            = get_post_meta( $id );
694
+
695
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
696
+                $o_data = apply_filters( "redux/users/{$this->parent->args['opt_name']}/get_meta", $o_data );
697
+
698
+                if ( ! empty( $o_data ) ) {
699
+                    foreach ( $o_data as $key => $value ) {
700
+                        if ( count( $value ) === 1 ) {
701
+                            $this->meta[ $id ][ $key ] = maybe_unserialize( $value[0] );
702
+                        } else {
703
+                            $new_value = array_map( 'maybe_unserialize', $value );
704
+
705
+                            $this->meta[ $id ][ $key ] = $new_value[0];
706
+                        }
707
+                    }
708
+                }
709
+
710
+                if ( isset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] ) ) {
711
+                    $data = maybe_unserialize( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
712
+
713
+                    foreach ( $data as $key => $value ) {
714
+                        $this->meta[ $id ][ $key ] = $value;
715
+                        update_post_meta( $id, $key, $value );
716
+                    }
717
+
718
+                    unset( $this->meta[ $id ][ $this->parent->args['opt_name'] ] );
719
+
720
+                    delete_post_meta( $id, $this->parent->args['opt_name'] );
721
+                }
722
+            }
723
+
724
+            return $this->meta[ $id ];
725
+        }
726
+
727
+        /**
728
+         * Get values.
729
+         *
730
+         * @param mixed  $the_post Post array.
731
+         * @param string $meta_key Meta key.
732
+         * @param string $def_val  Default value.
733
+         *
734
+         * @return mixed|string
735
+         */
736
+        public function get_values( $the_post, string $meta_key = '', string $def_val = '' ) {
737
+
738
+            // Override these values if they differ from the admin panel defaults.  ;).
739
+            if ( isset( $the_post->users_role ) && in_array( $the_post->users_role, $this->users_roles, true ) ) {
740
+                if ( isset( $this->users_role_values[ $the_post->users_role ] ) ) {
741
+                    $meta = $this->profile_fields[ $the_post->users_role ];
742
+                } else {
743
+                    $defaults = array();
744
+                    if ( ! empty( $this->profile_fields[ $the_post->users_role ] ) ) {
745
+                        foreach ( $this->profile_fields[ $the_post->users_role ] as $key => $null ) {
746
+                            if ( isset( $this->options_defaults[ $key ] ) ) {
747
+                                $defaults[ $key ] = $this->options_defaults[ $key ];
748
+                            }
749
+                        }
750
+                    }
751
+
752
+                    $meta = wp_parse_args( $this->get_meta( $the_post->ID ), $defaults );
753
+
754
+                    $this->profile_fields[ $the_post->users_role ] = $meta;
755
+                }
756
+
757
+                if ( ! empty( $meta_key ) ) {
758
+                    if ( ! isset( $meta[ $meta_key ] ) ) {
759
+                        $meta[ $meta_key ] = $def_val;
760
+                    }
761
+
762
+                    return $meta[ $meta_key ];
763
+                } else {
764
+                    return $meta;
765
+                }
766
+            }
767
+
768
+            return $def_val;
769
+        }
770
+
771
+        /**
772
+         * Check Edit Visibility.
773
+         *
774
+         * @param array $params Array.
775
+         *
776
+         * @return bool
777
+         */
778
+        private function check_edit_visibility( array $params = array() ): bool {
779
+            global $pagenow;
780
+
781
+            // Edit page visibility.
782
+            if ( strpos( $pagenow, 'edit-' ) !== false ) {
783
+                if ( isset( $params['fields'] ) ) {
784
+                    foreach ( $params['fields'] as $field ) {
785
+                        if ( in_array( $field['id'], Redux_Core::$fields_hidden, true ) ) { //phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
786
+                            // Not visible.
787
+                        } elseif ( isset( $field['add_visibility'] ) && $field['add_visibility'] ) {
788
+                            return true;
789
+                        }
790
+                    }
791
+
792
+                    return false;
793
+                }
794
+                if ( isset( $params['add_visibility'] ) && $params['add_visibility'] ) {
795
+                    return true;
796
+                }
797
+
798
+                return false;
799
+            }
800
+
801
+            return true;
802
+        }
803
+
804
+        /**
805
+         * Generate Profiles.
806
+         *
807
+         * @param array $metaterm Meta term.
808
+         */
809
+        private function generate_profiles( array $metaterm ) {
810
+            if ( ! empty( $metaterm['args']['permissions'] ) && ! Redux_Helpers::current_user_can( $metaterm['args']['permissions'] ) ) {
811
+                return;
812
+            }
813
+
814
+            if ( isset( $metaterm['args']['style'] ) && in_array( $metaterm['args']['style'], array( 'wp', 'wordpress' ), true ) ) {
815
+                $container_class             = 'redux-wp-style';
816
+                $metaterm['args']['sidebar'] = false;
817
+            } elseif ( isset( $metaterm['args']['sidebar'] ) && ! $metaterm['args']['sidebar'] ) {
818
+                $container_class = 'redux-no-sections';
819
+            } else {
820
+                $container_class = 'redux-has-sections';
821
+            }
822
+
823
+            $class = implode( ' ', $metaterm['args']['class'] );
824
+            echo '<div class="' . esc_attr( $class ) . '">';
825
+
826
+            $sections = $metaterm['args']['sections'];
827
+
828
+            wp_nonce_field( 'redux_users_meta_nonce', 'redux_users_meta_nonce' );
829
+
830
+            wp_dequeue_script( 'json-view-js' );
831
+
832
+            $sidebar = true;
833
+            if ( count( $sections ) === 1 || ( isset( $metaterm['args']['sidebar'] ) && false === $metaterm['args']['sidebar'] ) ) {
834
+                $sidebar = false; // Show the section dividers or not.
835
+            }
836
+            ?>
837 837
 			<div data-opt-name="<?php echo esc_attr( $this->parent->args['opt_name'] ); ?>"
838 838
 				class="redux-container <?php echo( esc_attr( $container_class ) ); ?> redux-term redux-box-normal redux-term-normal">
839 839
 				<div class="redux-notices">
@@ -857,292 +857,292 @@  discard block
 block discarded – undo
857 857
 					</div>
858 858
 				</div>
859 859
 				<?php
860
-				echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
861
-				if ( $sidebar ) {
862
-					?>
860
+                echo '<a href="javascript:void(0);" class="expand_options hide" style="display:none;">' . esc_html__( 'Expand', 'redux-framework' ) . '</a>';
861
+                if ( $sidebar ) {
862
+                    ?>
863 863
 					<div class="redux-sidebar">
864 864
 						<ul class="redux-group-menu">
865 865
 							<?php
866
-							foreach ( $sections as $s_key => $section ) {
867
-								if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
868
-									continue;
869
-								}
870
-
871
-								// phpcs:ignore WordPress.Security.EscapeOutput
872
-								echo $this->parent->render_class->section_menu( $s_key, $section, '_' . $metaterm['args']['id'], $sections );
873
-							}
874
-							?>
866
+                            foreach ( $sections as $s_key => $section ) {
867
+                                if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
868
+                                    continue;
869
+                                }
870
+
871
+                                // phpcs:ignore WordPress.Security.EscapeOutput
872
+                                echo $this->parent->render_class->section_menu( $s_key, $section, '_' . $metaterm['args']['id'], $sections );
873
+                            }
874
+                            ?>
875 875
 						</ul>
876 876
 					</div>
877 877
 				<?php } ?>
878 878
 				<div class="redux-main">
879 879
 					<?php
880 880
 
881
-					foreach ( $sections as $s_key => $section ) {
882
-						if ( ! $this->check_edit_visibility( $section ) ) {
883
-							continue;
884
-						}
885
-
886
-						if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
887
-							continue;
888
-						}
889
-
890
-						if ( ! empty( $section['fields'] ) ) {
891
-							if ( isset( $section['args'] ) ) {
892
-								$this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
893
-							} elseif ( $this->parent->args !== $this->orig_args ) {
894
-								$this->parent->args = $this->orig_args;
895
-							}
896
-
897
-							$hide             = $sidebar ? '' : ' display-group';
898
-							$section['class'] = isset( $section['class'] ) ? " {$section['class']}" : '';
899
-
900
-							// phpcs:ignore WordPress.Security.EscapeOutput
901
-							echo "<div id='{$s_key}_{$metaterm['args']['id']}_section_group' class='redux-group-tab{$section['class']} redux_metaterm_panel$hide'>";
902
-
903
-							if ( ! empty( $section['title'] ) ) {
904
-								echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
905
-							}
906
-
907
-							if ( ! empty( $section['desc'] ) ) {
908
-								echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
909
-							}
910
-
911
-							echo '<table class="form-table"><tbody>';
912
-
913
-							foreach ( $section['fields'] as $field ) {
914
-								if ( ! $this->check_edit_visibility( $field ) ) {
915
-									continue;
916
-								}
917
-
918
-								if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
919
-									continue;
920
-								}
921
-
922
-								$field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
923
-
924
-								$is_hidden = false;
925
-								$ex_style  = '';
926
-								if ( isset( $field['hidden'] ) && $field['hidden'] ) {
927
-									$is_hidden = true;
928
-									$ex_style  = ' style="border-bottom: none;"';
929
-								}
930
-
931
-								echo '<tr valign="top"' . $ex_style . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
932
-
933
-								$th = $this->parent->render_class->get_header_html( $field );
934
-
935
-								if ( $is_hidden ) {
936
-									$str_pos = strpos( $th, 'redux_field_th' );
937
-
938
-									if ( $str_pos > - 1 ) {
939
-										$th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
940
-									}
941
-								}
942
-
943
-								if ( $sidebar ) {
944
-									if ( ! ( isset( $metaterm['args']['sections'] ) && count( $metaterm['args']['sections'] ) === 1 && isset( $metaterm['args']['sections'][0]['fields'] ) && count( $metaterm['args']['sections'][0]['fields'] ) === 1 ) && isset( $field['title'] ) ) {
945
-										echo '<th scope="row">';
946
-										if ( ! empty( $th ) ) {
947
-											echo $th; //phpcs:ignore WordPress.Security.EscapeOutput
948
-										}
949
-										echo '</th>';
950
-										echo '<td>';
951
-									}
952
-								} else {
953
-									echo '<td>' . $th; //phpcs:ignore WordPress.Security.EscapeOutput
954
-								}
955
-
956
-								if ( 'section' === $field['type'] && true === $field['indent'] ) {
957
-									$field['class']  = $field['class'] ?? '';
958
-									$field['class'] .= 'redux-section-indent-start';
959
-								}
960
-
961
-								if ( ! isset( $this->meta[ $field['id'] ] ) ) {
962
-									$this->meta[ $field['id'] ] = '';
963
-								}
964
-
965
-								$this->parent->render_class->field_input( $field, $this->meta[ $field['id'] ] );
966
-								echo '</td></tr>';
967
-							}
968
-							echo '</tbody></table>';
969
-							echo '</div>';
970
-						}
971
-					}
972
-					?>
881
+                    foreach ( $sections as $s_key => $section ) {
882
+                        if ( ! $this->check_edit_visibility( $section ) ) {
883
+                            continue;
884
+                        }
885
+
886
+                        if ( ! empty( $section['permissions'] ) && ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
887
+                            continue;
888
+                        }
889
+
890
+                        if ( ! empty( $section['fields'] ) ) {
891
+                            if ( isset( $section['args'] ) ) {
892
+                                $this->parent->args = wp_parse_args( $section['args'], $this->orig_args );
893
+                            } elseif ( $this->parent->args !== $this->orig_args ) {
894
+                                $this->parent->args = $this->orig_args;
895
+                            }
896
+
897
+                            $hide             = $sidebar ? '' : ' display-group';
898
+                            $section['class'] = isset( $section['class'] ) ? " {$section['class']}" : '';
899
+
900
+                            // phpcs:ignore WordPress.Security.EscapeOutput
901
+                            echo "<div id='{$s_key}_{$metaterm['args']['id']}_section_group' class='redux-group-tab{$section['class']} redux_metaterm_panel$hide'>";
902
+
903
+                            if ( ! empty( $section['title'] ) ) {
904
+                                echo '<h3 class="redux-section-title">' . wp_kses_post( $section['title'] ) . '</h3>';
905
+                            }
906
+
907
+                            if ( ! empty( $section['desc'] ) ) {
908
+                                echo '<div class="redux-section-desc">' . wp_kses_post( $section['desc'] ) . '</div>';
909
+                            }
910
+
911
+                            echo '<table class="form-table"><tbody>';
912
+
913
+                            foreach ( $section['fields'] as $field ) {
914
+                                if ( ! $this->check_edit_visibility( $field ) ) {
915
+                                    continue;
916
+                                }
917
+
918
+                                if ( ! empty( $field['permissions'] ) && ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
919
+                                    continue;
920
+                                }
921
+
922
+                                $field['name'] = $this->parent->args['opt_name'] . '[' . $field['id'] . ']';
923
+
924
+                                $is_hidden = false;
925
+                                $ex_style  = '';
926
+                                if ( isset( $field['hidden'] ) && $field['hidden'] ) {
927
+                                    $is_hidden = true;
928
+                                    $ex_style  = ' style="border-bottom: none;"';
929
+                                }
930
+
931
+                                echo '<tr valign="top"' . $ex_style . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
932
+
933
+                                $th = $this->parent->render_class->get_header_html( $field );
934
+
935
+                                if ( $is_hidden ) {
936
+                                    $str_pos = strpos( $th, 'redux_field_th' );
937
+
938
+                                    if ( $str_pos > - 1 ) {
939
+                                        $th = str_replace( 'redux_field_th', 'redux_field_th hide', $th );
940
+                                    }
941
+                                }
942
+
943
+                                if ( $sidebar ) {
944
+                                    if ( ! ( isset( $metaterm['args']['sections'] ) && count( $metaterm['args']['sections'] ) === 1 && isset( $metaterm['args']['sections'][0]['fields'] ) && count( $metaterm['args']['sections'][0]['fields'] ) === 1 ) && isset( $field['title'] ) ) {
945
+                                        echo '<th scope="row">';
946
+                                        if ( ! empty( $th ) ) {
947
+                                            echo $th; //phpcs:ignore WordPress.Security.EscapeOutput
948
+                                        }
949
+                                        echo '</th>';
950
+                                        echo '<td>';
951
+                                    }
952
+                                } else {
953
+                                    echo '<td>' . $th; //phpcs:ignore WordPress.Security.EscapeOutput
954
+                                }
955
+
956
+                                if ( 'section' === $field['type'] && true === $field['indent'] ) {
957
+                                    $field['class']  = $field['class'] ?? '';
958
+                                    $field['class'] .= 'redux-section-indent-start';
959
+                                }
960
+
961
+                                if ( ! isset( $this->meta[ $field['id'] ] ) ) {
962
+                                    $this->meta[ $field['id'] ] = '';
963
+                                }
964
+
965
+                                $this->parent->render_class->field_input( $field, $this->meta[ $field['id'] ] );
966
+                                echo '</td></tr>';
967
+                            }
968
+                            echo '</tbody></table>';
969
+                            echo '</div>';
970
+                        }
971
+                    }
972
+                    ?>
973 973
 				</div>
974 974
 				<div class="clear"></div>
975 975
 			</div>
976 976
 			<?php
977 977
 
978
-			echo '</div>';
979
-		}
980
-
981
-		/**
982
-		 * Save meta-profiles
983
-		 * Runs when a post is saved and does an action which to write panel save scripts can hook into.
984
-		 *
985
-		 * @access public
986
-		 *
987
-		 * @param mixed $user_id User ID.
988
-		 *
989
-		 * @return boolean
990
-		 */
991
-		public function user_meta_save( $user_id = 0 ): bool {
992
-			if ( ! current_user_can( 'edit_user', $user_id ) ) {
993
-				return false;
994
-			}
995
-
996
-			// Check if our nonce is set.
997
-			if ( ! isset( $_POST['redux_users_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
998
-				return false;
999
-			}
1000
-
1001
-			// Verify that the nonce is valid.
1002
-			if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_users_meta_nonce'] ) ), 'redux_users_meta_nonce' ) ) {
1003
-				return false;
1004
-			}
1005
-
1006
-			$check_user_id = sanitize_text_field( wp_unslash( $_POST['checkuser_id'] ?? 1 ) );
1007
-
1008
-			$user       = sanitize_text_field( wp_unslash( $_POST['user_id'] ?? get_current_user_id() ) );
1009
-			$this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
1010
-
1011
-			$to_save    = array();
1012
-			$to_compare = array();
1013
-			$to_delete  = array();
1014
-			$dont_save  = true;
1015
-
1016
-			$field_args = Redux_Users::$fields[ $this->parent->args['opt_name'] ];
1017
-
1018
-			foreach ( $_POST[ $this->parent->args['opt_name'] ] as $key => $value ) { // phpcs:ignore WordPress.Security
1019
-				$key = sanitize_text_field( wp_unslash( $key ) );
1020
-
1021
-				if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1022
-					foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1023
-
1024
-						// Do not save anything the user doesn't have permissions for.
1025
-						if ( isset( $field_args[ $key ] ) ) {
1026
-							if ( user_can( $user_id, $pv ) && user_can( $check_user_id, $pv ) ) {
1027
-								break;
1028
-							}
1029
-						}
1030
-					}
1031
-				}
1032
-
1033
-				// Have to remove the escaping for array comparison.
1034
-				if ( is_array( $value ) ) {
1035
-					foreach ( $value as $k => $v ) {
1036
-						if ( ! is_array( $v ) ) {
1037
-							$value[ $k ] = sanitize_text_field( wp_unslash( $v ) );
1038
-						}
1039
-					}
1040
-				}
1041
-
1042
-				$save = true;
1043
-
1044
-				// parent_options.
1045
-				if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1046
-					$save = false;
1047
-				}
1048
-
1049
-				if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1050
-					$save = false;
1051
-				}
1052
-
1053
-				if ( $save ) {
1054
-					$to_save[ $key ]    = $value;
1055
-					$to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1056
-				} else {
1057
-					$to_delete[ $key ] = $value;
1058
-				}
1059
-			}
1060
-
1061
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1062
-			$to_save = apply_filters( "redux/{$this->parent->args['opt_name']}/users/save/before_validate", $to_save, $to_compare, $this->sections );
1063
-
1064
-			$validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1065
-
1066
-			// Validate fields (if needed).
1067
-			foreach ( $to_save as $key => $value ) {
1068
-				if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1069
-					if ( isset( $this->meta[ $key ] ) && $validate[ $key ] === $this->meta[ $key ] ) {
1070
-						unset( $to_save[ $key ] );
1071
-					} else {
1072
-						$to_save[ $key ] = $validate[ $key ];
1073
-					}
1074
-				}
1075
-			}
1076
-
1077
-			if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1078
-				$this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1079
-
1080
-				if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1081
-					$this->parent->transients['notices']['errors'] = $this->parent->errors;
1082
-					$update_transients                             = true;
1083
-				}
1084
-
1085
-				if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1086
-					$this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1087
-					$update_transients                               = true;
1088
-				}
1089
-
1090
-				if ( isset( $update_transients ) ) {
1091
-					$this->parent->transients['notices']['override'] = 1;
1092
-					set_transient( $this->parent->args['opt_name'] . '-transients-users', $this->parent->transients );
1093
-				}
1094
-			}
1095
-
1096
-			$check = $this->profile_fields;
1097
-
1098
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
1099
-			$to_save = apply_filters( 'redux/users/save', $to_save, $to_compare, $this->sections );
1100
-
1101
-			foreach ( $to_save as $key => $value ) {
1102
-				$prev_value = $this->meta[ $key ] ?? '';
1103
-
1104
-				if ( isset( $check[ $key ] ) ) {
1105
-					unset( $check[ $key ] );
1106
-				}
1107
-
1108
-				update_user_meta( $user_id, $key, $value, $prev_value );
1109
-			}
1110
-
1111
-			foreach ( $to_delete as $key => $value ) {
1112
-				if ( isset( $check[ $key ] ) ) {
1113
-					unset( $check[ $key ] );
1114
-				}
1115
-
1116
-				$prev_value = $this->meta[ $key ] ?? '';
1117
-				delete_user_meta( $user_id, $key, $prev_value );
1118
-			}
1119
-			if ( ! empty( $check ) ) {
1120
-				foreach ( $check as $key => $value ) {
1121
-					delete_user_meta( $user_id, $key );
1122
-				}
1123
-			}
1124
-
1125
-			return true;
1126
-		}
1127
-
1128
-		/**
1129
-		 * Show any stored error messages.
1130
-		 *
1131
-		 * @access public
1132
-		 * @return void
1133
-		 */
1134
-		public function meta_profiles_show_errors() {
1135
-			if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1136
-				echo '<div id="redux_users_errors" class="error fade">';
1137
-				echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1138
-				echo '</div>';
1139
-			}
1140
-
1141
-			if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1142
-				echo '<div id="redux_users_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1143
-				echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1144
-				echo '</div>';
1145
-			}
1146
-		}
1147
-	}
978
+            echo '</div>';
979
+        }
980
+
981
+        /**
982
+         * Save meta-profiles
983
+         * Runs when a post is saved and does an action which to write panel save scripts can hook into.
984
+         *
985
+         * @access public
986
+         *
987
+         * @param mixed $user_id User ID.
988
+         *
989
+         * @return boolean
990
+         */
991
+        public function user_meta_save( $user_id = 0 ): bool {
992
+            if ( ! current_user_can( 'edit_user', $user_id ) ) {
993
+                return false;
994
+            }
995
+
996
+            // Check if our nonce is set.
997
+            if ( ! isset( $_POST['redux_users_meta_nonce'] ) || ! isset( $_POST[ $this->parent->args['opt_name'] ] ) ) {
998
+                return false;
999
+            }
1000
+
1001
+            // Verify that the nonce is valid.
1002
+            if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['redux_users_meta_nonce'] ) ), 'redux_users_meta_nonce' ) ) {
1003
+                return false;
1004
+            }
1005
+
1006
+            $check_user_id = sanitize_text_field( wp_unslash( $_POST['checkuser_id'] ?? 1 ) );
1007
+
1008
+            $user       = sanitize_text_field( wp_unslash( $_POST['user_id'] ?? get_current_user_id() ) );
1009
+            $this->meta = Redux_Users::get_user_meta( array( 'user' => $user ) );
1010
+
1011
+            $to_save    = array();
1012
+            $to_compare = array();
1013
+            $to_delete  = array();
1014
+            $dont_save  = true;
1015
+
1016
+            $field_args = Redux_Users::$fields[ $this->parent->args['opt_name'] ];
1017
+
1018
+            foreach ( $_POST[ $this->parent->args['opt_name'] ] as $key => $value ) { // phpcs:ignore WordPress.Security
1019
+                $key = sanitize_text_field( wp_unslash( $key ) );
1020
+
1021
+                if ( ! empty( $field_args[ $key ]['permissions'] ) ) {
1022
+                    foreach ( (array) $field_args[ $key ]['permissions'] as $pv ) {
1023
+
1024
+                        // Do not save anything the user doesn't have permissions for.
1025
+                        if ( isset( $field_args[ $key ] ) ) {
1026
+                            if ( user_can( $user_id, $pv ) && user_can( $check_user_id, $pv ) ) {
1027
+                                break;
1028
+                            }
1029
+                        }
1030
+                    }
1031
+                }
1032
+
1033
+                // Have to remove the escaping for array comparison.
1034
+                if ( is_array( $value ) ) {
1035
+                    foreach ( $value as $k => $v ) {
1036
+                        if ( ! is_array( $v ) ) {
1037
+                            $value[ $k ] = sanitize_text_field( wp_unslash( $v ) );
1038
+                        }
1039
+                    }
1040
+                }
1041
+
1042
+                $save = true;
1043
+
1044
+                // parent_options.
1045
+                if ( ! $dont_save && isset( $this->options_defaults[ $key ] ) && $value === $this->options_defaults[ $key ] ) {
1046
+                    $save = false;
1047
+                }
1048
+
1049
+                if ( $save && isset( $this->parent_options[ $key ] ) && $this->parent_options[ $key ] !== $value ) {
1050
+                    $save = false;
1051
+                }
1052
+
1053
+                if ( $save ) {
1054
+                    $to_save[ $key ]    = $value;
1055
+                    $to_compare[ $key ] = $this->parent->options[ $key ] ?? '';
1056
+                } else {
1057
+                    $to_delete[ $key ] = $value;
1058
+                }
1059
+            }
1060
+
1061
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1062
+            $to_save = apply_filters( "redux/{$this->parent->args['opt_name']}/users/save/before_validate", $to_save, $to_compare, $this->sections );
1063
+
1064
+            $validate = $this->parent->validate_class->validate( $to_save, $to_compare, $this->sections );
1065
+
1066
+            // Validate fields (if needed).
1067
+            foreach ( $to_save as $key => $value ) {
1068
+                if ( isset( $validate[ $key ] ) && $validate[ $key ] !== $value ) {
1069
+                    if ( isset( $this->meta[ $key ] ) && $validate[ $key ] === $this->meta[ $key ] ) {
1070
+                        unset( $to_save[ $key ] );
1071
+                    } else {
1072
+                        $to_save[ $key ] = $validate[ $key ];
1073
+                    }
1074
+                }
1075
+            }
1076
+
1077
+            if ( ! empty( $this->parent->errors ) || ! empty( $this->parent->warnings ) ) {
1078
+                $this->parent->transients['notices'] = ( isset( $this->parent->transients['notices'] ) && is_array( $this->parent->transients['notices'] ) ) ? $this->parent->transients['notices'] : array();
1079
+
1080
+                if ( ! isset( $this->parent->transients['notices']['errors'] ) || $this->parent->transients['notices']['errors'] !== $this->parent->errors ) {
1081
+                    $this->parent->transients['notices']['errors'] = $this->parent->errors;
1082
+                    $update_transients                             = true;
1083
+                }
1084
+
1085
+                if ( ! isset( $this->parent->transients['notices']['warnings'] ) || $this->parent->transients['notices']['warnings'] !== $this->parent->warnings ) {
1086
+                    $this->parent->transients['notices']['warnings'] = $this->parent->warnings;
1087
+                    $update_transients                               = true;
1088
+                }
1089
+
1090
+                if ( isset( $update_transients ) ) {
1091
+                    $this->parent->transients['notices']['override'] = 1;
1092
+                    set_transient( $this->parent->args['opt_name'] . '-transients-users', $this->parent->transients );
1093
+                }
1094
+            }
1095
+
1096
+            $check = $this->profile_fields;
1097
+
1098
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
1099
+            $to_save = apply_filters( 'redux/users/save', $to_save, $to_compare, $this->sections );
1100
+
1101
+            foreach ( $to_save as $key => $value ) {
1102
+                $prev_value = $this->meta[ $key ] ?? '';
1103
+
1104
+                if ( isset( $check[ $key ] ) ) {
1105
+                    unset( $check[ $key ] );
1106
+                }
1107
+
1108
+                update_user_meta( $user_id, $key, $value, $prev_value );
1109
+            }
1110
+
1111
+            foreach ( $to_delete as $key => $value ) {
1112
+                if ( isset( $check[ $key ] ) ) {
1113
+                    unset( $check[ $key ] );
1114
+                }
1115
+
1116
+                $prev_value = $this->meta[ $key ] ?? '';
1117
+                delete_user_meta( $user_id, $key, $prev_value );
1118
+            }
1119
+            if ( ! empty( $check ) ) {
1120
+                foreach ( $check as $key => $value ) {
1121
+                    delete_user_meta( $user_id, $key );
1122
+                }
1123
+            }
1124
+
1125
+            return true;
1126
+        }
1127
+
1128
+        /**
1129
+         * Show any stored error messages.
1130
+         *
1131
+         * @access public
1132
+         * @return void
1133
+         */
1134
+        public function meta_profiles_show_errors() {
1135
+            if ( isset( $this->notices['errors'] ) && ! empty( $this->notices['errors'] ) ) {
1136
+                echo '<div id="redux_users_errors" class="error fade">';
1137
+                echo '<p><strong><span></span> ' . count( $this->notices['errors'] ) . ' ' . esc_html__( 'error(s) were found!', 'redux-framework' ) . '</strong></p>';
1138
+                echo '</div>';
1139
+            }
1140
+
1141
+            if ( isset( $this->notices['warnings'] ) && ! empty( $this->notices['warnings'] ) ) {
1142
+                echo '<div id="redux_users_warnings" class="error fade" style="border-left-color: #E8E20C;">';
1143
+                echo '<p><strong><span></span> ' . count( $this->notices['warnings'] ) . ' ' . esc_html__( 'warnings(s) were found!', 'redux-framework' ) . '</strong></p>';
1144
+                echo '</div>';
1145
+            }
1146
+        }
1147
+    }
1148 1148
 }
Please login to merge, or discard this patch.
redux-templates/classes/class-templates.php 1 patch
Indentation   +151 added lines, -151 removed lines patch added patch discarded remove patch
@@ -17,155 +17,155 @@
 block discarded – undo
17 17
  */
18 18
 class Templates {
19 19
 
20
-	/**
21
-	 * Default container width.
22
-	 *
23
-	 * @var int
24
-	 */
25
-	public static int $content_width = 1200;
26
-
27
-	/**
28
-	 * ReduxTemplates Template.
29
-	 *
30
-	 * @since 4.0.0
31
-	 */
32
-	public function __construct() {
33
-		global $pagenow;
34
-
35
-		if ( 'widgets.php' === $pagenow ) {
36
-			return;
37
-		}
38
-
39
-		if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && ( class_exists( 'Classic_Editor' ) || defined( 'DISABLE_GUTENBERG_FILE' ) || class_exists( 'CodePopular_disable_gutenberg' ) ) ) {
40
-
41
-			// We don't want to add templates unless it's a gutenberg page.
42
-			return;
43
-		}
44
-
45
-		// Include ReduxTemplates default template without a wrapper.
46
-		add_filter( 'template_include', array( $this, 'template_include' ) );
47
-
48
-		// Override the default content-width when using Redux templates so the template doesn't look like shit.
49
-		add_action( 'wp', array( $this, 'modify_template_content_width' ) );
50
-
51
-		// Add ReduxTemplates supported Post types in page template.
52
-		$post_types = get_post_types( array(), 'object' );
53
-
54
-		if ( ! empty( $post_types ) ) {
55
-			foreach ( $post_types as $post_type ) {
56
-				if ( isset( $post_type->name ) && isset( $post_type->show_in_rest ) && true === $post_type->show_in_rest ) {
57
-					add_filter( "theme_{$post_type->name}_templates", array( $this, 'add_templates' ) );
58
-				}
59
-			}
60
-		}
61
-
62
-		add_filter( 'admin_body_class', array( $this, 'add_body_class' ), 999 );
63
-	}
64
-
65
-	/**
66
-	 * Add the redux-template class to the admin body if a redux-templates page type is selected.
67
-	 *
68
-	 * @param string|null $classes Classes string for the admin panel.
69
-	 *
70
-	 * @return string|null
71
-	 * @since 4.1.19
72
-	 */
73
-	public function add_body_class( ?string $classes ): ?string {
74
-		global $post;
75
-
76
-		$screen = get_current_screen();
77
-
78
-		if ( 'post' === $screen->base && get_current_screen()->is_block_editor() ) {
79
-			$check = get_post_meta( $post->ID, '_wp_page_template', true );
80
-
81
-			if ( strpos( $check, 'redux-templates_' ) !== false ) {
82
-				$classes .= ' redux-template';
83
-			}
84
-		}
85
-
86
-		return $classes;
87
-	}
88
-
89
-	/**
90
-	 * Override the $content_width variable for themes, so our templates work properly and don't look squished.
91
-	 *
92
-	 * @param array $to_find Template keys to check against.
93
-	 *
94
-	 * @return bool
95
-	 * @since 4.0.0
96
-	 */
97
-	public function check_template( array $to_find = array() ): bool {
98
-		global $post;
99
-
100
-		if ( ! empty( $post ) ) {
101
-			$template = get_page_template_slug( $post->ID );
102
-
103
-			if ( false !== strpos( $template, 'redux' ) ) {
104
-				$test = mb_strtolower( preg_replace( '/[^A-Za-z0-9 ]/', '', $template ) );
105
-
106
-				foreach ( $to_find as $key ) {
107
-					if ( false !== strpos( $test, $key ) ) {
108
-						return true;
109
-					}
110
-				}
111
-			}
112
-		}
113
-
114
-		return false;
115
-	}
116
-
117
-	/**
118
-	 * Override the $content_width variable for themes, so our templates work properly and don't look squished.
119
-	 *
120
-	 * @since 4.0.0
121
-	 */
122
-	public function modify_template_content_width() {
123
-		$to_find = array( 'cover', 'canvas', 'fullwidth' );
124
-		if ( $this->check_template( $to_find ) ) {
125
-			global $content_width;
126
-			if ( $content_width < 1000 ) {
127
-				$content_width = get_option( '_redux_content_width', self::$content_width );
128
-			}
129
-		}
130
-	}
131
-
132
-	/**
133
-	 * Include the template
134
-	 *
135
-	 * @param string|null $template Template type.
136
-	 *
137
-	 * @return string|null
138
-	 * @since 4.0.0
139
-	 */
140
-	public function template_include( ?string $template ): ?string {
141
-		if ( is_singular() ) {
142
-			$page_template = get_post_meta( get_the_ID(), '_wp_page_template', true );
143
-
144
-			if ( 'redux-templates_full_width' === $page_template ) {
145
-				$template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-full-width.php';
146
-			} elseif ( 'redux-templates_contained' === $page_template ) {
147
-				$template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-contained.php';
148
-			} elseif ( 'redux-templates_canvas' === $page_template ) {
149
-				$template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-canvas.php';
150
-			}
151
-		}
152
-
153
-		return $template;
154
-	}
155
-
156
-	/**
157
-	 * Hook to add the templates to the dropdown
158
-	 *
159
-	 * @param array $post_templates Default post template array.
160
-	 *
161
-	 * @return array
162
-	 * @since 4.0.0
163
-	 */
164
-	public function add_templates( array $post_templates ): array {
165
-		$post_templates['redux-templates_contained']  = __( 'Redux Contained', 'redux-framework' );
166
-		$post_templates['redux-templates_full_width'] = __( 'Redux Full Width', 'redux-framework' );
167
-		$post_templates['redux-templates_canvas']     = __( 'Redux Canvas', 'redux-framework' );
168
-
169
-		return $post_templates;
170
-	}
20
+    /**
21
+     * Default container width.
22
+     *
23
+     * @var int
24
+     */
25
+    public static int $content_width = 1200;
26
+
27
+    /**
28
+     * ReduxTemplates Template.
29
+     *
30
+     * @since 4.0.0
31
+     */
32
+    public function __construct() {
33
+        global $pagenow;
34
+
35
+        if ( 'widgets.php' === $pagenow ) {
36
+            return;
37
+        }
38
+
39
+        if ( ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) && ( class_exists( 'Classic_Editor' ) || defined( 'DISABLE_GUTENBERG_FILE' ) || class_exists( 'CodePopular_disable_gutenberg' ) ) ) {
40
+
41
+            // We don't want to add templates unless it's a gutenberg page.
42
+            return;
43
+        }
44
+
45
+        // Include ReduxTemplates default template without a wrapper.
46
+        add_filter( 'template_include', array( $this, 'template_include' ) );
47
+
48
+        // Override the default content-width when using Redux templates so the template doesn't look like shit.
49
+        add_action( 'wp', array( $this, 'modify_template_content_width' ) );
50
+
51
+        // Add ReduxTemplates supported Post types in page template.
52
+        $post_types = get_post_types( array(), 'object' );
53
+
54
+        if ( ! empty( $post_types ) ) {
55
+            foreach ( $post_types as $post_type ) {
56
+                if ( isset( $post_type->name ) && isset( $post_type->show_in_rest ) && true === $post_type->show_in_rest ) {
57
+                    add_filter( "theme_{$post_type->name}_templates", array( $this, 'add_templates' ) );
58
+                }
59
+            }
60
+        }
61
+
62
+        add_filter( 'admin_body_class', array( $this, 'add_body_class' ), 999 );
63
+    }
64
+
65
+    /**
66
+     * Add the redux-template class to the admin body if a redux-templates page type is selected.
67
+     *
68
+     * @param string|null $classes Classes string for the admin panel.
69
+     *
70
+     * @return string|null
71
+     * @since 4.1.19
72
+     */
73
+    public function add_body_class( ?string $classes ): ?string {
74
+        global $post;
75
+
76
+        $screen = get_current_screen();
77
+
78
+        if ( 'post' === $screen->base && get_current_screen()->is_block_editor() ) {
79
+            $check = get_post_meta( $post->ID, '_wp_page_template', true );
80
+
81
+            if ( strpos( $check, 'redux-templates_' ) !== false ) {
82
+                $classes .= ' redux-template';
83
+            }
84
+        }
85
+
86
+        return $classes;
87
+    }
88
+
89
+    /**
90
+     * Override the $content_width variable for themes, so our templates work properly and don't look squished.
91
+     *
92
+     * @param array $to_find Template keys to check against.
93
+     *
94
+     * @return bool
95
+     * @since 4.0.0
96
+     */
97
+    public function check_template( array $to_find = array() ): bool {
98
+        global $post;
99
+
100
+        if ( ! empty( $post ) ) {
101
+            $template = get_page_template_slug( $post->ID );
102
+
103
+            if ( false !== strpos( $template, 'redux' ) ) {
104
+                $test = mb_strtolower( preg_replace( '/[^A-Za-z0-9 ]/', '', $template ) );
105
+
106
+                foreach ( $to_find as $key ) {
107
+                    if ( false !== strpos( $test, $key ) ) {
108
+                        return true;
109
+                    }
110
+                }
111
+            }
112
+        }
113
+
114
+        return false;
115
+    }
116
+
117
+    /**
118
+     * Override the $content_width variable for themes, so our templates work properly and don't look squished.
119
+     *
120
+     * @since 4.0.0
121
+     */
122
+    public function modify_template_content_width() {
123
+        $to_find = array( 'cover', 'canvas', 'fullwidth' );
124
+        if ( $this->check_template( $to_find ) ) {
125
+            global $content_width;
126
+            if ( $content_width < 1000 ) {
127
+                $content_width = get_option( '_redux_content_width', self::$content_width );
128
+            }
129
+        }
130
+    }
131
+
132
+    /**
133
+     * Include the template
134
+     *
135
+     * @param string|null $template Template type.
136
+     *
137
+     * @return string|null
138
+     * @since 4.0.0
139
+     */
140
+    public function template_include( ?string $template ): ?string {
141
+        if ( is_singular() ) {
142
+            $page_template = get_post_meta( get_the_ID(), '_wp_page_template', true );
143
+
144
+            if ( 'redux-templates_full_width' === $page_template ) {
145
+                $template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-full-width.php';
146
+            } elseif ( 'redux-templates_contained' === $page_template ) {
147
+                $template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-contained.php';
148
+            } elseif ( 'redux-templates_canvas' === $page_template ) {
149
+                $template = REDUXTEMPLATES_DIR_PATH . 'classes/templates/template-canvas.php';
150
+            }
151
+        }
152
+
153
+        return $template;
154
+    }
155
+
156
+    /**
157
+     * Hook to add the templates to the dropdown
158
+     *
159
+     * @param array $post_templates Default post template array.
160
+     *
161
+     * @return array
162
+     * @since 4.0.0
163
+     */
164
+    public function add_templates( array $post_templates ): array {
165
+        $post_templates['redux-templates_contained']  = __( 'Redux Contained', 'redux-framework' );
166
+        $post_templates['redux-templates_full_width'] = __( 'Redux Full Width', 'redux-framework' );
167
+        $post_templates['redux-templates_canvas']     = __( 'Redux Canvas', 'redux-framework' );
168
+
169
+        return $post_templates;
170
+    }
171 171
 }
Please login to merge, or discard this patch.
redux-core/framework.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -452,7 +452,7 @@  discard block
 block discarded – undo
452 452
 		 *
453 453
 		 * @deprecated 4.0.0
454 454
 		 */
455
-		public static bool $_as_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
455
+		public static bool $_as_plugin = false; // phpcs:ignore PSR2.Classes.PropertyDeclaration
456 456
 
457 457
 		/**
458 458
 		 * Deprecated shim for v3 as plugin check.
@@ -461,7 +461,7 @@  discard block
 block discarded – undo
461 461
 		 *
462 462
 		 * @deprecated 4.0.0
463 463
 		 */
464
-		public static bool $_is_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
464
+		public static bool $_is_plugin = false; // phpcs:ignore PSR2.Classes.PropertyDeclaration
465 465
 
466 466
 		/**
467 467
 		 * Cloning is forbidden.
@@ -507,7 +507,7 @@  discard block
 block discarded – undo
507 507
 				return;
508 508
 			}
509 509
 
510
-			if ( ! isset( Redux::$init[ $args['opt_name'] ] ) ) {
510
+			if ( ! isset( Redux::$init[$args['opt_name']] ) ) {
511 511
 				// Let's go back to the Redux API instead of having it run directly.
512 512
 				Redux_Functions_Ex::record_caller( $args['opt_name'] );
513 513
 				Redux::set_args( $args['opt_name'], $args );
@@ -517,7 +517,7 @@  discard block
 block discarded – undo
517 517
 				$sections = Redux::construct_sections( $args['opt_name'] );
518 518
 				$args     = Redux::construct_args( $args['opt_name'] );
519 519
 				Redux::set_defaults( $args['opt_name'] );
520
-				Redux::$init[ $args['opt_name'] ] = 1;
520
+				Redux::$init[$args['opt_name']] = 1;
521 521
 			}
522 522
 
523 523
 			$args             = new Redux_Args( $this, $args );
@@ -913,7 +913,7 @@  discard block
 block discarded – undo
913 913
 		 * @return      mixed
914 914
 		 */
915 915
 		public function get( string $opt_name, $defaults = null ) {
916
-			return ( ! empty( $this->options[ $opt_name ] ) ) ? $this->options[ $opt_name ] : $this->options_class->get_default( $opt_name, $defaults );
916
+			return ( ! empty( $this->options[$opt_name] ) ) ? $this->options[$opt_name] : $this->options_class->get_default( $opt_name, $defaults );
917 917
 		}
918 918
 
919 919
 		/**
@@ -929,7 +929,7 @@  discard block
 block discarded – undo
929 929
 		 */
930 930
 		public function set( string $opt_name = '', $values = array() ) {
931 931
 			if ( ! empty( $opt_name ) && is_array( $values ) ) {
932
-				$this->options[ $opt_name ] = $values;
932
+				$this->options[$opt_name] = $values;
933 933
 				$this->options_class->set( $values );
934 934
 			}
935 935
 		}
Please login to merge, or discard this patch.
Indentation   +850 added lines, -850 removed lines patch added patch discarded remove patch
@@ -39,854 +39,854 @@
 block discarded – undo
39 39
 // Don't duplicate me!
40 40
 if ( ! class_exists( 'ReduxFramework', false ) ) {
41 41
 
42
-	/**
43
-	 * Main ReduxFramework class
44
-	 *
45
-	 * @since       1.0.0
46
-	 */
47
-	class ReduxFramework {
48
-
49
-		/**
50
-		 * ReduxFramework instance storage.
51
-		 *
52
-		 * @var null|ReduxFramework
53
-		 * @access public
54
-		 */
55
-		public static ?ReduxFramework $instance;
56
-
57
-		/**
58
-		 * Redux current version.
59
-		 *
60
-		 * @var string
61
-		 * @access public
62
-		 *
63
-		 * @deprecated 4.0.0
64
-		 */
65
-		public static string $_version = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
66
-
67
-		/**
68
-		 * Absolute directory of the Redux instance.
69
-		 *
70
-		 * @var string
71
-		 * @access public
72
-		 *
73
-		 * @deprecated 4.0.0
74
-		 */
75
-		public static string $_dir = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
76
-
77
-		/**
78
-		 * Full URL of the Redux instance.
79
-		 *
80
-		 * @var string
81
-		 * @access public
82
-		 *
83
-		 * @deprecated 4.0.0
84
-		 */
85
-		public static string $_url = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
86
-
87
-		/**
88
-		 * Current WordPress upload directory.
89
-		 *
90
-		 * @var string
91
-		 * @access public
92
-		 *
93
-		 * @deprecated 4.0.0
94
-		 */
95
-		public static string $_upload_dir = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
96
-
97
-		/**
98
-		 * Current WordPress upload URL
99
-		 *
100
-		 * @var string
101
-		 * @access public
102
-		 *
103
-		 * @deprecated 4.0.0
104
-		 */
105
-		public static string $_upload_url; // phpcs:ignore PSR2.Classes.PropertyDeclaration
106
-
107
-		/**
108
-		 * Init
109
-		 *
110
-		 * Backward compatibility for previous versions of Redux.
111
-		 */
112
-		public static function init() {
113
-
114
-			// Backward compatibility for extensions.
115
-			self::$_version    = Redux_Core::$version;
116
-			self::$_dir        = Redux_Core::$dir;
117
-			self::$_url        = Redux_Core::$url;
118
-			self::$_upload_dir = Redux_Core::$upload_dir;
119
-			self::$_upload_url = Redux_Core::$upload_url;
120
-			self::$_as_plugin  = Redux_Core::$as_plugin;
121
-			self::$_is_plugin  = Redux_Core::$is_plugin;
122
-		}
123
-
124
-		/**
125
-		 * Array of field arrays.
126
-		 *
127
-		 * @var null|array
128
-		 */
129
-		public ?array $fields = array();
130
-
131
-		/**
132
-		 * Array of field sections.
133
-		 *
134
-		 * @var null|array
135
-		 */
136
-		public ?array $field_sections = array();
137
-
138
-		/**
139
-		 * Array of field types.
140
-		 *
141
-		 * @var null|array
142
-		 */
143
-		public ?array $field_types = array();
144
-
145
-		/**
146
-		 * Array of field heads.
147
-		 *
148
-		 * @var null|array
149
-		 */
150
-		public ?array $field_head = array();
151
-
152
-		/**
153
-		 * Array of extensions by type used in the panel.
154
-		 *
155
-		 * @var null|array
156
-		 */
157
-		public ?array $extensions = array();
158
-
159
-		/**
160
-		 * Array of sections and fields arrays.
161
-		 *
162
-		 * @var null|array
163
-		 */
164
-		public ?array $sections = array();
165
-
166
-		/**
167
-		 * Array of generated errors from the panel for localization.
168
-		 *
169
-		 * @var null|array
170
-		 */
171
-		public ?array $errors = array();
172
-
173
-		/**
174
-		 * Array of generated warnings from the panel for localization.
175
-		 *
176
-		 * @var null|array
177
-		 */
178
-		public ?array $warnings = array();
179
-
180
-		/**
181
-		 * Array of generated sanitize notices from the panel for localization.
182
-		 *
183
-		 * @var null|array
184
-		 */
185
-		public ?array $sanitize = array();
186
-
187
-		/**
188
-		 * Array of current option values.
189
-		 *
190
-		 * @var null|array
191
-		 */
192
-		public ?array $options = array();
193
-
194
-		/**
195
-		 * Array of option defaults.
196
-		 *
197
-		 * @var null|array
198
-		 */
199
-		public ?array $options_defaults = null;
200
-
201
-		/**
202
-		 * Array of fields set to trigger the compiler hook.
203
-		 *
204
-		 * @var null|array
205
-		 */
206
-		public ?array $compiler_fields = array();
207
-
208
-		/**
209
-		 * Array of fields with CSS output selectors.
210
-		 *
211
-		 * @var null|array
212
-		 */
213
-		public ?array $output = array();
214
-
215
-		/**
216
-		 * Autogenerated CSS appended to the header (snake case maintained for backward compatibility).
217
-		 *
218
-		 * @var null|string
219
-		 */
220
-		public ?string $outputCSS = ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
221
-
222
-		/**
223
-		 * Autogenerated variables appended to dynamic output.
224
-		 *
225
-		 * @var null|array
226
-		 */
227
-		public ?array $output_variables = array();
228
-
229
-		/**
230
-		 * CSS sent to the compiler hook (snake case maintained for backward compatibility).
231
-		 *
232
-		 * @var null|string
233
-		 */
234
-		public ?string $compilerCSS = ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
235
-
236
-		/**
237
-		 * Array of global arguments.
238
-		 *
239
-		 * @var array|null
240
-		 */
241
-		public ?array $args = array();
242
-
243
-		/**
244
-		 * Used in customizer hooks.
245
-		 *
246
-		 * @var null|string
247
-		 */
248
-		public ?string $old_opt_name = '';
249
-
250
-		/**
251
-		 * Pointer to the Redux_Options_Default class.
252
-		 *
253
-		 * @var null|Redux_Options_Defaults
254
-		 */
255
-		public ?Redux_Options_Defaults $options_defaults_class = null;
256
-
257
-		/**
258
-		 * Pointer to the Redux_Options class.
259
-		 *
260
-		 * @var null|Redux_Options_Constructor
261
-		 */
262
-		public ?Redux_Options_Constructor $options_class = null;
263
-
264
-		/**
265
-		 * Pointer to the Redux_Required class
266
-		 *
267
-		 * @var null|Redux_Required
268
-		 */
269
-		public ?Redux_Required $required_class = null;
270
-
271
-		/**
272
-		 * Pointer to the Redux_Output class.
273
-		 *
274
-		 * @var null|Redux_Output
275
-		 */
276
-		public ?Redux_Output $output_class = null;
277
-
278
-		/**
279
-		 * Pointer to the Redux_Page_Render class.
280
-		 *
281
-		 * @var null|Redux_Page_Render
282
-		 */
283
-		public ?Redux_Page_Render $render_class = null;
284
-
285
-		/**
286
-		 * Pointer to the Redux_Enqueue class.
287
-		 *
288
-		 * @var null|Redux_Enqueue
289
-		 */
290
-		public ?Redux_Enqueue $enqueue_class = null;
291
-
292
-		/**
293
-		 * Pointer to the Redux_Transients class.
294
-		 *
295
-		 * @var null|Redux_Transients
296
-		 */
297
-		public ?Redux_Transients $transient_class = null;
298
-
299
-		/**
300
-		 * Pointer to the Redux_wordPress_Data class.
301
-		 *
302
-		 * @var null|Redux_WordPress_Data
303
-		 */
304
-		public ?Redux_WordPress_Data $wordpress_data = null;
305
-
306
-		/**
307
-		 * Pointer to the Redux_Validation class.
308
-		 *
309
-		 * @var null|Redux_Validation
310
-		 */
311
-		public ?Redux_Validation $validate_class = null;
312
-
313
-		/**
314
-		 * Pointer to the Redux_Sanitize class.
315
-		 *
316
-		 * @var null|Redux_Sanitize
317
-		 */
318
-		public ?Redux_Sanitize $sanitize_class = null;
319
-
320
-		/**
321
-		 * Pointer to the Redux_Args class.
322
-		 *
323
-		 * @var null|Redux_Args
324
-		 */
325
-		public ?Redux_Args $args_class = null;
326
-
327
-		/**
328
-		 * Array of active transients used by Redux.
329
-		 *
330
-		 * @var null|mixed
331
-		 */
332
-		public $transients = array();
333
-
334
-		/**
335
-		 * Array of localized repeater data.
336
-		 *
337
-		 * @var null|array
338
-		 */
339
-		public ?array $repeater_data = array();
340
-
341
-		/**
342
-		 * Array of localized data.
343
-		 *
344
-		 * @var null|array
345
-		 */
346
-		public ?array $localize_data = array();
347
-
348
-		/**
349
-		 * Array of checked transients used by Redux.
350
-		 *
351
-		 * @var null|mixed
352
-		 */
353
-		public $transients_check = array();
354
-
355
-		/**
356
-		 * Never save to DB flag for metaboxes.
357
-		 *
358
-		 * @var bool
359
-		 */
360
-		public bool $never_save_to_db;
361
-
362
-		/**
363
-		 * File system object used for I/O file operations.  Done the WordPress way.
364
-		 *
365
-		 * @var null|object
366
-		 *
367
-		 * @deprecated 4.5.1
368
-		 */
369
-		public ?object $filesystem;
370
-
371
-		/**
372
-		 * Deprecated shim for v3 templates.
373
-		 *
374
-		 * @var null|array
375
-		 *
376
-		 * @deprecated 4.0.0
377
-		 */
378
-		public ?array $hidden_perm_sections = array();
379
-
380
-		/**
381
-		 * Deprecated shim for v3 as plugin check.
382
-		 *
383
-		 * @var bool
384
-		 *
385
-		 * @deprecated 4.0.0
386
-		 */
387
-		public static bool $_as_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
388
-
389
-		/**
390
-		 * Deprecated shim for v3 as plugin check.
391
-		 *
392
-		 * @var bool
393
-		 *
394
-		 * @deprecated 4.0.0
395
-		 */
396
-		public static bool $_is_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
397
-
398
-		/**
399
-		 * Cloning is forbidden.
400
-		 *
401
-		 * @since 4.0.0
402
-		 */
403
-		public function __clone() {
404
-			_doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; eh?', 'redux-framework' ), '4.0' );
405
-		}
406
-
407
-		/**
408
-		 * Un-serializing instances of this class are forbidden.
409
-		 *
410
-		 * @since 4.0.0
411
-		 */
412
-		public function __wakeup() {
413
-			_doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; eh?', 'redux-framework' ), '4.0' );
414
-		}
415
-
416
-		/**
417
-		 * Add a deprecating notice for all the old themes that still use this method..
418
-		 *
419
-		 * @param object $filesystem Filesystem object.
420
-		 *
421
-		 * @since 4.0.0
422
-		 */
423
-		private function deprecated_filesystem( $filesystem ) {
424
-			//_deprecated_function( esc_html__( 'The global variable "$filesystem" of the ReduxFramework object', 'redux-framework' ), '4.5.1', 'Redux_Core::$filesystem' );
425
-
426
-			return $filesystem;
427
-		}
428
-
429
-		/**
430
-		 * Class Constructor. Defines the args for the theme options class
431
-		 *
432
-		 * @param array $sections Panel sections.
433
-		 * @param array $args     Class constructor arguments.
434
-		 *
435
-		 * @throws ReflectionException Exception.
436
-		 * @since       1.0.0
437
-		 */
438
-		public function __construct( array $sections = array(), array $args = array() ) {
439
-			global $pagenow;
440
-
441
-			if ( Redux_Core::is_heartbeat() ) {
442
-				return;
443
-			}
444
-
445
-			$args['load_on_cron'] = $args['load_on_cron'] ?? false;
446
-
447
-			if ( false === $args['load_on_cron'] && 'wp-cron.php' === $pagenow ) {
448
-				return;
449
-			}
450
-
451
-			if ( empty( $args ) || ( empty( $args['opt_name'] ) ) ) {
452
-				return;
453
-			}
454
-
455
-			if ( ! isset( Redux::$init[ $args['opt_name'] ] ) ) {
456
-				// Let's go back to the Redux API instead of having it run directly.
457
-				Redux_Functions_Ex::record_caller( $args['opt_name'] );
458
-				Redux::set_args( $args['opt_name'], $args );
459
-				if ( ! empty( $sections ) ) {
460
-					Redux::set_sections( $args['opt_name'], $sections );
461
-				}
462
-				$sections = Redux::construct_sections( $args['opt_name'] );
463
-				$args     = Redux::construct_args( $args['opt_name'] );
464
-				Redux::set_defaults( $args['opt_name'] );
465
-				Redux::$init[ $args['opt_name'] ] = 1;
466
-			}
467
-
468
-			$args             = new Redux_Args( $this, $args );
469
-			$this->args_class = $args;
470
-			$this->args       = $args->get;
471
-
472
-			Redux_Core::core_construct( $this );
473
-
474
-			new Redux_Admin_Notices( $this );
475
-
476
-			if ( ! empty( $this->args['opt_name'] ) ) {
477
-				new Redux_Instances( $this );
478
-
479
-				Redux_Core::$filesystem = Redux_Filesystem::get_instance( $this );
480
-
481
-				$this->filesystem = $this->deprecated_filesystem( Redux_Core::$filesystem );
482
-
483
-				/**
484
-				 * Filter 'redux/options/{opt_name}/sections'
485
-				 *
486
-				 * @param  array $sections field option sections
487
-				 */
488
-
489
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
490
-				$this->sections = apply_filters( "redux/options/{$this->args['opt_name']}/sections", $sections );
491
-
492
-				/**
493
-				 * Construct hook
494
-				 * action 'redux/construct'
495
-				 *
496
-				 * @param object $this ReduxFramework
497
-				 */
498
-
499
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
500
-				do_action( 'redux/construct', $this );
501
-
502
-				// Internationalization.
503
-				new Redux_I18n( $this, __FILE__ );
504
-
505
-				$this->required_class  = new Redux_Required( $this );
506
-				$this->transient_class = new Redux_Transients( $this );
507
-				$this->wordpress_data  = new Redux_WordPress_Data( $this );
508
-				$this->validate_class  = new Redux_Validation( $this );
509
-				$this->sanitize_class  = new Redux_Sanitize( $this );
510
-
511
-				// Register extra extensions.
512
-				new Redux_Extensions( $this );
513
-
514
-				// Grab database values.
515
-				$this->options_defaults_class = new Redux_Options_Defaults();
516
-				$this->options_class          = new Redux_Options_Constructor( $this );
517
-				$this->options_class->get();
518
-
519
-				$this->output_class  = new Redux_Output( $this );
520
-				$this->render_class  = new Redux_Page_Render( $this );
521
-				$this->enqueue_class = new Redux_Enqueue( $this );
522
-
523
-				new Redux_AJAX_Save( $this );
524
-				new Redux_AJAX_Typography( $this );
525
-				new Redux_AJAX_Select2( $this );
526
-			}
527
-
528
-			/**
529
-			 * Loaded hook
530
-			 * action 'redux/loaded'
531
-			 *
532
-			 * @param  object $this ReduxFramework
533
-			 */
534
-
535
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
536
-			do_action( 'redux/loaded', $this );
537
-		}
538
-
539
-		/**
540
-		 * Begin backward compatibility shims for Redux v3 configs and extensions.
541
-		 */
542
-
543
-		/**
544
-		 * SHIM: _register_settings
545
-		 *
546
-		 * @deprecated 4.0.0
547
-		 */
548
-		public function _register_settings() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
549
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->register()' );
550
-
551
-			$this->options_class->register();
552
-		}
553
-
554
-		/**
555
-		 * SHIM: _field_input
556
-		 *
557
-		 * @param array        $field Field array.
558
-		 * @param string|array $v     Field values.
559
-		 *
560
-		 * @deprecated 4.0.0
561
-		 */
562
-		public function _field_input( array $field, $v = null ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
563
-			_deprecated_function( __FUNCTION__, '4.0.0', 'render_class->field_input( $field, $value )' );
564
-
565
-			$this->render_class->field_input( $field, $v );
566
-		}
567
-
568
-		/**
569
-		 * SHIM: field_default_values
570
-		 *
571
-		 * @param array $field Field array.
572
-		 *
573
-		 * @deprecated 4.0.0
574
-		 */
575
-		public function field_default_values( array $field ) {
576
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_defaults_class->field_default_values( $opt_name, $field )' );
577
-
578
-			$this->options_defaults_class->field_default_values( '', $field );
579
-		}
580
-
581
-		/**
582
-		 * SHIM: set_options
583
-		 *
584
-		 * @param string|array $value Option values.
585
-		 *
586
-		 * @deprecated 4.0.0
587
-		 */
588
-		public function set_options( $value ) {
589
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->set( $value )' );
590
-
591
-			$this->options_class->set( $value );
592
-		}
593
-
594
-		/**
595
-		 * SHIM: get_options
596
-		 *
597
-		 * @deprecated 4.0.0
598
-		 */
599
-		public function get_options() {
600
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get()' );
601
-
602
-			$this->options_class->get();
603
-		}
604
-
605
-		/**
606
-		 * SHIM: _default_values
607
-		 *
608
-		 * @return array
609
-		 *
610
-		 * @deprecated 4.0.0
611
-		 */
612
-		public function _default_values() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
613
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->default_values()' );
614
-
615
-			return $this->default_values();
616
-		}
617
-
618
-		/**
619
-		 * Get default values.
620
-		 *
621
-		 * @return array
622
-		 */
623
-		public function default_values() {
624
-			if ( ! isset( $this->options_class ) ) {
625
-				$this->options_defaults_class = new Redux_Options_Defaults();
626
-				$this->options_class          = new Redux_Options_Constructor( $this );
627
-			}
628
-
629
-			return $this->options_class->default_values();
630
-		}
631
-
632
-		/**
633
-		 * SHIM: check_dependencies
634
-		 *
635
-		 * @param array $field Field array.
636
-		 *
637
-		 * @deprecated 4.0.0
638
-		 */
639
-		public function check_dependencies( array $field ) {
640
-			_deprecated_function( __FUNCTION__, '4.0.0', 'required_class->check_dependencies( $field )' );
641
-
642
-			$this->required_class->check_dependencies( $field );
643
-		}
644
-
645
-		/**
646
-		 * SHIM: _enqueue_output
647
-		 *
648
-		 * @throws ReflectionException Exception.
649
-		 *
650
-		 * @deprecated 4.0.0
651
-		 */
652
-		public function _enqueue_output() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
653
-			_deprecated_function( __FUNCTION__, '4.0.0', 'output_class->enqueue()' );
654
-
655
-			if ( empty( $this->output_class ) ) {
656
-				$obj          = new ReduxFramework( $this->sections, $this->args );
657
-				$obj->options = $this->options;
658
-				$obj->output_class->enqueue();
659
-				$this->outputCSS = $obj->outputCSS; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
660
-			} else {
661
-				$this->output_class->enqueue();
662
-			}
663
-		}
664
-
665
-		/**
666
-		 * SHIM: _enqueue
667
-		 *
668
-		 * @deprecated 4.0.0
669
-		 */
670
-		public function _enqueue() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
671
-			_deprecated_function( __FUNCTION__, '4.0.0', 'enqueue_class->init()' );
672
-
673
-			$this->enqueue_class->init();
674
-		}
675
-
676
-		/**
677
-		 * _enqueue replacement.
678
-		 *
679
-		 * @return void
680
-		 */
681
-		public function init_enqueue() {
682
-			$this->enqueue_class->init();
683
-		}
684
-
685
-		/**
686
-		 * SHIM: generate_panel
687
-		 *
688
-		 * @since       1.0.0
689
-		 * @access      public
690
-		 * @return      void
691
-		 *
692
-		 * @deprecated 4.0.0
693
-		 */
694
-		public function generate_panel() {
695
-			_deprecated_function( __FUNCTION__, '4.0.0', 'render_class->generate_panel()' );
696
-
697
-			$this->render_class->generate_panel();
698
-		}
699
-
700
-		/**
701
-		 * SHIM: get_default_values
702
-		 *
703
-		 * @param string $key       Key value.
704
-		 * @param bool   $array_key Flag to determine array status.
705
-		 *
706
-		 * @return array
707
-		 *
708
-		 * @deprecated 4.0.0
709
-		 */
710
-		public function get_default_values( $key, $array_key = false ) {
711
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get_default_value( $key, $array_key )' );
712
-
713
-			if ( ! isset( $this->options_class ) ) {
714
-				$this->options_defaults_class = new Redux_Options_Defaults();
715
-				$this->options_class          = new Redux_Options_Constructor( $this );
716
-			}
717
-
718
-			return $this->options_class->get_default_value( $key, $array_key );
719
-		}
720
-
721
-		/**
722
-		 * SHIM: get_default_value
723
-		 *
724
-		 * @param string $key       Key value.
725
-		 * @param bool   $array_key Flag to determine array status.
726
-		 *
727
-		 * @return array
728
-		 *
729
-		 * @deprecated 4.0.0
730
-		 */
731
-		public function get_default_value( $key, $array_key = false ) {
732
-			_deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get_default_value( $key, $array_key )' );
733
-
734
-			if ( ! isset( $this->options_class ) ) {
735
-				$this->options_defaults_class = new Redux_Options_Defaults();
736
-				$this->options_class          = new Redux_Options_Constructor( $this );
737
-			}
738
-
739
-			return $this->options_class->get_default_value( $key, $array_key );
740
-		}
741
-
742
-		/**
743
-		 * SHIM: get_wordpress_data
744
-		 *
745
-		 * @param bool         $type data type.
746
-		 * @param array        $args args to pass to WordPress API.
747
-		 * @param string|array $current_value Current value.
748
-		 *
749
-		 * @return array|mixed|string|void
750
-		 *
751
-		 * @deprecated 4.0.0
752
-		 */
753
-		public function get_wordpress_data( $type = false, $args = array(), $current_value = null ) {
754
-			_deprecated_function( __FUNCTION__, '4.0.0', 'wordpress_data->get( $type, $args, $opt_name, $value )' );
755
-
756
-			return $this->wordpress_data->get( $type, $args, $this->args['opt_name'], $current_value );
757
-		}
758
-
759
-		/**
760
-		 * SHIM: _validate_values
761
-		 *
762
-		 * @param array $plugin_options Current panel options.
763
-		 * @param array $options        Options to validate.
764
-		 * @param array $sections       Sections array.
765
-		 *
766
-		 * @return array
767
-		 *
768
-		 * @deprecated 4.0.0
769
-		 */
770
-		public function _validate_values( $plugin_options, $options, $sections ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
771
-			_deprecated_function( __FUNCTION__, '4.0.0', 'validate_class->validate( $plugin_options, $options, $sections )' );
772
-
773
-			if ( ! isset( $this->validate_class ) ) {
774
-				$this->validate_class = new Redux_Validation( $this );
775
-			}
776
-
777
-			return $this->validate_class->validate( $plugin_options, $options, $sections );
778
-		}
779
-
780
-		/**
781
-		 * SHIM: set_transients
782
-		 *
783
-		 * @return void
784
-		 *
785
-		 * @deprecated 4.0.0
786
-		 */
787
-		public function set_transients() {
788
-			_deprecated_function( __FUNCTION__, '4.0.0', 'Please update the extension that uses this deprecated function.' );
789
-		}
790
-
791
-		/**
792
-		 * SHIM: section_menu
793
-		 *
794
-		 * @param int    $k        Array Key.
795
-		 * @param array  $section  Section array.
796
-		 * @param string $suffix   Unique string.
797
-		 * @param array  $sections Section array.
798
-		 *
799
-		 * @return string
800
-		 *
801
-		 * @deprecated 4.0.0
802
-		 */
803
-		public function section_menu( $k, $section, $suffix = '', $sections = array() ) {
804
-			_deprecated_function( __FUNCTION__, '4.0.0', 'render_class->section_menu( $index, $section, $suffix, $sections )' );
805
-
806
-			return $this->render_class->section_menu( $k, $section, $suffix, $sections );
807
-		}
808
-
809
-		/**
810
-		 * SHIM: get_header_html
811
-		 *
812
-		 * @param array $field Field array.
813
-		 *
814
-		 * @return string
815
-		 *
816
-		 * @deprecated 4.0.0
817
-		 */
818
-		public function get_header_html( $field ) {
819
-			_deprecated_function( __FUNCTION__, '4.0.0', 'render_class->get_header_html( $field )' );
820
-
821
-			return $this->render_class->get_header_html( $field );
822
-		}
823
-
824
-		/**
825
-		 * SHIM: current_user_can
826
-		 *
827
-		 * @param string $permission User permission.
828
-		 *
829
-		 * @return bool
830
-		 *
831
-		 * @deprecated 4.0.0
832
-		 */
833
-		public function current_user_can( $permission ) {
834
-			_deprecated_function( __FUNCTION__, '4.0.0', 'Redux_Helpers::current_user_can' );
835
-
836
-			return Redux_Helpers::current_user_can( $permission );
837
-		}
838
-
839
-		/**
840
-		 * End backward compatibility shims for Redux v3 configs and extensions.
841
-		 */
842
-
843
-		/**
844
-		 * Pointer to the ReduxFramework instance.
845
-		 *
846
-		 * @return ReduxFramework|null
847
-		 */
848
-		public function get_instance(): ?ReduxFramework {
849
-			return self::$instance;
850
-		}
851
-
852
-		/**
853
-		 * →get(); This is used to return and option value from the option array
854
-		 *
855
-		 * @since       1.0.0
856
-		 * @access      public
857
-		 *
858
-		 * @param       string $opt_name The option name to return.
859
-		 * @param       mixed  $defaults (null) The value to return if an option isn't set.
860
-		 *
861
-		 * @return      mixed
862
-		 */
863
-		public function get( string $opt_name, $defaults = null ) {
864
-			return ( ! empty( $this->options[ $opt_name ] ) ) ? $this->options[ $opt_name ] : $this->options_class->get_default( $opt_name, $defaults );
865
-		}
866
-
867
-		/**
868
-		 * →set(); This is used to set an arbitrary option in the option array
869
-		 *
870
-		 * @since       1.0.0
871
-		 * @access      public
872
-		 *
873
-		 * @param       string $opt_name The name of the option being added.
874
-		 * @param       mixed  $values   The value of the option being added.
875
-		 *
876
-		 * @return      void
877
-		 */
878
-		public function set( string $opt_name = '', $values = array() ) {
879
-			if ( ! empty( $opt_name ) && is_array( $values ) ) {
880
-				$this->options[ $opt_name ] = $values;
881
-				$this->options_class->set( $values );
882
-			}
883
-		}
884
-	}
885
-
886
-	ReduxFramework::init();
887
-
888
-	/**
889
-	 * Action 'redux/init'
890
-	 */
891
-	do_action( 'redux/init' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName
42
+    /**
43
+     * Main ReduxFramework class
44
+     *
45
+     * @since       1.0.0
46
+     */
47
+    class ReduxFramework {
48
+
49
+        /**
50
+         * ReduxFramework instance storage.
51
+         *
52
+         * @var null|ReduxFramework
53
+         * @access public
54
+         */
55
+        public static ?ReduxFramework $instance;
56
+
57
+        /**
58
+         * Redux current version.
59
+         *
60
+         * @var string
61
+         * @access public
62
+         *
63
+         * @deprecated 4.0.0
64
+         */
65
+        public static string $_version = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
66
+
67
+        /**
68
+         * Absolute directory of the Redux instance.
69
+         *
70
+         * @var string
71
+         * @access public
72
+         *
73
+         * @deprecated 4.0.0
74
+         */
75
+        public static string $_dir = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
76
+
77
+        /**
78
+         * Full URL of the Redux instance.
79
+         *
80
+         * @var string
81
+         * @access public
82
+         *
83
+         * @deprecated 4.0.0
84
+         */
85
+        public static string $_url = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
86
+
87
+        /**
88
+         * Current WordPress upload directory.
89
+         *
90
+         * @var string
91
+         * @access public
92
+         *
93
+         * @deprecated 4.0.0
94
+         */
95
+        public static string $_upload_dir = ''; // phpcs:ignore PSR2.Classes.PropertyDeclaration
96
+
97
+        /**
98
+         * Current WordPress upload URL
99
+         *
100
+         * @var string
101
+         * @access public
102
+         *
103
+         * @deprecated 4.0.0
104
+         */
105
+        public static string $_upload_url; // phpcs:ignore PSR2.Classes.PropertyDeclaration
106
+
107
+        /**
108
+         * Init
109
+         *
110
+         * Backward compatibility for previous versions of Redux.
111
+         */
112
+        public static function init() {
113
+
114
+            // Backward compatibility for extensions.
115
+            self::$_version    = Redux_Core::$version;
116
+            self::$_dir        = Redux_Core::$dir;
117
+            self::$_url        = Redux_Core::$url;
118
+            self::$_upload_dir = Redux_Core::$upload_dir;
119
+            self::$_upload_url = Redux_Core::$upload_url;
120
+            self::$_as_plugin  = Redux_Core::$as_plugin;
121
+            self::$_is_plugin  = Redux_Core::$is_plugin;
122
+        }
123
+
124
+        /**
125
+         * Array of field arrays.
126
+         *
127
+         * @var null|array
128
+         */
129
+        public ?array $fields = array();
130
+
131
+        /**
132
+         * Array of field sections.
133
+         *
134
+         * @var null|array
135
+         */
136
+        public ?array $field_sections = array();
137
+
138
+        /**
139
+         * Array of field types.
140
+         *
141
+         * @var null|array
142
+         */
143
+        public ?array $field_types = array();
144
+
145
+        /**
146
+         * Array of field heads.
147
+         *
148
+         * @var null|array
149
+         */
150
+        public ?array $field_head = array();
151
+
152
+        /**
153
+         * Array of extensions by type used in the panel.
154
+         *
155
+         * @var null|array
156
+         */
157
+        public ?array $extensions = array();
158
+
159
+        /**
160
+         * Array of sections and fields arrays.
161
+         *
162
+         * @var null|array
163
+         */
164
+        public ?array $sections = array();
165
+
166
+        /**
167
+         * Array of generated errors from the panel for localization.
168
+         *
169
+         * @var null|array
170
+         */
171
+        public ?array $errors = array();
172
+
173
+        /**
174
+         * Array of generated warnings from the panel for localization.
175
+         *
176
+         * @var null|array
177
+         */
178
+        public ?array $warnings = array();
179
+
180
+        /**
181
+         * Array of generated sanitize notices from the panel for localization.
182
+         *
183
+         * @var null|array
184
+         */
185
+        public ?array $sanitize = array();
186
+
187
+        /**
188
+         * Array of current option values.
189
+         *
190
+         * @var null|array
191
+         */
192
+        public ?array $options = array();
193
+
194
+        /**
195
+         * Array of option defaults.
196
+         *
197
+         * @var null|array
198
+         */
199
+        public ?array $options_defaults = null;
200
+
201
+        /**
202
+         * Array of fields set to trigger the compiler hook.
203
+         *
204
+         * @var null|array
205
+         */
206
+        public ?array $compiler_fields = array();
207
+
208
+        /**
209
+         * Array of fields with CSS output selectors.
210
+         *
211
+         * @var null|array
212
+         */
213
+        public ?array $output = array();
214
+
215
+        /**
216
+         * Autogenerated CSS appended to the header (snake case maintained for backward compatibility).
217
+         *
218
+         * @var null|string
219
+         */
220
+        public ?string $outputCSS = ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
221
+
222
+        /**
223
+         * Autogenerated variables appended to dynamic output.
224
+         *
225
+         * @var null|array
226
+         */
227
+        public ?array $output_variables = array();
228
+
229
+        /**
230
+         * CSS sent to the compiler hook (snake case maintained for backward compatibility).
231
+         *
232
+         * @var null|string
233
+         */
234
+        public ?string $compilerCSS = ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
235
+
236
+        /**
237
+         * Array of global arguments.
238
+         *
239
+         * @var array|null
240
+         */
241
+        public ?array $args = array();
242
+
243
+        /**
244
+         * Used in customizer hooks.
245
+         *
246
+         * @var null|string
247
+         */
248
+        public ?string $old_opt_name = '';
249
+
250
+        /**
251
+         * Pointer to the Redux_Options_Default class.
252
+         *
253
+         * @var null|Redux_Options_Defaults
254
+         */
255
+        public ?Redux_Options_Defaults $options_defaults_class = null;
256
+
257
+        /**
258
+         * Pointer to the Redux_Options class.
259
+         *
260
+         * @var null|Redux_Options_Constructor
261
+         */
262
+        public ?Redux_Options_Constructor $options_class = null;
263
+
264
+        /**
265
+         * Pointer to the Redux_Required class
266
+         *
267
+         * @var null|Redux_Required
268
+         */
269
+        public ?Redux_Required $required_class = null;
270
+
271
+        /**
272
+         * Pointer to the Redux_Output class.
273
+         *
274
+         * @var null|Redux_Output
275
+         */
276
+        public ?Redux_Output $output_class = null;
277
+
278
+        /**
279
+         * Pointer to the Redux_Page_Render class.
280
+         *
281
+         * @var null|Redux_Page_Render
282
+         */
283
+        public ?Redux_Page_Render $render_class = null;
284
+
285
+        /**
286
+         * Pointer to the Redux_Enqueue class.
287
+         *
288
+         * @var null|Redux_Enqueue
289
+         */
290
+        public ?Redux_Enqueue $enqueue_class = null;
291
+
292
+        /**
293
+         * Pointer to the Redux_Transients class.
294
+         *
295
+         * @var null|Redux_Transients
296
+         */
297
+        public ?Redux_Transients $transient_class = null;
298
+
299
+        /**
300
+         * Pointer to the Redux_wordPress_Data class.
301
+         *
302
+         * @var null|Redux_WordPress_Data
303
+         */
304
+        public ?Redux_WordPress_Data $wordpress_data = null;
305
+
306
+        /**
307
+         * Pointer to the Redux_Validation class.
308
+         *
309
+         * @var null|Redux_Validation
310
+         */
311
+        public ?Redux_Validation $validate_class = null;
312
+
313
+        /**
314
+         * Pointer to the Redux_Sanitize class.
315
+         *
316
+         * @var null|Redux_Sanitize
317
+         */
318
+        public ?Redux_Sanitize $sanitize_class = null;
319
+
320
+        /**
321
+         * Pointer to the Redux_Args class.
322
+         *
323
+         * @var null|Redux_Args
324
+         */
325
+        public ?Redux_Args $args_class = null;
326
+
327
+        /**
328
+         * Array of active transients used by Redux.
329
+         *
330
+         * @var null|mixed
331
+         */
332
+        public $transients = array();
333
+
334
+        /**
335
+         * Array of localized repeater data.
336
+         *
337
+         * @var null|array
338
+         */
339
+        public ?array $repeater_data = array();
340
+
341
+        /**
342
+         * Array of localized data.
343
+         *
344
+         * @var null|array
345
+         */
346
+        public ?array $localize_data = array();
347
+
348
+        /**
349
+         * Array of checked transients used by Redux.
350
+         *
351
+         * @var null|mixed
352
+         */
353
+        public $transients_check = array();
354
+
355
+        /**
356
+         * Never save to DB flag for metaboxes.
357
+         *
358
+         * @var bool
359
+         */
360
+        public bool $never_save_to_db;
361
+
362
+        /**
363
+         * File system object used for I/O file operations.  Done the WordPress way.
364
+         *
365
+         * @var null|object
366
+         *
367
+         * @deprecated 4.5.1
368
+         */
369
+        public ?object $filesystem;
370
+
371
+        /**
372
+         * Deprecated shim for v3 templates.
373
+         *
374
+         * @var null|array
375
+         *
376
+         * @deprecated 4.0.0
377
+         */
378
+        public ?array $hidden_perm_sections = array();
379
+
380
+        /**
381
+         * Deprecated shim for v3 as plugin check.
382
+         *
383
+         * @var bool
384
+         *
385
+         * @deprecated 4.0.0
386
+         */
387
+        public static bool $_as_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
388
+
389
+        /**
390
+         * Deprecated shim for v3 as plugin check.
391
+         *
392
+         * @var bool
393
+         *
394
+         * @deprecated 4.0.0
395
+         */
396
+        public static bool $_is_plugin = false;  // phpcs:ignore PSR2.Classes.PropertyDeclaration
397
+
398
+        /**
399
+         * Cloning is forbidden.
400
+         *
401
+         * @since 4.0.0
402
+         */
403
+        public function __clone() {
404
+            _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; eh?', 'redux-framework' ), '4.0' );
405
+        }
406
+
407
+        /**
408
+         * Un-serializing instances of this class are forbidden.
409
+         *
410
+         * @since 4.0.0
411
+         */
412
+        public function __wakeup() {
413
+            _doing_it_wrong( __FUNCTION__, esc_html__( 'Cheatin&#8217; eh?', 'redux-framework' ), '4.0' );
414
+        }
415
+
416
+        /**
417
+         * Add a deprecating notice for all the old themes that still use this method..
418
+         *
419
+         * @param object $filesystem Filesystem object.
420
+         *
421
+         * @since 4.0.0
422
+         */
423
+        private function deprecated_filesystem( $filesystem ) {
424
+            //_deprecated_function( esc_html__( 'The global variable "$filesystem" of the ReduxFramework object', 'redux-framework' ), '4.5.1', 'Redux_Core::$filesystem' );
425
+
426
+            return $filesystem;
427
+        }
428
+
429
+        /**
430
+         * Class Constructor. Defines the args for the theme options class
431
+         *
432
+         * @param array $sections Panel sections.
433
+         * @param array $args     Class constructor arguments.
434
+         *
435
+         * @throws ReflectionException Exception.
436
+         * @since       1.0.0
437
+         */
438
+        public function __construct( array $sections = array(), array $args = array() ) {
439
+            global $pagenow;
440
+
441
+            if ( Redux_Core::is_heartbeat() ) {
442
+                return;
443
+            }
444
+
445
+            $args['load_on_cron'] = $args['load_on_cron'] ?? false;
446
+
447
+            if ( false === $args['load_on_cron'] && 'wp-cron.php' === $pagenow ) {
448
+                return;
449
+            }
450
+
451
+            if ( empty( $args ) || ( empty( $args['opt_name'] ) ) ) {
452
+                return;
453
+            }
454
+
455
+            if ( ! isset( Redux::$init[ $args['opt_name'] ] ) ) {
456
+                // Let's go back to the Redux API instead of having it run directly.
457
+                Redux_Functions_Ex::record_caller( $args['opt_name'] );
458
+                Redux::set_args( $args['opt_name'], $args );
459
+                if ( ! empty( $sections ) ) {
460
+                    Redux::set_sections( $args['opt_name'], $sections );
461
+                }
462
+                $sections = Redux::construct_sections( $args['opt_name'] );
463
+                $args     = Redux::construct_args( $args['opt_name'] );
464
+                Redux::set_defaults( $args['opt_name'] );
465
+                Redux::$init[ $args['opt_name'] ] = 1;
466
+            }
467
+
468
+            $args             = new Redux_Args( $this, $args );
469
+            $this->args_class = $args;
470
+            $this->args       = $args->get;
471
+
472
+            Redux_Core::core_construct( $this );
473
+
474
+            new Redux_Admin_Notices( $this );
475
+
476
+            if ( ! empty( $this->args['opt_name'] ) ) {
477
+                new Redux_Instances( $this );
478
+
479
+                Redux_Core::$filesystem = Redux_Filesystem::get_instance( $this );
480
+
481
+                $this->filesystem = $this->deprecated_filesystem( Redux_Core::$filesystem );
482
+
483
+                /**
484
+                 * Filter 'redux/options/{opt_name}/sections'
485
+                 *
486
+                 * @param  array $sections field option sections
487
+                 */
488
+
489
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
490
+                $this->sections = apply_filters( "redux/options/{$this->args['opt_name']}/sections", $sections );
491
+
492
+                /**
493
+                 * Construct hook
494
+                 * action 'redux/construct'
495
+                 *
496
+                 * @param object $this ReduxFramework
497
+                 */
498
+
499
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
500
+                do_action( 'redux/construct', $this );
501
+
502
+                // Internationalization.
503
+                new Redux_I18n( $this, __FILE__ );
504
+
505
+                $this->required_class  = new Redux_Required( $this );
506
+                $this->transient_class = new Redux_Transients( $this );
507
+                $this->wordpress_data  = new Redux_WordPress_Data( $this );
508
+                $this->validate_class  = new Redux_Validation( $this );
509
+                $this->sanitize_class  = new Redux_Sanitize( $this );
510
+
511
+                // Register extra extensions.
512
+                new Redux_Extensions( $this );
513
+
514
+                // Grab database values.
515
+                $this->options_defaults_class = new Redux_Options_Defaults();
516
+                $this->options_class          = new Redux_Options_Constructor( $this );
517
+                $this->options_class->get();
518
+
519
+                $this->output_class  = new Redux_Output( $this );
520
+                $this->render_class  = new Redux_Page_Render( $this );
521
+                $this->enqueue_class = new Redux_Enqueue( $this );
522
+
523
+                new Redux_AJAX_Save( $this );
524
+                new Redux_AJAX_Typography( $this );
525
+                new Redux_AJAX_Select2( $this );
526
+            }
527
+
528
+            /**
529
+             * Loaded hook
530
+             * action 'redux/loaded'
531
+             *
532
+             * @param  object $this ReduxFramework
533
+             */
534
+
535
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
536
+            do_action( 'redux/loaded', $this );
537
+        }
538
+
539
+        /**
540
+         * Begin backward compatibility shims for Redux v3 configs and extensions.
541
+         */
542
+
543
+        /**
544
+         * SHIM: _register_settings
545
+         *
546
+         * @deprecated 4.0.0
547
+         */
548
+        public function _register_settings() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
549
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->register()' );
550
+
551
+            $this->options_class->register();
552
+        }
553
+
554
+        /**
555
+         * SHIM: _field_input
556
+         *
557
+         * @param array        $field Field array.
558
+         * @param string|array $v     Field values.
559
+         *
560
+         * @deprecated 4.0.0
561
+         */
562
+        public function _field_input( array $field, $v = null ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
563
+            _deprecated_function( __FUNCTION__, '4.0.0', 'render_class->field_input( $field, $value )' );
564
+
565
+            $this->render_class->field_input( $field, $v );
566
+        }
567
+
568
+        /**
569
+         * SHIM: field_default_values
570
+         *
571
+         * @param array $field Field array.
572
+         *
573
+         * @deprecated 4.0.0
574
+         */
575
+        public function field_default_values( array $field ) {
576
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_defaults_class->field_default_values( $opt_name, $field )' );
577
+
578
+            $this->options_defaults_class->field_default_values( '', $field );
579
+        }
580
+
581
+        /**
582
+         * SHIM: set_options
583
+         *
584
+         * @param string|array $value Option values.
585
+         *
586
+         * @deprecated 4.0.0
587
+         */
588
+        public function set_options( $value ) {
589
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->set( $value )' );
590
+
591
+            $this->options_class->set( $value );
592
+        }
593
+
594
+        /**
595
+         * SHIM: get_options
596
+         *
597
+         * @deprecated 4.0.0
598
+         */
599
+        public function get_options() {
600
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get()' );
601
+
602
+            $this->options_class->get();
603
+        }
604
+
605
+        /**
606
+         * SHIM: _default_values
607
+         *
608
+         * @return array
609
+         *
610
+         * @deprecated 4.0.0
611
+         */
612
+        public function _default_values() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
613
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->default_values()' );
614
+
615
+            return $this->default_values();
616
+        }
617
+
618
+        /**
619
+         * Get default values.
620
+         *
621
+         * @return array
622
+         */
623
+        public function default_values() {
624
+            if ( ! isset( $this->options_class ) ) {
625
+                $this->options_defaults_class = new Redux_Options_Defaults();
626
+                $this->options_class          = new Redux_Options_Constructor( $this );
627
+            }
628
+
629
+            return $this->options_class->default_values();
630
+        }
631
+
632
+        /**
633
+         * SHIM: check_dependencies
634
+         *
635
+         * @param array $field Field array.
636
+         *
637
+         * @deprecated 4.0.0
638
+         */
639
+        public function check_dependencies( array $field ) {
640
+            _deprecated_function( __FUNCTION__, '4.0.0', 'required_class->check_dependencies( $field )' );
641
+
642
+            $this->required_class->check_dependencies( $field );
643
+        }
644
+
645
+        /**
646
+         * SHIM: _enqueue_output
647
+         *
648
+         * @throws ReflectionException Exception.
649
+         *
650
+         * @deprecated 4.0.0
651
+         */
652
+        public function _enqueue_output() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
653
+            _deprecated_function( __FUNCTION__, '4.0.0', 'output_class->enqueue()' );
654
+
655
+            if ( empty( $this->output_class ) ) {
656
+                $obj          = new ReduxFramework( $this->sections, $this->args );
657
+                $obj->options = $this->options;
658
+                $obj->output_class->enqueue();
659
+                $this->outputCSS = $obj->outputCSS; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
660
+            } else {
661
+                $this->output_class->enqueue();
662
+            }
663
+        }
664
+
665
+        /**
666
+         * SHIM: _enqueue
667
+         *
668
+         * @deprecated 4.0.0
669
+         */
670
+        public function _enqueue() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
671
+            _deprecated_function( __FUNCTION__, '4.0.0', 'enqueue_class->init()' );
672
+
673
+            $this->enqueue_class->init();
674
+        }
675
+
676
+        /**
677
+         * _enqueue replacement.
678
+         *
679
+         * @return void
680
+         */
681
+        public function init_enqueue() {
682
+            $this->enqueue_class->init();
683
+        }
684
+
685
+        /**
686
+         * SHIM: generate_panel
687
+         *
688
+         * @since       1.0.0
689
+         * @access      public
690
+         * @return      void
691
+         *
692
+         * @deprecated 4.0.0
693
+         */
694
+        public function generate_panel() {
695
+            _deprecated_function( __FUNCTION__, '4.0.0', 'render_class->generate_panel()' );
696
+
697
+            $this->render_class->generate_panel();
698
+        }
699
+
700
+        /**
701
+         * SHIM: get_default_values
702
+         *
703
+         * @param string $key       Key value.
704
+         * @param bool   $array_key Flag to determine array status.
705
+         *
706
+         * @return array
707
+         *
708
+         * @deprecated 4.0.0
709
+         */
710
+        public function get_default_values( $key, $array_key = false ) {
711
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get_default_value( $key, $array_key )' );
712
+
713
+            if ( ! isset( $this->options_class ) ) {
714
+                $this->options_defaults_class = new Redux_Options_Defaults();
715
+                $this->options_class          = new Redux_Options_Constructor( $this );
716
+            }
717
+
718
+            return $this->options_class->get_default_value( $key, $array_key );
719
+        }
720
+
721
+        /**
722
+         * SHIM: get_default_value
723
+         *
724
+         * @param string $key       Key value.
725
+         * @param bool   $array_key Flag to determine array status.
726
+         *
727
+         * @return array
728
+         *
729
+         * @deprecated 4.0.0
730
+         */
731
+        public function get_default_value( $key, $array_key = false ) {
732
+            _deprecated_function( __FUNCTION__, '4.0.0', 'options_class->get_default_value( $key, $array_key )' );
733
+
734
+            if ( ! isset( $this->options_class ) ) {
735
+                $this->options_defaults_class = new Redux_Options_Defaults();
736
+                $this->options_class          = new Redux_Options_Constructor( $this );
737
+            }
738
+
739
+            return $this->options_class->get_default_value( $key, $array_key );
740
+        }
741
+
742
+        /**
743
+         * SHIM: get_wordpress_data
744
+         *
745
+         * @param bool         $type data type.
746
+         * @param array        $args args to pass to WordPress API.
747
+         * @param string|array $current_value Current value.
748
+         *
749
+         * @return array|mixed|string|void
750
+         *
751
+         * @deprecated 4.0.0
752
+         */
753
+        public function get_wordpress_data( $type = false, $args = array(), $current_value = null ) {
754
+            _deprecated_function( __FUNCTION__, '4.0.0', 'wordpress_data->get( $type, $args, $opt_name, $value )' );
755
+
756
+            return $this->wordpress_data->get( $type, $args, $this->args['opt_name'], $current_value );
757
+        }
758
+
759
+        /**
760
+         * SHIM: _validate_values
761
+         *
762
+         * @param array $plugin_options Current panel options.
763
+         * @param array $options        Options to validate.
764
+         * @param array $sections       Sections array.
765
+         *
766
+         * @return array
767
+         *
768
+         * @deprecated 4.0.0
769
+         */
770
+        public function _validate_values( $plugin_options, $options, $sections ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
771
+            _deprecated_function( __FUNCTION__, '4.0.0', 'validate_class->validate( $plugin_options, $options, $sections )' );
772
+
773
+            if ( ! isset( $this->validate_class ) ) {
774
+                $this->validate_class = new Redux_Validation( $this );
775
+            }
776
+
777
+            return $this->validate_class->validate( $plugin_options, $options, $sections );
778
+        }
779
+
780
+        /**
781
+         * SHIM: set_transients
782
+         *
783
+         * @return void
784
+         *
785
+         * @deprecated 4.0.0
786
+         */
787
+        public function set_transients() {
788
+            _deprecated_function( __FUNCTION__, '4.0.0', 'Please update the extension that uses this deprecated function.' );
789
+        }
790
+
791
+        /**
792
+         * SHIM: section_menu
793
+         *
794
+         * @param int    $k        Array Key.
795
+         * @param array  $section  Section array.
796
+         * @param string $suffix   Unique string.
797
+         * @param array  $sections Section array.
798
+         *
799
+         * @return string
800
+         *
801
+         * @deprecated 4.0.0
802
+         */
803
+        public function section_menu( $k, $section, $suffix = '', $sections = array() ) {
804
+            _deprecated_function( __FUNCTION__, '4.0.0', 'render_class->section_menu( $index, $section, $suffix, $sections )' );
805
+
806
+            return $this->render_class->section_menu( $k, $section, $suffix, $sections );
807
+        }
808
+
809
+        /**
810
+         * SHIM: get_header_html
811
+         *
812
+         * @param array $field Field array.
813
+         *
814
+         * @return string
815
+         *
816
+         * @deprecated 4.0.0
817
+         */
818
+        public function get_header_html( $field ) {
819
+            _deprecated_function( __FUNCTION__, '4.0.0', 'render_class->get_header_html( $field )' );
820
+
821
+            return $this->render_class->get_header_html( $field );
822
+        }
823
+
824
+        /**
825
+         * SHIM: current_user_can
826
+         *
827
+         * @param string $permission User permission.
828
+         *
829
+         * @return bool
830
+         *
831
+         * @deprecated 4.0.0
832
+         */
833
+        public function current_user_can( $permission ) {
834
+            _deprecated_function( __FUNCTION__, '4.0.0', 'Redux_Helpers::current_user_can' );
835
+
836
+            return Redux_Helpers::current_user_can( $permission );
837
+        }
838
+
839
+        /**
840
+         * End backward compatibility shims for Redux v3 configs and extensions.
841
+         */
842
+
843
+        /**
844
+         * Pointer to the ReduxFramework instance.
845
+         *
846
+         * @return ReduxFramework|null
847
+         */
848
+        public function get_instance(): ?ReduxFramework {
849
+            return self::$instance;
850
+        }
851
+
852
+        /**
853
+         * →get(); This is used to return and option value from the option array
854
+         *
855
+         * @since       1.0.0
856
+         * @access      public
857
+         *
858
+         * @param       string $opt_name The option name to return.
859
+         * @param       mixed  $defaults (null) The value to return if an option isn't set.
860
+         *
861
+         * @return      mixed
862
+         */
863
+        public function get( string $opt_name, $defaults = null ) {
864
+            return ( ! empty( $this->options[ $opt_name ] ) ) ? $this->options[ $opt_name ] : $this->options_class->get_default( $opt_name, $defaults );
865
+        }
866
+
867
+        /**
868
+         * →set(); This is used to set an arbitrary option in the option array
869
+         *
870
+         * @since       1.0.0
871
+         * @access      public
872
+         *
873
+         * @param       string $opt_name The name of the option being added.
874
+         * @param       mixed  $values   The value of the option being added.
875
+         *
876
+         * @return      void
877
+         */
878
+        public function set( string $opt_name = '', $values = array() ) {
879
+            if ( ! empty( $opt_name ) && is_array( $values ) ) {
880
+                $this->options[ $opt_name ] = $values;
881
+                $this->options_class->set( $values );
882
+            }
883
+        }
884
+    }
885
+
886
+    ReduxFramework::init();
887
+
888
+    /**
889
+     * Action 'redux/init'
890
+     */
891
+    do_action( 'redux/init' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName
892 892
 }
Please login to merge, or discard this patch.
redux-core/inc/fields/ace_editor/class-redux-ace-editor.php 1 patch
Indentation   +71 added lines, -71 removed lines patch added patch discarded remove patch
@@ -13,45 +13,45 @@  discard block
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Ace_Editor', false ) ) {
15 15
 
16
-	/**
17
-	 * Class Redux_Ace_Editor
18
-	 */
19
-	class Redux_Ace_Editor extends Redux_Field {
16
+    /**
17
+     * Class Redux_Ace_Editor
18
+     */
19
+    class Redux_Ace_Editor extends Redux_Field {
20 20
 
21
-		/**
22
-		 * Field Render Function.
23
-		 * Takes the vars and outputs the HTML for the field in the settings
24
-		 *
25
-		 * @since ReduxFramework 1.0.0
26
-		 */
27
-		public function render() {
28
-			if ( is_array( $this->value ) ) {
29
-				$this->value = '';
30
-			} else {
31
-				$this->value = trim( $this->value );
32
-			}
21
+        /**
22
+         * Field Render Function.
23
+         * Takes the vars and outputs the HTML for the field in the settings
24
+         *
25
+         * @since ReduxFramework 1.0.0
26
+         */
27
+        public function render() {
28
+            if ( is_array( $this->value ) ) {
29
+                $this->value = '';
30
+            } else {
31
+                $this->value = trim( $this->value );
32
+            }
33 33
 
34
-			if ( ! empty( $this->field['options'] ) ) {
35
-				$this->field['args'] = $this->field['options'];
36
-				unset( $this->field['options'] );
37
-			}
34
+            if ( ! empty( $this->field['options'] ) ) {
35
+                $this->field['args'] = $this->field['options'];
36
+                unset( $this->field['options'] );
37
+            }
38 38
 
39
-			if ( ! isset( $this->field['mode'] ) ) {
40
-				$this->field['mode'] = 'javascript';
41
-			}
42
-			if ( ! isset( $this->field['theme'] ) ) {
43
-				$this->field['theme'] = 'monokai';
44
-			}
39
+            if ( ! isset( $this->field['mode'] ) ) {
40
+                $this->field['mode'] = 'javascript';
41
+            }
42
+            if ( ! isset( $this->field['theme'] ) ) {
43
+                $this->field['theme'] = 'monokai';
44
+            }
45 45
 
46
-			$params = array(
47
-				'minLines' => 10,
48
-				'maxLines' => 30,
49
-			);
46
+            $params = array(
47
+                'minLines' => 10,
48
+                'maxLines' => 30,
49
+            );
50 50
 
51
-			if ( isset( $this->field['args'] ) && ! empty( $this->field['args'] ) && is_array( $this->field['args'] ) ) {
52
-				$params = wp_parse_args( $this->field['args'], $params );
53
-			}
54
-			?>
51
+            if ( isset( $this->field['args'] ) && ! empty( $this->field['args'] ) && is_array( $this->field['args'] ) ) {
52
+                $params = wp_parse_args( $this->field['args'], $params );
53
+            }
54
+            ?>
55 55
 			<div class="ace-wrapper">
56 56
 				<input
57 57
 					type="hidden"
@@ -70,46 +70,46 @@  discard block
 block discarded – undo
70 70
 					class="ace-editor-area"><?php echo esc_html( $this->value ); ?></pre>
71 71
 			</div>
72 72
 			<?php
73
-		}
73
+        }
74 74
 
75
-		/**
76
-		 * Enqueue Function.
77
-		 * If this field requires any scripts, or css define this function and register/enqueue the scripts/css
78
-		 *
79
-		 * @since       1.0.0
80
-		 * @access      public
81
-		 * @return      void
82
-		 */
83
-		public function enqueue() {
84
-			if ( $this->parent->args['dev_mode'] ) {
85
-				wp_enqueue_style(
86
-					'redux-field-ace-editor',
87
-					Redux_Core::$url . 'inc/fields/ace_editor/redux-ace-editor.css',
88
-					array(),
89
-					$this->timestamp
90
-				);
91
-			}
75
+        /**
76
+         * Enqueue Function.
77
+         * If this field requires any scripts, or css define this function and register/enqueue the scripts/css
78
+         *
79
+         * @since       1.0.0
80
+         * @access      public
81
+         * @return      void
82
+         */
83
+        public function enqueue() {
84
+            if ( $this->parent->args['dev_mode'] ) {
85
+                wp_enqueue_style(
86
+                    'redux-field-ace-editor',
87
+                    Redux_Core::$url . 'inc/fields/ace_editor/redux-ace-editor.css',
88
+                    array(),
89
+                    $this->timestamp
90
+                );
91
+            }
92 92
 
93
-			if ( ! wp_script_is( 'ace-editor-js' ) ) {
94
-				wp_enqueue_script(
95
-					'ace-editor-js',
96
-					// phpcs:ignore Generic.Strings.UnnecessaryStringConcat
97
-					apply_filters( 'redux/' . $this->parent->args['opt_name'] . 'fields/ace/script', '//' . 'cdnjs' . '.cloudflare' . '.com/ajax/libs/ace/1.23.0/ace.min.js' ),
98
-					array( 'jquery' ),
99
-					'1.23.0',
100
-					true
101
-				);
102
-			}
93
+            if ( ! wp_script_is( 'ace-editor-js' ) ) {
94
+                wp_enqueue_script(
95
+                    'ace-editor-js',
96
+                    // phpcs:ignore Generic.Strings.UnnecessaryStringConcat
97
+                    apply_filters( 'redux/' . $this->parent->args['opt_name'] . 'fields/ace/script', '//' . 'cdnjs' . '.cloudflare' . '.com/ajax/libs/ace/1.23.0/ace.min.js' ),
98
+                    array( 'jquery' ),
99
+                    '1.23.0',
100
+                    true
101
+                );
102
+            }
103 103
 
104
-			wp_enqueue_script(
105
-				'redux-field-ace-editor',
106
-				Redux_Core::$url . 'inc/fields/ace_editor/redux-ace-editor' . Redux_Functions::is_min() . '.js',
107
-				array( 'jquery', 'ace-editor-js', 'redux-js' ),
108
-				$this->timestamp,
109
-				true
110
-			);
111
-		}
112
-	}
104
+            wp_enqueue_script(
105
+                'redux-field-ace-editor',
106
+                Redux_Core::$url . 'inc/fields/ace_editor/redux-ace-editor' . Redux_Functions::is_min() . '.js',
107
+                array( 'jquery', 'ace-editor-js', 'redux-js' ),
108
+                $this->timestamp,
109
+                true
110
+            );
111
+        }
112
+    }
113 113
 }
114 114
 
115 115
 class_alias( 'Redux_Ace_Editor', 'ReduxFramework_Ace_Editor' );
Please login to merge, or discard this patch.