@@ -12,737 +12,737 @@ |
||
| 12 | 12 | |
| 13 | 13 | if ( ! class_exists( 'Redux_Enqueue', false ) ) { |
| 14 | 14 | |
| 15 | - /** |
|
| 16 | - * Class Redux_Enqueue |
|
| 17 | - */ |
|
| 18 | - class Redux_Enqueue extends Redux_Class { |
|
| 19 | - |
|
| 20 | - /** |
|
| 21 | - * Data to localize. |
|
| 22 | - * |
|
| 23 | - * @var array |
|
| 24 | - */ |
|
| 25 | - public array $localize_data = array(); |
|
| 26 | - |
|
| 27 | - /** |
|
| 28 | - * Min string for .min files. |
|
| 29 | - * |
|
| 30 | - * @var string |
|
| 31 | - */ |
|
| 32 | - private string $min = ''; |
|
| 33 | - |
|
| 34 | - /** |
|
| 35 | - * Timestamp for file versions. |
|
| 36 | - * |
|
| 37 | - * @var string |
|
| 38 | - */ |
|
| 39 | - private string $timestamp = ''; |
|
| 40 | - |
|
| 41 | - /** |
|
| 42 | - * Localize data required for the repeater extension. |
|
| 43 | - * |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - private array $repeater_data = array(); |
|
| 47 | - |
|
| 48 | - /** |
|
| 49 | - * Redux_Enqueue constructor. |
|
| 50 | - * |
|
| 51 | - * @param object $redux ReduxFramework pointer. |
|
| 52 | - */ |
|
| 53 | - public function __construct( $redux ) { |
|
| 54 | - parent::__construct( $redux ); |
|
| 55 | - |
|
| 56 | - // Enqueue the admin page CSS and JS. |
|
| 57 | - if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 58 | - add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 ); |
|
| 59 | - } |
|
| 60 | - |
|
| 61 | - add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 ); |
|
| 62 | - |
|
| 63 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 64 | - do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this ); |
|
| 65 | - |
|
| 66 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | - do_action( 'redux/enqueue/construct', $this ); |
|
| 68 | - |
|
| 69 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 70 | - do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' ); |
|
| 71 | - |
|
| 72 | - //if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended |
|
| 73 | - // add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 ); |
|
| 74 | - //} |
|
| 75 | - |
|
| 76 | - //add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 ); |
|
| 77 | - } |
|
| 78 | - |
|
| 79 | - /** |
|
| 80 | - * Scripts to enqueue on the frontend |
|
| 81 | - */ |
|
| 82 | - public function frontend_init() { |
|
| 83 | - $core = $this->core(); |
|
| 84 | - |
|
| 85 | - if ( $core->args['elusive_frontend'] ) { |
|
| 86 | - Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 87 | - } |
|
| 88 | - |
|
| 89 | - if ( $core->args['fontawesome_frontend'] ) { |
|
| 90 | - Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 91 | - } |
|
| 92 | - } |
|
| 93 | - |
|
| 94 | - /** |
|
| 95 | - * Class init functions. |
|
| 96 | - */ |
|
| 97 | - public function init() { |
|
| 98 | - $core = $this->core(); |
|
| 99 | - |
|
| 100 | - Redux_Functions::$parent = $core; |
|
| 101 | - |
|
| 102 | - $this->min = Redux_Functions::is_min(); |
|
| 103 | - |
|
| 104 | - $this->timestamp = Redux_Core::$version; |
|
| 105 | - if ( $core->args['dev_mode'] ) { |
|
| 106 | - $this->timestamp .= '.' . time(); |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - $this->register_styles( $core ); |
|
| 110 | - $this->register_scripts(); |
|
| 111 | - |
|
| 112 | - add_thickbox(); |
|
| 113 | - |
|
| 114 | - $this->enqueue_fields( $core ); |
|
| 115 | - |
|
| 116 | - add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) ); |
|
| 117 | - |
|
| 118 | - $this->set_localized_data( $core ); |
|
| 119 | - |
|
| 120 | - /** |
|
| 121 | - * Action 'redux/page/{opt_name}/enqueue' |
|
| 122 | - */ |
|
| 123 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 124 | - do_action( "redux/page/{$core->args['opt_name']}/enqueue" ); |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - /** |
|
| 128 | - * Register all core framework styles. |
|
| 129 | - * |
|
| 130 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 131 | - */ |
|
| 132 | - private function register_styles( ReduxFramework $core ) { |
|
| 133 | - |
|
| 134 | - /** |
|
| 135 | - * Redux Admin CSS |
|
| 136 | - */ |
|
| 137 | - if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit |
|
| 138 | - $color_scheme = get_user_option( 'admin_color' ); |
|
| 139 | - } elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) { |
|
| 140 | - $color_scheme = 'classic'; |
|
| 141 | - } else { |
|
| 142 | - $color_scheme = $core->args['admin_theme']; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) { |
|
| 146 | - $color_scheme = 'fresh'; |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - $css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css"; |
|
| 150 | - |
|
| 151 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 152 | - $css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css ); |
|
| 153 | - |
|
| 154 | - wp_register_style( |
|
| 155 | - 'redux-admin-theme', |
|
| 156 | - $css, |
|
| 157 | - array(), |
|
| 158 | - $this->timestamp |
|
| 159 | - ); |
|
| 160 | - |
|
| 161 | - wp_enqueue_style( |
|
| 162 | - 'redux-admin-css', |
|
| 163 | - Redux_Core::$url . "assets/css/redux-admin$this->min.css", |
|
| 164 | - array( 'redux-admin-theme' ), |
|
| 165 | - $this->timestamp |
|
| 166 | - ); |
|
| 167 | - |
|
| 168 | - /** |
|
| 169 | - * Redux Fields CSS |
|
| 170 | - */ |
|
| 171 | - if ( ! $core->args['dev_mode'] ) { |
|
| 172 | - wp_enqueue_style( |
|
| 173 | - 'redux-fields', |
|
| 174 | - Redux_Core::$url . 'assets/css/redux-fields.min.css', |
|
| 175 | - array(), |
|
| 176 | - $this->timestamp |
|
| 177 | - ); |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - /** |
|
| 181 | - * Select2 CSS |
|
| 182 | - */ |
|
| 183 | - wp_enqueue_style( |
|
| 184 | - 'select2-css', |
|
| 185 | - Redux_Core::$url . 'assets/css/vendor/select2.min.css', |
|
| 186 | - array(), |
|
| 187 | - '4.1.0' |
|
| 188 | - ); |
|
| 189 | - |
|
| 190 | - /** |
|
| 191 | - * Spectrum CSS |
|
| 192 | - */ |
|
| 193 | - wp_register_style( |
|
| 194 | - 'redux-spectrum-css', |
|
| 195 | - Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css", |
|
| 196 | - array(), |
|
| 197 | - '1.3.3' |
|
| 198 | - ); |
|
| 199 | - |
|
| 200 | - /** |
|
| 201 | - * Elusive Icon CSS |
|
| 202 | - */ |
|
| 203 | - Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 204 | - |
|
| 205 | - /** |
|
| 206 | - * Font Awesome for Social Profiles and Icon Select |
|
| 207 | - */ |
|
| 208 | - Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 209 | - |
|
| 210 | - /** |
|
| 211 | - * QTip CSS |
|
| 212 | - */ |
|
| 213 | - wp_enqueue_style( |
|
| 214 | - 'qtip', |
|
| 215 | - Redux_Core::$url . "assets/css/vendor/qtip$this->min.css", |
|
| 216 | - array(), |
|
| 217 | - '3.0.3' |
|
| 218 | - ); |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * JQuery UI CSS |
|
| 222 | - */ |
|
| 223 | - wp_enqueue_style( |
|
| 224 | - 'jquery-ui', |
|
| 225 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 226 | - apply_filters( |
|
| 227 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 228 | - "redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css", |
|
| 229 | - Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css' |
|
| 230 | - ), |
|
| 231 | - array(), |
|
| 232 | - $this->timestamp |
|
| 233 | - ); |
|
| 234 | - |
|
| 235 | - /** |
|
| 236 | - * Iris CSS |
|
| 237 | - */ |
|
| 238 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 239 | - |
|
| 240 | - if ( $core->args['dev_mode'] ) { |
|
| 241 | - |
|
| 242 | - /** |
|
| 243 | - * Media CSS |
|
| 244 | - */ |
|
| 245 | - wp_enqueue_style( |
|
| 246 | - 'redux-field-media', |
|
| 247 | - Redux_Core::$url . 'assets/css/media.css', |
|
| 248 | - array(), |
|
| 249 | - $this->timestamp |
|
| 250 | - ); |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - /** |
|
| 254 | - * RTL CSS |
|
| 255 | - */ |
|
| 256 | - if ( is_rtl() ) { |
|
| 257 | - wp_enqueue_style( |
|
| 258 | - 'redux-rtl', |
|
| 259 | - Redux_Core::$url . 'assets/css/rtl.css', |
|
| 260 | - array(), |
|
| 261 | - $this->timestamp |
|
| 262 | - ); |
|
| 263 | - } |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - /** |
|
| 267 | - * Register all core framework scripts. |
|
| 268 | - */ |
|
| 269 | - private function register_scripts() { |
|
| 270 | - // ***************************************************************** |
|
| 271 | - // JQuery / JQuery UI JS |
|
| 272 | - // ***************************************************************** |
|
| 273 | - wp_enqueue_script( 'jquery' ); |
|
| 274 | - wp_enqueue_script( 'jquery-ui-core' ); |
|
| 275 | - wp_enqueue_script( 'jquery-ui-dialog' ); |
|
| 276 | - |
|
| 277 | - /** |
|
| 278 | - * Select2 Sortable JS |
|
| 279 | - */ |
|
| 280 | - wp_register_script( |
|
| 281 | - 'redux-select2-sortable', |
|
| 282 | - Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js', |
|
| 283 | - array( 'jquery', 'jquery-ui-sortable' ), |
|
| 284 | - $this->timestamp, |
|
| 285 | - true |
|
| 286 | - ); |
|
| 287 | - |
|
| 288 | - /** |
|
| 289 | - * Select2 |
|
| 290 | - */ |
|
| 291 | - wp_enqueue_script( |
|
| 292 | - 'select2-js', |
|
| 293 | - Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`', |
|
| 294 | - array( 'jquery', 'redux-select2-sortable' ), |
|
| 295 | - '4.1.0', |
|
| 296 | - true |
|
| 297 | - ); |
|
| 298 | - |
|
| 299 | - /** |
|
| 300 | - * QTip JS |
|
| 301 | - */ |
|
| 302 | - wp_enqueue_script( |
|
| 303 | - 'qtip', |
|
| 304 | - Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js', |
|
| 305 | - array( 'jquery' ), |
|
| 306 | - '3.0.3', |
|
| 307 | - true |
|
| 308 | - ); |
|
| 309 | - |
|
| 310 | - /** |
|
| 311 | - * Iris alpha color picker |
|
| 312 | - */ |
|
| 313 | - if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) { |
|
| 314 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 315 | - |
|
| 316 | - wp_register_script( |
|
| 317 | - 'redux-wp-color-picker-alpha', |
|
| 318 | - Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js', |
|
| 319 | - array( 'jquery', 'wp-color-picker' ), |
|
| 320 | - '3.0.0', |
|
| 321 | - true |
|
| 322 | - ); |
|
| 323 | - } |
|
| 324 | - |
|
| 325 | - /** |
|
| 326 | - * Block UI (used by Custom Fonts and Color Schemes). |
|
| 327 | - */ |
|
| 328 | - wp_register_script( |
|
| 329 | - 'redux-block-ui', |
|
| 330 | - Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js', |
|
| 331 | - array( 'jquery' ), |
|
| 332 | - '2.70.0', |
|
| 333 | - true |
|
| 334 | - ); |
|
| 335 | - |
|
| 336 | - /** |
|
| 337 | - * Spectrum JS |
|
| 338 | - */ |
|
| 339 | - wp_register_script( |
|
| 340 | - 'redux-spectrum-js', |
|
| 341 | - Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js', |
|
| 342 | - array( 'jquery' ), |
|
| 343 | - '1.3.3', |
|
| 344 | - true |
|
| 345 | - ); |
|
| 346 | - |
|
| 347 | - /** |
|
| 348 | - * Vendor JS |
|
| 349 | - */ |
|
| 350 | - wp_register_script( |
|
| 351 | - 'redux-vendor', |
|
| 352 | - Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js', |
|
| 353 | - array( 'jquery' ), |
|
| 354 | - $this->timestamp, |
|
| 355 | - true |
|
| 356 | - ); |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Redux JS |
|
| 360 | - */ |
|
| 361 | - wp_register_script( |
|
| 362 | - 'redux-js', |
|
| 363 | - Redux_Core::$url . 'assets/js/redux' . $this->min . '.js', |
|
| 364 | - array( 'jquery', 'redux-vendor' ), |
|
| 365 | - $this->timestamp, |
|
| 366 | - true |
|
| 367 | - ); |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - /** |
|
| 371 | - * Enqueue fields that are in use. |
|
| 372 | - * |
|
| 373 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 374 | - * @param array $field Field array. |
|
| 375 | - */ |
|
| 376 | - public function enqueue_field( ReduxFramework $core, array $field ) { |
|
| 377 | - if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) { |
|
| 378 | - $field_type = str_replace( '_', '-', $field['type'] ); |
|
| 379 | - $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php"; |
|
| 380 | - |
|
| 381 | - // Shim for v3 extension class names. |
|
| 382 | - if ( ! file_exists( $core_path ) ) { |
|
| 383 | - $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php"; |
|
| 384 | - } |
|
| 385 | - |
|
| 386 | - $filter_path = $core_path; |
|
| 387 | - |
|
| 388 | - /** |
|
| 389 | - * Field class file |
|
| 390 | - * filter 'redux/{opt_name}/field/class/{field.type}' |
|
| 391 | - * |
|
| 392 | - * @param string $filter_path Field class file path |
|
| 393 | - * @param array $field Field config data |
|
| 394 | - */ |
|
| 395 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 396 | - $class_file = apply_filters( |
|
| 397 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 398 | - "redux/{$core->args['opt_name']}/field/class/{$field['type']}", |
|
| 399 | - $filter_path, |
|
| 400 | - $field |
|
| 401 | - ); |
|
| 402 | - |
|
| 403 | - $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 404 | - |
|
| 405 | - if ( $class_file ) { |
|
| 406 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 407 | - if ( false === $field_class ) { |
|
| 408 | - if ( file_exists( $class_file ) ) { |
|
| 409 | - require_once $class_file; |
|
| 410 | - |
|
| 411 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 412 | - } else { |
|
| 413 | - return; |
|
| 414 | - } |
|
| 415 | - } |
|
| 416 | - |
|
| 417 | - if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
|
| 418 | - if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | - $core->options[ $field['id'] ] = ''; |
|
| 420 | - } |
|
| 421 | - |
|
| 422 | - $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 423 | - |
|
| 424 | - // Move dev_mode check to a new if/then block. |
|
| 425 | - if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
|
| 426 | - $the_field->enqueue(); |
|
| 427 | - } |
|
| 428 | - |
|
| 429 | - if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) { |
|
| 430 | - $the_field->always_enqueue(); |
|
| 431 | - } |
|
| 432 | - |
|
| 433 | - if ( method_exists( $field_class, 'localize' ) ) { |
|
| 434 | - $the_field->localize( $field ); |
|
| 435 | - |
|
| 436 | - if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | - $this->localize_data[ $field['type'] ] = array(); |
|
| 438 | - } |
|
| 439 | - |
|
| 440 | - $localize_data = $the_field->localize( $field ); |
|
| 441 | - |
|
| 442 | - $shims = array( 'repeater' ); |
|
| 443 | - |
|
| 444 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 445 | - $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
|
| 446 | - |
|
| 447 | - if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
|
| 448 | - $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 449 | - } |
|
| 450 | - |
|
| 451 | - $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 452 | - } |
|
| 453 | - |
|
| 454 | - unset( $the_field ); |
|
| 455 | - } |
|
| 456 | - } |
|
| 457 | - } |
|
| 458 | - } |
|
| 459 | - |
|
| 460 | - /** |
|
| 461 | - * Enqueue field files. |
|
| 462 | - * |
|
| 463 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 464 | - */ |
|
| 465 | - private function enqueue_fields( ReduxFramework $core ) { |
|
| 466 | - foreach ( $core->sections as $section ) { |
|
| 467 | - if ( isset( $section['fields'] ) ) { |
|
| 468 | - foreach ( $section['fields'] as $field ) { |
|
| 469 | - $this->enqueue_field( $core, $field ); |
|
| 470 | - } |
|
| 471 | - } |
|
| 472 | - } |
|
| 473 | - } |
|
| 474 | - |
|
| 475 | - /** |
|
| 476 | - * Build a localized array from field functions, if any. |
|
| 477 | - * |
|
| 478 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 479 | - * @param string $type Field type. |
|
| 480 | - */ |
|
| 481 | - private function build_local_array( ReduxFramework $core, string $type ) { |
|
| 482 | - if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 483 | - $the_total = 0; |
|
| 484 | - $messages = array(); |
|
| 485 | - |
|
| 486 | - foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 487 | - if ( is_array( $msg ) && ! empty( $msg ) ) { |
|
| 488 | - $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 489 | - |
|
| 490 | - if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | - $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - ++$messages[ $msg['section_id'] ]['total']; |
|
| 495 | - ++$the_total; |
|
| 496 | - } |
|
| 497 | - } |
|
| 498 | - |
|
| 499 | - $this->localize_data[ $type ] = array( |
|
| 500 | - 'total' => $the_total, |
|
| 501 | - "$type" => $messages, |
|
| 502 | - ); |
|
| 503 | - |
|
| 504 | - unset( $core->transients['notices'][ $type ] ); |
|
| 505 | - } |
|
| 506 | - } |
|
| 507 | - |
|
| 508 | - /** |
|
| 509 | - * Compile panel errors and wearings for a localized array. |
|
| 510 | - */ |
|
| 511 | - public function get_warnings_and_errors_array() { |
|
| 512 | - $core = $this->core(); |
|
| 513 | - |
|
| 514 | - $this->build_local_array( $core, 'errors' ); |
|
| 515 | - $this->build_local_array( $core, 'warnings' ); |
|
| 516 | - $this->build_local_array( $core, 'sanitize' ); |
|
| 517 | - |
|
| 518 | - if ( empty( $core->transients['notices'] ) ) { |
|
| 519 | - if ( isset( $core->transients['notices'] ) ) { |
|
| 520 | - unset( $core->transients['notices'] ); |
|
| 521 | - } |
|
| 522 | - } |
|
| 523 | - } |
|
| 524 | - |
|
| 525 | - /** |
|
| 526 | - * Commit localized data to global array. |
|
| 527 | - * |
|
| 528 | - * @param ReduxFramework $core ReduxFramework object. |
|
| 529 | - */ |
|
| 530 | - private function set_localized_data( ReduxFramework $core ) { |
|
| 531 | - if ( ! empty( $core->args['last_tab'] ) ) { |
|
| 532 | - $this->localize_data['last_tab'] = $core->args['last_tab']; |
|
| 533 | - } |
|
| 534 | - |
|
| 535 | - $this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' ); |
|
| 536 | - |
|
| 537 | - $this->localize_data['font_weights'] = $this->args['font_weights']; |
|
| 538 | - |
|
| 539 | - $this->localize_data['required'] = Redux_Core::$required; |
|
| 540 | - $this->repeater_data['fonts'] = Redux_Core::$fonts; |
|
| 541 | - |
|
| 542 | - if ( ! isset( $this->repeater_data['opt_names'] ) ) { |
|
| 543 | - $this->repeater_data['opt_names'] = array(); |
|
| 544 | - } |
|
| 545 | - |
|
| 546 | - $this->repeater_data['opt_names'][] = $core->args['opt_name']; |
|
| 547 | - $this->repeater_data['folds'] = array(); |
|
| 548 | - $this->localize_data['required_child'] = Redux_Core::$required_child; |
|
| 549 | - $this->localize_data['fields'] = $core->fields; |
|
| 550 | - |
|
| 551 | - if ( isset( Redux_Core::$font_groups['google'] ) ) { |
|
| 552 | - $this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google']; |
|
| 553 | - } |
|
| 554 | - |
|
| 555 | - if ( isset( Redux_Core::$font_groups['std'] ) ) { |
|
| 556 | - $this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std']; |
|
| 557 | - } |
|
| 558 | - |
|
| 559 | - if ( isset( Redux_Core::$font_groups['customfonts'] ) ) { |
|
| 560 | - $this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts']; |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) { |
|
| 564 | - $this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts']; |
|
| 565 | - } |
|
| 566 | - |
|
| 567 | - $this->localize_data['folds'] = Redux_Core::$folds; |
|
| 568 | - |
|
| 569 | - // Make sure the children are all hidden properly. |
|
| 570 | - foreach ( $core->fields as $key => $value ) { |
|
| 571 | - if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) { |
|
| 572 | - foreach ( $value as $k => $v ) { |
|
| 573 | - if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
|
| 574 | - Redux_Core::$fields_hidden[] = $k; |
|
| 575 | - Redux_Core::$folds[ $k ] = 'hide'; |
|
| 576 | - } |
|
| 577 | - } |
|
| 578 | - } |
|
| 579 | - } |
|
| 580 | - |
|
| 581 | - $this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden; |
|
| 582 | - $this->localize_data['options'] = $core->options; |
|
| 583 | - $this->localize_data['defaults'] = $core->options_defaults; |
|
| 584 | - |
|
| 585 | - /** |
|
| 586 | - * Save pending string |
|
| 587 | - * filter 'redux/{opt_name}/localize/save_pending' |
|
| 588 | - * |
|
| 589 | - * @param string $msg Save_pending string |
|
| 590 | - */ |
|
| 591 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 592 | - $save_pending = apply_filters( |
|
| 593 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 594 | - "redux/{$core->args['opt_name']}/localize/save_pending", |
|
| 595 | - esc_html__( |
|
| 596 | - 'You have changes that are not saved. Would you like to save them now?', |
|
| 597 | - 'redux-framework' |
|
| 598 | - ) |
|
| 599 | - ); |
|
| 600 | - |
|
| 601 | - /** |
|
| 602 | - * Reset all string |
|
| 603 | - * filter 'redux/{opt_name}/localize/reset' |
|
| 604 | - * |
|
| 605 | - * @param string $msg Reset all string. |
|
| 606 | - */ |
|
| 607 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 608 | - $reset_all = apply_filters( |
|
| 609 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 610 | - "redux/{$core->args['opt_name']}/localize/reset", |
|
| 611 | - esc_html__( |
|
| 612 | - 'Are you sure? Resetting will lose all custom values.', |
|
| 613 | - 'redux-framework' |
|
| 614 | - ) |
|
| 615 | - ); |
|
| 616 | - |
|
| 617 | - /** |
|
| 618 | - * Reset section string |
|
| 619 | - * filter 'redux/{opt_name}/localize/reset_section' |
|
| 620 | - * |
|
| 621 | - * @param string $msg Reset section string. |
|
| 622 | - */ |
|
| 623 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 624 | - $reset_section = apply_filters( |
|
| 625 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 626 | - "redux/{$core->args['opt_name']}/localize/reset_section", |
|
| 627 | - esc_html__( |
|
| 628 | - 'Are you sure? Resetting will lose all custom values in this section.', |
|
| 629 | - 'redux-framework' |
|
| 630 | - ) |
|
| 631 | - ); |
|
| 632 | - |
|
| 633 | - /** |
|
| 634 | - * Preset confirm string |
|
| 635 | - * filter 'redux/{opt_name}/localize/preset' |
|
| 636 | - * |
|
| 637 | - * @param string $msg Preset confirm string. |
|
| 638 | - */ |
|
| 639 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 640 | - $preset_confirm = apply_filters( |
|
| 641 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 642 | - "redux/{$core->args['opt_name']}/localize/preset", |
|
| 643 | - esc_html__( |
|
| 644 | - 'Your current options will be replaced with the values of this preset. Would you like to proceed?', |
|
| 645 | - 'redux-framework' |
|
| 646 | - ) |
|
| 647 | - ); |
|
| 648 | - |
|
| 649 | - /** |
|
| 650 | - * Import confirm string |
|
| 651 | - * filter 'redux/{opt_name}/localize/import |
|
| 652 | - * |
|
| 653 | - * @param string $msg Import confirm string. |
|
| 654 | - */ |
|
| 655 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 656 | - $import_confirm = apply_filters( |
|
| 657 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 658 | - "redux/{$core->args['opt_name']}/localize/import", |
|
| 659 | - esc_html__( |
|
| 660 | - 'Your current options will be replaced with the values of this import. Would you like to proceed?', |
|
| 661 | - 'redux-framework' |
|
| 662 | - ) |
|
| 663 | - ); |
|
| 664 | - |
|
| 665 | - global $pagenow; |
|
| 666 | - |
|
| 667 | - $this->localize_data['args'] = array( |
|
| 668 | - 'dev_mode' => $core->args['dev_mode'], |
|
| 669 | - 'save_pending' => $save_pending, |
|
| 670 | - 'reset_confirm' => $reset_all, |
|
| 671 | - 'reset_section_confirm' => $reset_section, |
|
| 672 | - 'preset_confirm' => $preset_confirm, |
|
| 673 | - 'import_section_confirm' => $import_confirm, |
|
| 674 | - 'please_wait' => esc_html__( 'Please Wait', 'redux-framework' ), |
|
| 675 | - 'opt_name' => $core->args['opt_name'], |
|
| 676 | - 'flyout_submenus' => $core->args['flyout_submenus'] ?? false, |
|
| 677 | - 'search' => $core->args['search'] ?? true, |
|
| 678 | - 'slug' => $core->args['page_slug'], |
|
| 679 | - 'hints' => $core->args['hints'], |
|
| 680 | - 'disable_save_warn' => $core->args['disable_save_warn'], |
|
| 681 | - 'class' => $core->args['class'], |
|
| 682 | - 'ajax_save' => $core->args['ajax_save'], |
|
| 683 | - 'menu_search' => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=', |
|
| 684 | - ); |
|
| 685 | - |
|
| 686 | - $this->localize_data['ajax'] = array( |
|
| 687 | - 'console' => esc_html__( |
|
| 688 | - 'There was an error saving. Here is the result of your action:', |
|
| 689 | - 'redux-framework' |
|
| 690 | - ), |
|
| 691 | - 'alert' => esc_html__( |
|
| 692 | - 'There was a problem with your action. Please try again or reload the page.', |
|
| 693 | - 'redux-framework' |
|
| 694 | - ), |
|
| 695 | - ); |
|
| 696 | - |
|
| 697 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | - $this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data ); |
|
| 699 | - |
|
| 700 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 701 | - $this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data ); |
|
| 702 | - |
|
| 703 | - $this->get_warnings_and_errors_array(); |
|
| 704 | - |
|
| 705 | - if ( ! isset( $core->repeater_data ) ) { |
|
| 706 | - $core->repeater_data = array(); |
|
| 707 | - } |
|
| 708 | - $core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 709 | - $this->repeater_data, |
|
| 710 | - $core->repeater_data |
|
| 711 | - ); |
|
| 712 | - |
|
| 713 | - if ( ! isset( $core->localize_data ) ) { |
|
| 714 | - $core->localize_data = array(); |
|
| 715 | - } |
|
| 716 | - $core->localize_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 717 | - $this->localize_data, |
|
| 718 | - $core->localize_data |
|
| 719 | - ); |
|
| 720 | - |
|
| 721 | - // Shim for extension compatibility. |
|
| 722 | - if ( Redux::$extension_compatibility ) { |
|
| 723 | - $this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 724 | - $this->repeater_data, |
|
| 725 | - $core->localize_data |
|
| 726 | - ); |
|
| 727 | - } |
|
| 728 | - |
|
| 729 | - wp_localize_script( |
|
| 730 | - 'redux-js', |
|
| 731 | - 'redux', |
|
| 732 | - $this->repeater_data |
|
| 733 | - ); |
|
| 734 | - |
|
| 735 | - wp_localize_script( |
|
| 736 | - 'redux-js', |
|
| 737 | - 'redux_' . str_replace( '-', '_', $core->args['opt_name'] ), |
|
| 738 | - $this->localize_data |
|
| 739 | - ); |
|
| 740 | - |
|
| 741 | - wp_enqueue_script( 'redux-js' ); // Enqueue the JS now. |
|
| 742 | - } |
|
| 743 | - } |
|
| 15 | + /** |
|
| 16 | + * Class Redux_Enqueue |
|
| 17 | + */ |
|
| 18 | + class Redux_Enqueue extends Redux_Class { |
|
| 19 | + |
|
| 20 | + /** |
|
| 21 | + * Data to localize. |
|
| 22 | + * |
|
| 23 | + * @var array |
|
| 24 | + */ |
|
| 25 | + public array $localize_data = array(); |
|
| 26 | + |
|
| 27 | + /** |
|
| 28 | + * Min string for .min files. |
|
| 29 | + * |
|
| 30 | + * @var string |
|
| 31 | + */ |
|
| 32 | + private string $min = ''; |
|
| 33 | + |
|
| 34 | + /** |
|
| 35 | + * Timestamp for file versions. |
|
| 36 | + * |
|
| 37 | + * @var string |
|
| 38 | + */ |
|
| 39 | + private string $timestamp = ''; |
|
| 40 | + |
|
| 41 | + /** |
|
| 42 | + * Localize data required for the repeater extension. |
|
| 43 | + * |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + private array $repeater_data = array(); |
|
| 47 | + |
|
| 48 | + /** |
|
| 49 | + * Redux_Enqueue constructor. |
|
| 50 | + * |
|
| 51 | + * @param object $redux ReduxFramework pointer. |
|
| 52 | + */ |
|
| 53 | + public function __construct( $redux ) { |
|
| 54 | + parent::__construct( $redux ); |
|
| 55 | + |
|
| 56 | + // Enqueue the admin page CSS and JS. |
|
| 57 | + if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 58 | + add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 ); |
|
| 59 | + } |
|
| 60 | + |
|
| 61 | + add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 ); |
|
| 62 | + |
|
| 63 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 64 | + do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this ); |
|
| 65 | + |
|
| 66 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | + do_action( 'redux/enqueue/construct', $this ); |
|
| 68 | + |
|
| 69 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 70 | + do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' ); |
|
| 71 | + |
|
| 72 | + //if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended |
|
| 73 | + // add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 ); |
|
| 74 | + //} |
|
| 75 | + |
|
| 76 | + //add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 ); |
|
| 77 | + } |
|
| 78 | + |
|
| 79 | + /** |
|
| 80 | + * Scripts to enqueue on the frontend |
|
| 81 | + */ |
|
| 82 | + public function frontend_init() { |
|
| 83 | + $core = $this->core(); |
|
| 84 | + |
|
| 85 | + if ( $core->args['elusive_frontend'] ) { |
|
| 86 | + Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 87 | + } |
|
| 88 | + |
|
| 89 | + if ( $core->args['fontawesome_frontend'] ) { |
|
| 90 | + Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 91 | + } |
|
| 92 | + } |
|
| 93 | + |
|
| 94 | + /** |
|
| 95 | + * Class init functions. |
|
| 96 | + */ |
|
| 97 | + public function init() { |
|
| 98 | + $core = $this->core(); |
|
| 99 | + |
|
| 100 | + Redux_Functions::$parent = $core; |
|
| 101 | + |
|
| 102 | + $this->min = Redux_Functions::is_min(); |
|
| 103 | + |
|
| 104 | + $this->timestamp = Redux_Core::$version; |
|
| 105 | + if ( $core->args['dev_mode'] ) { |
|
| 106 | + $this->timestamp .= '.' . time(); |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + $this->register_styles( $core ); |
|
| 110 | + $this->register_scripts(); |
|
| 111 | + |
|
| 112 | + add_thickbox(); |
|
| 113 | + |
|
| 114 | + $this->enqueue_fields( $core ); |
|
| 115 | + |
|
| 116 | + add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) ); |
|
| 117 | + |
|
| 118 | + $this->set_localized_data( $core ); |
|
| 119 | + |
|
| 120 | + /** |
|
| 121 | + * Action 'redux/page/{opt_name}/enqueue' |
|
| 122 | + */ |
|
| 123 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 124 | + do_action( "redux/page/{$core->args['opt_name']}/enqueue" ); |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + /** |
|
| 128 | + * Register all core framework styles. |
|
| 129 | + * |
|
| 130 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 131 | + */ |
|
| 132 | + private function register_styles( ReduxFramework $core ) { |
|
| 133 | + |
|
| 134 | + /** |
|
| 135 | + * Redux Admin CSS |
|
| 136 | + */ |
|
| 137 | + if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit |
|
| 138 | + $color_scheme = get_user_option( 'admin_color' ); |
|
| 139 | + } elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) { |
|
| 140 | + $color_scheme = 'classic'; |
|
| 141 | + } else { |
|
| 142 | + $color_scheme = $core->args['admin_theme']; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) { |
|
| 146 | + $color_scheme = 'fresh'; |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + $css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css"; |
|
| 150 | + |
|
| 151 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 152 | + $css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css ); |
|
| 153 | + |
|
| 154 | + wp_register_style( |
|
| 155 | + 'redux-admin-theme', |
|
| 156 | + $css, |
|
| 157 | + array(), |
|
| 158 | + $this->timestamp |
|
| 159 | + ); |
|
| 160 | + |
|
| 161 | + wp_enqueue_style( |
|
| 162 | + 'redux-admin-css', |
|
| 163 | + Redux_Core::$url . "assets/css/redux-admin$this->min.css", |
|
| 164 | + array( 'redux-admin-theme' ), |
|
| 165 | + $this->timestamp |
|
| 166 | + ); |
|
| 167 | + |
|
| 168 | + /** |
|
| 169 | + * Redux Fields CSS |
|
| 170 | + */ |
|
| 171 | + if ( ! $core->args['dev_mode'] ) { |
|
| 172 | + wp_enqueue_style( |
|
| 173 | + 'redux-fields', |
|
| 174 | + Redux_Core::$url . 'assets/css/redux-fields.min.css', |
|
| 175 | + array(), |
|
| 176 | + $this->timestamp |
|
| 177 | + ); |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + /** |
|
| 181 | + * Select2 CSS |
|
| 182 | + */ |
|
| 183 | + wp_enqueue_style( |
|
| 184 | + 'select2-css', |
|
| 185 | + Redux_Core::$url . 'assets/css/vendor/select2.min.css', |
|
| 186 | + array(), |
|
| 187 | + '4.1.0' |
|
| 188 | + ); |
|
| 189 | + |
|
| 190 | + /** |
|
| 191 | + * Spectrum CSS |
|
| 192 | + */ |
|
| 193 | + wp_register_style( |
|
| 194 | + 'redux-spectrum-css', |
|
| 195 | + Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css", |
|
| 196 | + array(), |
|
| 197 | + '1.3.3' |
|
| 198 | + ); |
|
| 199 | + |
|
| 200 | + /** |
|
| 201 | + * Elusive Icon CSS |
|
| 202 | + */ |
|
| 203 | + Redux_Functions_Ex::enqueue_elusive_font(); |
|
| 204 | + |
|
| 205 | + /** |
|
| 206 | + * Font Awesome for Social Profiles and Icon Select |
|
| 207 | + */ |
|
| 208 | + Redux_Functions_Ex::enqueue_font_awesome(); |
|
| 209 | + |
|
| 210 | + /** |
|
| 211 | + * QTip CSS |
|
| 212 | + */ |
|
| 213 | + wp_enqueue_style( |
|
| 214 | + 'qtip', |
|
| 215 | + Redux_Core::$url . "assets/css/vendor/qtip$this->min.css", |
|
| 216 | + array(), |
|
| 217 | + '3.0.3' |
|
| 218 | + ); |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * JQuery UI CSS |
|
| 222 | + */ |
|
| 223 | + wp_enqueue_style( |
|
| 224 | + 'jquery-ui', |
|
| 225 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 226 | + apply_filters( |
|
| 227 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 228 | + "redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css", |
|
| 229 | + Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css' |
|
| 230 | + ), |
|
| 231 | + array(), |
|
| 232 | + $this->timestamp |
|
| 233 | + ); |
|
| 234 | + |
|
| 235 | + /** |
|
| 236 | + * Iris CSS |
|
| 237 | + */ |
|
| 238 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 239 | + |
|
| 240 | + if ( $core->args['dev_mode'] ) { |
|
| 241 | + |
|
| 242 | + /** |
|
| 243 | + * Media CSS |
|
| 244 | + */ |
|
| 245 | + wp_enqueue_style( |
|
| 246 | + 'redux-field-media', |
|
| 247 | + Redux_Core::$url . 'assets/css/media.css', |
|
| 248 | + array(), |
|
| 249 | + $this->timestamp |
|
| 250 | + ); |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + /** |
|
| 254 | + * RTL CSS |
|
| 255 | + */ |
|
| 256 | + if ( is_rtl() ) { |
|
| 257 | + wp_enqueue_style( |
|
| 258 | + 'redux-rtl', |
|
| 259 | + Redux_Core::$url . 'assets/css/rtl.css', |
|
| 260 | + array(), |
|
| 261 | + $this->timestamp |
|
| 262 | + ); |
|
| 263 | + } |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + /** |
|
| 267 | + * Register all core framework scripts. |
|
| 268 | + */ |
|
| 269 | + private function register_scripts() { |
|
| 270 | + // ***************************************************************** |
|
| 271 | + // JQuery / JQuery UI JS |
|
| 272 | + // ***************************************************************** |
|
| 273 | + wp_enqueue_script( 'jquery' ); |
|
| 274 | + wp_enqueue_script( 'jquery-ui-core' ); |
|
| 275 | + wp_enqueue_script( 'jquery-ui-dialog' ); |
|
| 276 | + |
|
| 277 | + /** |
|
| 278 | + * Select2 Sortable JS |
|
| 279 | + */ |
|
| 280 | + wp_register_script( |
|
| 281 | + 'redux-select2-sortable', |
|
| 282 | + Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js', |
|
| 283 | + array( 'jquery', 'jquery-ui-sortable' ), |
|
| 284 | + $this->timestamp, |
|
| 285 | + true |
|
| 286 | + ); |
|
| 287 | + |
|
| 288 | + /** |
|
| 289 | + * Select2 |
|
| 290 | + */ |
|
| 291 | + wp_enqueue_script( |
|
| 292 | + 'select2-js', |
|
| 293 | + Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`', |
|
| 294 | + array( 'jquery', 'redux-select2-sortable' ), |
|
| 295 | + '4.1.0', |
|
| 296 | + true |
|
| 297 | + ); |
|
| 298 | + |
|
| 299 | + /** |
|
| 300 | + * QTip JS |
|
| 301 | + */ |
|
| 302 | + wp_enqueue_script( |
|
| 303 | + 'qtip', |
|
| 304 | + Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js', |
|
| 305 | + array( 'jquery' ), |
|
| 306 | + '3.0.3', |
|
| 307 | + true |
|
| 308 | + ); |
|
| 309 | + |
|
| 310 | + /** |
|
| 311 | + * Iris alpha color picker |
|
| 312 | + */ |
|
| 313 | + if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) { |
|
| 314 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 315 | + |
|
| 316 | + wp_register_script( |
|
| 317 | + 'redux-wp-color-picker-alpha', |
|
| 318 | + Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js', |
|
| 319 | + array( 'jquery', 'wp-color-picker' ), |
|
| 320 | + '3.0.0', |
|
| 321 | + true |
|
| 322 | + ); |
|
| 323 | + } |
|
| 324 | + |
|
| 325 | + /** |
|
| 326 | + * Block UI (used by Custom Fonts and Color Schemes). |
|
| 327 | + */ |
|
| 328 | + wp_register_script( |
|
| 329 | + 'redux-block-ui', |
|
| 330 | + Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js', |
|
| 331 | + array( 'jquery' ), |
|
| 332 | + '2.70.0', |
|
| 333 | + true |
|
| 334 | + ); |
|
| 335 | + |
|
| 336 | + /** |
|
| 337 | + * Spectrum JS |
|
| 338 | + */ |
|
| 339 | + wp_register_script( |
|
| 340 | + 'redux-spectrum-js', |
|
| 341 | + Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js', |
|
| 342 | + array( 'jquery' ), |
|
| 343 | + '1.3.3', |
|
| 344 | + true |
|
| 345 | + ); |
|
| 346 | + |
|
| 347 | + /** |
|
| 348 | + * Vendor JS |
|
| 349 | + */ |
|
| 350 | + wp_register_script( |
|
| 351 | + 'redux-vendor', |
|
| 352 | + Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js', |
|
| 353 | + array( 'jquery' ), |
|
| 354 | + $this->timestamp, |
|
| 355 | + true |
|
| 356 | + ); |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Redux JS |
|
| 360 | + */ |
|
| 361 | + wp_register_script( |
|
| 362 | + 'redux-js', |
|
| 363 | + Redux_Core::$url . 'assets/js/redux' . $this->min . '.js', |
|
| 364 | + array( 'jquery', 'redux-vendor' ), |
|
| 365 | + $this->timestamp, |
|
| 366 | + true |
|
| 367 | + ); |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + /** |
|
| 371 | + * Enqueue fields that are in use. |
|
| 372 | + * |
|
| 373 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 374 | + * @param array $field Field array. |
|
| 375 | + */ |
|
| 376 | + public function enqueue_field( ReduxFramework $core, array $field ) { |
|
| 377 | + if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) { |
|
| 378 | + $field_type = str_replace( '_', '-', $field['type'] ); |
|
| 379 | + $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php"; |
|
| 380 | + |
|
| 381 | + // Shim for v3 extension class names. |
|
| 382 | + if ( ! file_exists( $core_path ) ) { |
|
| 383 | + $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php"; |
|
| 384 | + } |
|
| 385 | + |
|
| 386 | + $filter_path = $core_path; |
|
| 387 | + |
|
| 388 | + /** |
|
| 389 | + * Field class file |
|
| 390 | + * filter 'redux/{opt_name}/field/class/{field.type}' |
|
| 391 | + * |
|
| 392 | + * @param string $filter_path Field class file path |
|
| 393 | + * @param array $field Field config data |
|
| 394 | + */ |
|
| 395 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 396 | + $class_file = apply_filters( |
|
| 397 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 398 | + "redux/{$core->args['opt_name']}/field/class/{$field['type']}", |
|
| 399 | + $filter_path, |
|
| 400 | + $field |
|
| 401 | + ); |
|
| 402 | + |
|
| 403 | + $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 404 | + |
|
| 405 | + if ( $class_file ) { |
|
| 406 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 407 | + if ( false === $field_class ) { |
|
| 408 | + if ( file_exists( $class_file ) ) { |
|
| 409 | + require_once $class_file; |
|
| 410 | + |
|
| 411 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 412 | + } else { |
|
| 413 | + return; |
|
| 414 | + } |
|
| 415 | + } |
|
| 416 | + |
|
| 417 | + if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
|
| 418 | + if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | + $core->options[ $field['id'] ] = ''; |
|
| 420 | + } |
|
| 421 | + |
|
| 422 | + $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 423 | + |
|
| 424 | + // Move dev_mode check to a new if/then block. |
|
| 425 | + if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
|
| 426 | + $the_field->enqueue(); |
|
| 427 | + } |
|
| 428 | + |
|
| 429 | + if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) { |
|
| 430 | + $the_field->always_enqueue(); |
|
| 431 | + } |
|
| 432 | + |
|
| 433 | + if ( method_exists( $field_class, 'localize' ) ) { |
|
| 434 | + $the_field->localize( $field ); |
|
| 435 | + |
|
| 436 | + if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | + $this->localize_data[ $field['type'] ] = array(); |
|
| 438 | + } |
|
| 439 | + |
|
| 440 | + $localize_data = $the_field->localize( $field ); |
|
| 441 | + |
|
| 442 | + $shims = array( 'repeater' ); |
|
| 443 | + |
|
| 444 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 445 | + $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
|
| 446 | + |
|
| 447 | + if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
|
| 448 | + $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 449 | + } |
|
| 450 | + |
|
| 451 | + $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 452 | + } |
|
| 453 | + |
|
| 454 | + unset( $the_field ); |
|
| 455 | + } |
|
| 456 | + } |
|
| 457 | + } |
|
| 458 | + } |
|
| 459 | + |
|
| 460 | + /** |
|
| 461 | + * Enqueue field files. |
|
| 462 | + * |
|
| 463 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 464 | + */ |
|
| 465 | + private function enqueue_fields( ReduxFramework $core ) { |
|
| 466 | + foreach ( $core->sections as $section ) { |
|
| 467 | + if ( isset( $section['fields'] ) ) { |
|
| 468 | + foreach ( $section['fields'] as $field ) { |
|
| 469 | + $this->enqueue_field( $core, $field ); |
|
| 470 | + } |
|
| 471 | + } |
|
| 472 | + } |
|
| 473 | + } |
|
| 474 | + |
|
| 475 | + /** |
|
| 476 | + * Build a localized array from field functions, if any. |
|
| 477 | + * |
|
| 478 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 479 | + * @param string $type Field type. |
|
| 480 | + */ |
|
| 481 | + private function build_local_array( ReduxFramework $core, string $type ) { |
|
| 482 | + if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 483 | + $the_total = 0; |
|
| 484 | + $messages = array(); |
|
| 485 | + |
|
| 486 | + foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 487 | + if ( is_array( $msg ) && ! empty( $msg ) ) { |
|
| 488 | + $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 489 | + |
|
| 490 | + if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | + $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + ++$messages[ $msg['section_id'] ]['total']; |
|
| 495 | + ++$the_total; |
|
| 496 | + } |
|
| 497 | + } |
|
| 498 | + |
|
| 499 | + $this->localize_data[ $type ] = array( |
|
| 500 | + 'total' => $the_total, |
|
| 501 | + "$type" => $messages, |
|
| 502 | + ); |
|
| 503 | + |
|
| 504 | + unset( $core->transients['notices'][ $type ] ); |
|
| 505 | + } |
|
| 506 | + } |
|
| 507 | + |
|
| 508 | + /** |
|
| 509 | + * Compile panel errors and wearings for a localized array. |
|
| 510 | + */ |
|
| 511 | + public function get_warnings_and_errors_array() { |
|
| 512 | + $core = $this->core(); |
|
| 513 | + |
|
| 514 | + $this->build_local_array( $core, 'errors' ); |
|
| 515 | + $this->build_local_array( $core, 'warnings' ); |
|
| 516 | + $this->build_local_array( $core, 'sanitize' ); |
|
| 517 | + |
|
| 518 | + if ( empty( $core->transients['notices'] ) ) { |
|
| 519 | + if ( isset( $core->transients['notices'] ) ) { |
|
| 520 | + unset( $core->transients['notices'] ); |
|
| 521 | + } |
|
| 522 | + } |
|
| 523 | + } |
|
| 524 | + |
|
| 525 | + /** |
|
| 526 | + * Commit localized data to global array. |
|
| 527 | + * |
|
| 528 | + * @param ReduxFramework $core ReduxFramework object. |
|
| 529 | + */ |
|
| 530 | + private function set_localized_data( ReduxFramework $core ) { |
|
| 531 | + if ( ! empty( $core->args['last_tab'] ) ) { |
|
| 532 | + $this->localize_data['last_tab'] = $core->args['last_tab']; |
|
| 533 | + } |
|
| 534 | + |
|
| 535 | + $this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' ); |
|
| 536 | + |
|
| 537 | + $this->localize_data['font_weights'] = $this->args['font_weights']; |
|
| 538 | + |
|
| 539 | + $this->localize_data['required'] = Redux_Core::$required; |
|
| 540 | + $this->repeater_data['fonts'] = Redux_Core::$fonts; |
|
| 541 | + |
|
| 542 | + if ( ! isset( $this->repeater_data['opt_names'] ) ) { |
|
| 543 | + $this->repeater_data['opt_names'] = array(); |
|
| 544 | + } |
|
| 545 | + |
|
| 546 | + $this->repeater_data['opt_names'][] = $core->args['opt_name']; |
|
| 547 | + $this->repeater_data['folds'] = array(); |
|
| 548 | + $this->localize_data['required_child'] = Redux_Core::$required_child; |
|
| 549 | + $this->localize_data['fields'] = $core->fields; |
|
| 550 | + |
|
| 551 | + if ( isset( Redux_Core::$font_groups['google'] ) ) { |
|
| 552 | + $this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google']; |
|
| 553 | + } |
|
| 554 | + |
|
| 555 | + if ( isset( Redux_Core::$font_groups['std'] ) ) { |
|
| 556 | + $this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std']; |
|
| 557 | + } |
|
| 558 | + |
|
| 559 | + if ( isset( Redux_Core::$font_groups['customfonts'] ) ) { |
|
| 560 | + $this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts']; |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) { |
|
| 564 | + $this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts']; |
|
| 565 | + } |
|
| 566 | + |
|
| 567 | + $this->localize_data['folds'] = Redux_Core::$folds; |
|
| 568 | + |
|
| 569 | + // Make sure the children are all hidden properly. |
|
| 570 | + foreach ( $core->fields as $key => $value ) { |
|
| 571 | + if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) { |
|
| 572 | + foreach ( $value as $k => $v ) { |
|
| 573 | + if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
|
| 574 | + Redux_Core::$fields_hidden[] = $k; |
|
| 575 | + Redux_Core::$folds[ $k ] = 'hide'; |
|
| 576 | + } |
|
| 577 | + } |
|
| 578 | + } |
|
| 579 | + } |
|
| 580 | + |
|
| 581 | + $this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden; |
|
| 582 | + $this->localize_data['options'] = $core->options; |
|
| 583 | + $this->localize_data['defaults'] = $core->options_defaults; |
|
| 584 | + |
|
| 585 | + /** |
|
| 586 | + * Save pending string |
|
| 587 | + * filter 'redux/{opt_name}/localize/save_pending' |
|
| 588 | + * |
|
| 589 | + * @param string $msg Save_pending string |
|
| 590 | + */ |
|
| 591 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 592 | + $save_pending = apply_filters( |
|
| 593 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 594 | + "redux/{$core->args['opt_name']}/localize/save_pending", |
|
| 595 | + esc_html__( |
|
| 596 | + 'You have changes that are not saved. Would you like to save them now?', |
|
| 597 | + 'redux-framework' |
|
| 598 | + ) |
|
| 599 | + ); |
|
| 600 | + |
|
| 601 | + /** |
|
| 602 | + * Reset all string |
|
| 603 | + * filter 'redux/{opt_name}/localize/reset' |
|
| 604 | + * |
|
| 605 | + * @param string $msg Reset all string. |
|
| 606 | + */ |
|
| 607 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 608 | + $reset_all = apply_filters( |
|
| 609 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 610 | + "redux/{$core->args['opt_name']}/localize/reset", |
|
| 611 | + esc_html__( |
|
| 612 | + 'Are you sure? Resetting will lose all custom values.', |
|
| 613 | + 'redux-framework' |
|
| 614 | + ) |
|
| 615 | + ); |
|
| 616 | + |
|
| 617 | + /** |
|
| 618 | + * Reset section string |
|
| 619 | + * filter 'redux/{opt_name}/localize/reset_section' |
|
| 620 | + * |
|
| 621 | + * @param string $msg Reset section string. |
|
| 622 | + */ |
|
| 623 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 624 | + $reset_section = apply_filters( |
|
| 625 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 626 | + "redux/{$core->args['opt_name']}/localize/reset_section", |
|
| 627 | + esc_html__( |
|
| 628 | + 'Are you sure? Resetting will lose all custom values in this section.', |
|
| 629 | + 'redux-framework' |
|
| 630 | + ) |
|
| 631 | + ); |
|
| 632 | + |
|
| 633 | + /** |
|
| 634 | + * Preset confirm string |
|
| 635 | + * filter 'redux/{opt_name}/localize/preset' |
|
| 636 | + * |
|
| 637 | + * @param string $msg Preset confirm string. |
|
| 638 | + */ |
|
| 639 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 640 | + $preset_confirm = apply_filters( |
|
| 641 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 642 | + "redux/{$core->args['opt_name']}/localize/preset", |
|
| 643 | + esc_html__( |
|
| 644 | + 'Your current options will be replaced with the values of this preset. Would you like to proceed?', |
|
| 645 | + 'redux-framework' |
|
| 646 | + ) |
|
| 647 | + ); |
|
| 648 | + |
|
| 649 | + /** |
|
| 650 | + * Import confirm string |
|
| 651 | + * filter 'redux/{opt_name}/localize/import |
|
| 652 | + * |
|
| 653 | + * @param string $msg Import confirm string. |
|
| 654 | + */ |
|
| 655 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 656 | + $import_confirm = apply_filters( |
|
| 657 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 658 | + "redux/{$core->args['opt_name']}/localize/import", |
|
| 659 | + esc_html__( |
|
| 660 | + 'Your current options will be replaced with the values of this import. Would you like to proceed?', |
|
| 661 | + 'redux-framework' |
|
| 662 | + ) |
|
| 663 | + ); |
|
| 664 | + |
|
| 665 | + global $pagenow; |
|
| 666 | + |
|
| 667 | + $this->localize_data['args'] = array( |
|
| 668 | + 'dev_mode' => $core->args['dev_mode'], |
|
| 669 | + 'save_pending' => $save_pending, |
|
| 670 | + 'reset_confirm' => $reset_all, |
|
| 671 | + 'reset_section_confirm' => $reset_section, |
|
| 672 | + 'preset_confirm' => $preset_confirm, |
|
| 673 | + 'import_section_confirm' => $import_confirm, |
|
| 674 | + 'please_wait' => esc_html__( 'Please Wait', 'redux-framework' ), |
|
| 675 | + 'opt_name' => $core->args['opt_name'], |
|
| 676 | + 'flyout_submenus' => $core->args['flyout_submenus'] ?? false, |
|
| 677 | + 'search' => $core->args['search'] ?? true, |
|
| 678 | + 'slug' => $core->args['page_slug'], |
|
| 679 | + 'hints' => $core->args['hints'], |
|
| 680 | + 'disable_save_warn' => $core->args['disable_save_warn'], |
|
| 681 | + 'class' => $core->args['class'], |
|
| 682 | + 'ajax_save' => $core->args['ajax_save'], |
|
| 683 | + 'menu_search' => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=', |
|
| 684 | + ); |
|
| 685 | + |
|
| 686 | + $this->localize_data['ajax'] = array( |
|
| 687 | + 'console' => esc_html__( |
|
| 688 | + 'There was an error saving. Here is the result of your action:', |
|
| 689 | + 'redux-framework' |
|
| 690 | + ), |
|
| 691 | + 'alert' => esc_html__( |
|
| 692 | + 'There was a problem with your action. Please try again or reload the page.', |
|
| 693 | + 'redux-framework' |
|
| 694 | + ), |
|
| 695 | + ); |
|
| 696 | + |
|
| 697 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | + $this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data ); |
|
| 699 | + |
|
| 700 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 701 | + $this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data ); |
|
| 702 | + |
|
| 703 | + $this->get_warnings_and_errors_array(); |
|
| 704 | + |
|
| 705 | + if ( ! isset( $core->repeater_data ) ) { |
|
| 706 | + $core->repeater_data = array(); |
|
| 707 | + } |
|
| 708 | + $core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 709 | + $this->repeater_data, |
|
| 710 | + $core->repeater_data |
|
| 711 | + ); |
|
| 712 | + |
|
| 713 | + if ( ! isset( $core->localize_data ) ) { |
|
| 714 | + $core->localize_data = array(); |
|
| 715 | + } |
|
| 716 | + $core->localize_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 717 | + $this->localize_data, |
|
| 718 | + $core->localize_data |
|
| 719 | + ); |
|
| 720 | + |
|
| 721 | + // Shim for extension compatibility. |
|
| 722 | + if ( Redux::$extension_compatibility ) { |
|
| 723 | + $this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args( |
|
| 724 | + $this->repeater_data, |
|
| 725 | + $core->localize_data |
|
| 726 | + ); |
|
| 727 | + } |
|
| 728 | + |
|
| 729 | + wp_localize_script( |
|
| 730 | + 'redux-js', |
|
| 731 | + 'redux', |
|
| 732 | + $this->repeater_data |
|
| 733 | + ); |
|
| 734 | + |
|
| 735 | + wp_localize_script( |
|
| 736 | + 'redux-js', |
|
| 737 | + 'redux_' . str_replace( '-', '_', $core->args['opt_name'] ), |
|
| 738 | + $this->localize_data |
|
| 739 | + ); |
|
| 740 | + |
|
| 741 | + wp_enqueue_script( 'redux-js' ); // Enqueue the JS now. |
|
| 742 | + } |
|
| 743 | + } |
|
| 744 | 744 | } |
| 745 | 745 | |
| 746 | 746 | if ( ! class_exists( 'reduxCoreEnqueue' ) ) { |
| 747 | - class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' ); |
|
| 747 | + class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' ); |
|
| 748 | 748 | } |
@@ -415,11 +415,11 @@ discard block |
||
| 415 | 415 | } |
| 416 | 416 | |
| 417 | 417 | if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) { |
| 418 | - if ( ! isset( $core->options[ $field['id'] ] ) ) { |
|
| 419 | - $core->options[ $field['id'] ] = ''; |
|
| 418 | + if ( ! isset( $core->options[$field['id']] ) ) { |
|
| 419 | + $core->options[$field['id']] = ''; |
|
| 420 | 420 | } |
| 421 | 421 | |
| 422 | - $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core ); |
|
| 422 | + $the_field = new $field_class( $field, $core->options[$field['id']], $core ); |
|
| 423 | 423 | |
| 424 | 424 | // Move dev_mode check to a new if/then block. |
| 425 | 425 | if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) { |
@@ -433,8 +433,8 @@ discard block |
||
| 433 | 433 | if ( method_exists( $field_class, 'localize' ) ) { |
| 434 | 434 | $the_field->localize( $field ); |
| 435 | 435 | |
| 436 | - if ( ! isset( $this->localize_data[ $field['type'] ] ) ) { |
|
| 437 | - $this->localize_data[ $field['type'] ] = array(); |
|
| 436 | + if ( ! isset( $this->localize_data[$field['type']] ) ) { |
|
| 437 | + $this->localize_data[$field['type']] = array(); |
|
| 438 | 438 | } |
| 439 | 439 | |
| 440 | 440 | $localize_data = $the_field->localize( $field ); |
@@ -445,10 +445,10 @@ discard block |
||
| 445 | 445 | $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims ); |
| 446 | 446 | |
| 447 | 447 | if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) { |
| 448 | - $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 448 | + $this->repeater_data[$field['type']][$field['id']] = $localize_data; |
|
| 449 | 449 | } |
| 450 | 450 | |
| 451 | - $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data; |
|
| 451 | + $this->localize_data[$field['type']][$field['id']] = $localize_data; |
|
| 452 | 452 | } |
| 453 | 453 | |
| 454 | 454 | unset( $the_field ); |
@@ -479,29 +479,29 @@ discard block |
||
| 479 | 479 | * @param string $type Field type. |
| 480 | 480 | */ |
| 481 | 481 | private function build_local_array( ReduxFramework $core, string $type ) { |
| 482 | - if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) { |
|
| 482 | + if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][$type] ) ) { |
|
| 483 | 483 | $the_total = 0; |
| 484 | 484 | $messages = array(); |
| 485 | 485 | |
| 486 | - foreach ( $core->transients['notices'][ $type ] as $msg ) { |
|
| 486 | + foreach ( $core->transients['notices'][$type] as $msg ) { |
|
| 487 | 487 | if ( is_array( $msg ) && ! empty( $msg ) ) { |
| 488 | - $messages[ $msg['section_id'] ][ $type ][] = $msg; |
|
| 488 | + $messages[$msg['section_id']][$type][] = $msg; |
|
| 489 | 489 | |
| 490 | - if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) { |
|
| 491 | - $messages[ $msg['section_id'] ]['total'] = 0; |
|
| 490 | + if ( ! isset( $messages[$msg['section_id']]['total'] ) ) { |
|
| 491 | + $messages[$msg['section_id']]['total'] = 0; |
|
| 492 | 492 | } |
| 493 | 493 | |
| 494 | - ++$messages[ $msg['section_id'] ]['total']; |
|
| 494 | + ++$messages[$msg['section_id']]['total']; |
|
| 495 | 495 | ++$the_total; |
| 496 | 496 | } |
| 497 | 497 | } |
| 498 | 498 | |
| 499 | - $this->localize_data[ $type ] = array( |
|
| 499 | + $this->localize_data[$type] = array( |
|
| 500 | 500 | 'total' => $the_total, |
| 501 | 501 | "$type" => $messages, |
| 502 | 502 | ); |
| 503 | 503 | |
| 504 | - unset( $core->transients['notices'][ $type ] ); |
|
| 504 | + unset( $core->transients['notices'][$type] ); |
|
| 505 | 505 | } |
| 506 | 506 | } |
| 507 | 507 | |
@@ -572,7 +572,7 @@ discard block |
||
| 572 | 572 | foreach ( $value as $k => $v ) { |
| 573 | 573 | if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) { |
| 574 | 574 | Redux_Core::$fields_hidden[] = $k; |
| 575 | - Redux_Core::$folds[ $k ] = 'hide'; |
|
| 575 | + Redux_Core::$folds[$k] = 'hide'; |
|
| 576 | 576 | } |
| 577 | 577 | } |
| 578 | 578 | } |
@@ -13,475 +13,475 @@ |
||
| 13 | 13 | // Don't duplicate me! |
| 14 | 14 | if ( ! class_exists( 'Redux_Functions_Ex', false ) ) { |
| 15 | 15 | |
| 16 | - /** |
|
| 17 | - * Redux Functions Class |
|
| 18 | - * A Class of useful functions that can/should be shared among all Redux files. |
|
| 19 | - * |
|
| 20 | - * @since 3.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Functions_Ex { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * What is this for? |
|
| 26 | - * |
|
| 27 | - * @var array |
|
| 28 | - */ |
|
| 29 | - public static $args; |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Enqueue Font Awesome. |
|
| 33 | - * |
|
| 34 | - * @return void |
|
| 35 | - */ |
|
| 36 | - public static function enqueue_font_awesome() { |
|
| 37 | - wp_enqueue_style( |
|
| 38 | - 'font-awesome', |
|
| 39 | - Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css', |
|
| 40 | - array(), |
|
| 41 | - '6.5.2' |
|
| 42 | - ); |
|
| 43 | - |
|
| 44 | - wp_enqueue_style( |
|
| 45 | - 'font-awesome-4-shims', |
|
| 46 | - Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css', |
|
| 47 | - array(), |
|
| 48 | - '6.5.2' |
|
| 49 | - ); |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * Enqueue Elusive Font. |
|
| 54 | - * |
|
| 55 | - * @return void |
|
| 56 | - */ |
|
| 57 | - public static function enqueue_elusive_font() { |
|
| 58 | - wp_enqueue_style( |
|
| 59 | - 'redux-elusive-icon', |
|
| 60 | - Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css', |
|
| 61 | - array(), |
|
| 62 | - '2.0.0' |
|
| 63 | - ); |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - /** |
|
| 67 | - * Output alpha data tag for Iris alpha color picker, if enabled. |
|
| 68 | - * |
|
| 69 | - * @param array $data Data array. |
|
| 70 | - * |
|
| 71 | - * @return string |
|
| 72 | - */ |
|
| 73 | - public static function output_alpha_data( array $data ): string { |
|
| 74 | - $index = null; |
|
| 75 | - |
|
| 76 | - extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract |
|
| 77 | - |
|
| 78 | - $value = false; |
|
| 79 | - |
|
| 80 | - if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
|
| 81 | - if ( is_array( $field['color_alpha'] ) ) { |
|
| 82 | - $value = $field['color_alpha'][ $index ] ?? false; |
|
| 83 | - } else { |
|
| 84 | - $value = $field['color_alpha']; |
|
| 85 | - } |
|
| 86 | - } |
|
| 87 | - |
|
| 88 | - return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - /** |
|
| 92 | - * Parses the string into variables without the max_input_vars limitation. |
|
| 93 | - * |
|
| 94 | - * @param string $str String of data. |
|
| 95 | - * |
|
| 96 | - * @return array|false $result |
|
| 97 | - * @since 3.5.7.11 |
|
| 98 | - * @author harunbasic |
|
| 99 | - * @access private |
|
| 100 | - */ |
|
| 101 | - public static function parse_str( string $str ) { |
|
| 102 | - if ( '' === $str ) { |
|
| 103 | - return false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - $result = array(); |
|
| 107 | - $pairs = explode( '&', $str ); |
|
| 108 | - |
|
| 109 | - foreach ( $pairs as $pair ) { |
|
| 110 | - // use the original parse_str() on each element. |
|
| 111 | - parse_str( $pair, $params ); |
|
| 112 | - |
|
| 113 | - $k = key( $params ); |
|
| 114 | - |
|
| 115 | - if ( ! isset( $result[ $k ] ) ) { |
|
| 116 | - $result += $params; |
|
| 117 | - } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | - $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 119 | - } |
|
| 120 | - } |
|
| 121 | - |
|
| 122 | - return $result; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. |
|
| 127 | - * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 |
|
| 128 | - * |
|
| 129 | - * @param array $array1 array one. |
|
| 130 | - * @param array $array2 array two. |
|
| 131 | - * |
|
| 132 | - * @return array $merged |
|
| 133 | - * @since 3.5.7.11 |
|
| 134 | - * @author harunbasic |
|
| 135 | - * @access private |
|
| 136 | - */ |
|
| 137 | - public static function array_merge_recursive_distinct( array $array1, array $array2 ): array { |
|
| 138 | - $merged = $array1; |
|
| 139 | - |
|
| 140 | - foreach ( $array2 as $key => $value ) { |
|
| 141 | - |
|
| 142 | - if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | - } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 145 | - $merged[] = $value; |
|
| 146 | - } else { |
|
| 147 | - $merged[ $key ] = $value; |
|
| 148 | - } |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - return $merged; |
|
| 152 | - } |
|
| 153 | - |
|
| 154 | - /** |
|
| 155 | - * Records calling function. |
|
| 156 | - * |
|
| 157 | - * @param string $opt_name Panel opt_name. |
|
| 158 | - */ |
|
| 159 | - public static function record_caller( string $opt_name = '' ) { |
|
| 160 | - global $pagenow; |
|
| 161 | - |
|
| 162 | - // phpcs:ignore WordPress.Security.NonceVerification |
|
| 163 | - if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) { |
|
| 164 | - return; |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 168 | - $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
|
| 169 | - |
|
| 170 | - if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
|
| 171 | - if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | - Redux_Core::$callers[ $opt_name ] = array(); |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
|
| 176 | - return; |
|
| 177 | - } |
|
| 178 | - |
|
| 179 | - if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | - Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | - self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 185 | - } |
|
| 186 | - } |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - /** |
|
| 190 | - * Normalize path. |
|
| 191 | - * |
|
| 192 | - * @param string $path Path to normalize. |
|
| 193 | - * |
|
| 194 | - * @return string|string[]|null |
|
| 195 | - */ |
|
| 196 | - public static function wp_normalize_path( string $path = '' ) { |
|
| 197 | - if ( function_exists( 'wp_normalize_path' ) ) { |
|
| 198 | - $path = wp_normalize_path( $path ); |
|
| 199 | - } else { |
|
| 200 | - // Shim for pre WP 3.9. |
|
| 201 | - $path = str_replace( '\\', '/', $path ); |
|
| 202 | - $path = preg_replace( '|(?<=.)/+|', '/', $path ); |
|
| 203 | - |
|
| 204 | - if ( ':' === substr( $path, 1, 1 ) ) { |
|
| 205 | - $path = ucfirst( $path ); |
|
| 206 | - } |
|
| 207 | - } |
|
| 208 | - |
|
| 209 | - return $path; |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - /** |
|
| 213 | - * Action to add generator tag to page HEAD. |
|
| 214 | - */ |
|
| 215 | - public static function generator() { |
|
| 216 | - add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) ); |
|
| 217 | - } |
|
| 218 | - |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * Callback for wp_head hook to add meta tag. |
|
| 222 | - */ |
|
| 223 | - public static function meta_tag() { |
|
| 224 | - echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />'; |
|
| 225 | - } |
|
| 226 | - |
|
| 227 | - /** |
|
| 228 | - * Run URL through a ssl check. |
|
| 229 | - * |
|
| 230 | - * @param string $url URL to check. |
|
| 231 | - * |
|
| 232 | - * @return string |
|
| 233 | - */ |
|
| 234 | - public static function verify_url_protocol( string $url ): string { |
|
| 235 | - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 236 | - $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://'; |
|
| 237 | - |
|
| 238 | - if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 239 | - $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 240 | - if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) { |
|
| 241 | - $url = str_replace( $protocol, $new_protocol, $url ); |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - return $url; |
|
| 246 | - } |
|
| 247 | - |
|
| 248 | - /** |
|
| 249 | - * Check s. |
|
| 250 | - * |
|
| 251 | - * @access public |
|
| 252 | - * @return bool |
|
| 253 | - * @since 4.0.0 |
|
| 254 | - */ |
|
| 255 | - public static function s(): bool { |
|
| 256 | - if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 257 | - $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 258 | - |
|
| 259 | - if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) { |
|
| 260 | - return true; |
|
| 261 | - } |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - return false; |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - /** |
|
| 268 | - * Is file in theme. |
|
| 269 | - * |
|
| 270 | - * @param string $file File to check. |
|
| 271 | - * |
|
| 272 | - * @return bool |
|
| 273 | - */ |
|
| 274 | - public static function file_in_theme( string $file ): bool { |
|
| 275 | - $file_path = self::wp_normalize_path( dirname( $file ) ); |
|
| 276 | - |
|
| 277 | - if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) { |
|
| 278 | - return true; |
|
| 279 | - } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) { |
|
| 280 | - return true; |
|
| 281 | - } |
|
| 282 | - |
|
| 283 | - return false; |
|
| 284 | - } |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * Is Redux embedded inside a plugin? |
|
| 288 | - * |
|
| 289 | - * @param string $file File to check. |
|
| 290 | - * |
|
| 291 | - * @return array|bool |
|
| 292 | - */ |
|
| 293 | - public static function is_inside_plugin( string $file ) { |
|
| 294 | - $file = self::wp_normalize_path( $file ); |
|
| 295 | - $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) ); |
|
| 296 | - |
|
| 297 | - if ( self::file_in_theme( $file ) ) { |
|
| 298 | - return false; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - if ( $plugin_basename !== $file ) { |
|
| 302 | - $slug = explode( '/', $plugin_basename ); |
|
| 303 | - $slug = $slug[0]; |
|
| 304 | - |
|
| 305 | - return array( |
|
| 306 | - 'slug' => $slug, |
|
| 307 | - 'basename' => $plugin_basename, |
|
| 308 | - 'path' => $file, |
|
| 309 | - 'url' => self::verify_url_protocol( plugins_url( $plugin_basename ) ), |
|
| 310 | - 'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ), |
|
| 311 | - ); |
|
| 312 | - } |
|
| 313 | - |
|
| 314 | - return false; |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - /** |
|
| 318 | - * Is Redux embedded in a theme? |
|
| 319 | - * |
|
| 320 | - * @param string $file File to check. |
|
| 321 | - * |
|
| 322 | - * @return array|bool |
|
| 323 | - */ |
|
| 324 | - public static function is_inside_theme( string $file = '' ) { |
|
| 325 | - |
|
| 326 | - if ( ! self::file_in_theme( $file ) ) { |
|
| 327 | - return false; |
|
| 328 | - } |
|
| 329 | - |
|
| 330 | - $theme_paths = array( |
|
| 331 | - self::wp_normalize_path( get_template_directory() ) => get_template_directory_uri(), |
|
| 332 | - // parent. |
|
| 333 | - self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(), |
|
| 334 | - // child. |
|
| 335 | - ); |
|
| 336 | - |
|
| 337 | - $theme_paths = array_unique( $theme_paths ); |
|
| 338 | - $file_path = self::wp_normalize_path( $file ); |
|
| 339 | - |
|
| 340 | - $filename = explode( DIRECTORY_SEPARATOR, $file ); |
|
| 341 | - |
|
| 342 | - end( $filename ); |
|
| 343 | - |
|
| 344 | - $filename = prev( $filename ); |
|
| 345 | - |
|
| 346 | - foreach ( $theme_paths as $theme_path => $url ) { |
|
| 347 | - $real_path = self::wp_normalize_path( realpath( $theme_path ) ); |
|
| 348 | - |
|
| 349 | - if ( empty( $real_path ) ) { |
|
| 350 | - continue; |
|
| 351 | - } |
|
| 352 | - |
|
| 353 | - if ( strpos( $file_path, $real_path ) !== false ) { |
|
| 354 | - $slug = explode( '/', $theme_path ); |
|
| 355 | - $slug = end( $slug ); |
|
| 356 | - $relative_path = explode( $slug . '/', dirname( $file_path ) ); |
|
| 357 | - $relative_path = $relative_path[1]; |
|
| 358 | - $data = array( |
|
| 359 | - 'slug' => $slug, |
|
| 360 | - 'path' => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename, |
|
| 361 | - 'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename, |
|
| 362 | - 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
|
| 363 | - 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
|
| 364 | - ); |
|
| 365 | - $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | - |
|
| 367 | - if ( count( $theme_paths ) > 1 ) { |
|
| 368 | - $key = array_search( $theme_path, $theme_paths, true ); |
|
| 369 | - |
|
| 370 | - if ( false !== $key ) { |
|
| 371 | - unset( $theme_paths[ $key ] ); |
|
| 372 | - } |
|
| 373 | - |
|
| 374 | - $theme_paths_end = end( $theme_paths ); |
|
| 375 | - $parent_slug_end = explode( '/', $theme_paths_end ); |
|
| 376 | - $parent_slug_end = end( $parent_slug_end ); |
|
| 377 | - |
|
| 378 | - $data['parent_slug'] = $parent_slug_end; |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - return $data; |
|
| 382 | - } |
|
| 383 | - } |
|
| 384 | - |
|
| 385 | - return false; |
|
| 386 | - } |
|
| 387 | - |
|
| 388 | - /** |
|
| 389 | - * Used to merge two deep arrays. |
|
| 390 | - * |
|
| 391 | - * @param array $a First array to deeply merge. |
|
| 392 | - * @param array $b Second array to deeply merge. |
|
| 393 | - * |
|
| 394 | - * @return array - Deep merge of the two arrays. |
|
| 395 | - */ |
|
| 396 | - public static function nested_wp_parse_args( array &$a, array $b ): array { |
|
| 397 | - $result = $b; |
|
| 398 | - |
|
| 399 | - foreach ( $a as $k => &$v ) { |
|
| 400 | - if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | - $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 402 | - } else { |
|
| 403 | - $result[ $k ] = $v; |
|
| 404 | - } |
|
| 405 | - } |
|
| 406 | - |
|
| 407 | - return $result; |
|
| 408 | - } |
|
| 409 | - |
|
| 410 | - /** |
|
| 411 | - * AJAX callback key |
|
| 412 | - */ |
|
| 413 | - public static function hash_key(): string { |
|
| 414 | - $key = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url(); |
|
| 415 | - $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; |
|
| 416 | - |
|
| 417 | - return $key; |
|
| 418 | - } |
|
| 419 | - |
|
| 420 | - /** |
|
| 421 | - * Register a class path to be autoloaded. |
|
| 422 | - * Registers a namespace to be autoloaded from a given path, using the |
|
| 423 | - * WordPress/HM-style filenames (`class-{name}.php`). |
|
| 424 | - * |
|
| 425 | - * @link https://engineering.hmn.md/standards/style/php/#file-naming |
|
| 426 | - * |
|
| 427 | - * @param string $prefix Prefix to autoload from. |
|
| 428 | - * @param string $path Path to validate. |
|
| 429 | - */ |
|
| 430 | - public static function register_class_path( string $prefix = '', string $path = '' ) { |
|
| 431 | - if ( ! class_exists( 'Redux_Autoloader' ) ) { |
|
| 432 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' ); |
|
| 433 | - } |
|
| 434 | - |
|
| 435 | - $loader = new Redux_Autoloader( $prefix, $path ); |
|
| 436 | - |
|
| 437 | - spl_autoload_register( array( $loader, 'load' ) ); |
|
| 438 | - } |
|
| 439 | - |
|
| 440 | - /** |
|
| 441 | - * Check if a string starts with a string. |
|
| 442 | - * |
|
| 443 | - * @param string $haystack Full string. |
|
| 444 | - * @param string $needle String to check if it starts with. |
|
| 445 | - * |
|
| 446 | - * @return bool |
|
| 447 | - */ |
|
| 448 | - public static function string_starts_with( string $haystack, string $needle ): bool { |
|
| 449 | - $length = strlen( $needle ); |
|
| 450 | - |
|
| 451 | - return substr( $haystack, 0, $length ) === $needle; |
|
| 452 | - } |
|
| 453 | - |
|
| 454 | - /** |
|
| 455 | - * Check if a string ends with a string. |
|
| 456 | - * |
|
| 457 | - * @param string $haystack Full string. |
|
| 458 | - * @param string $needle String to check if it starts with. |
|
| 459 | - * |
|
| 460 | - * @return bool |
|
| 461 | - */ |
|
| 462 | - public static function string_ends_with( string $haystack, string $needle ): bool { |
|
| 463 | - $length = strlen( $needle ); |
|
| 464 | - |
|
| 465 | - if ( ! $length ) { |
|
| 466 | - return true; |
|
| 467 | - } |
|
| 468 | - |
|
| 469 | - return substr( $haystack, - $length ) === $needle; |
|
| 470 | - } |
|
| 471 | - |
|
| 472 | - /** |
|
| 473 | - * Is plugin active. |
|
| 474 | - * |
|
| 475 | - * @param string $name Plugin name. |
|
| 476 | - * |
|
| 477 | - * @return bool |
|
| 478 | - */ |
|
| 479 | - public static function is_plugin_active( string $name ): bool { |
|
| 480 | - if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) { |
|
| 481 | - return true; |
|
| 482 | - } |
|
| 483 | - |
|
| 484 | - return false; |
|
| 485 | - } |
|
| 486 | - } |
|
| 16 | + /** |
|
| 17 | + * Redux Functions Class |
|
| 18 | + * A Class of useful functions that can/should be shared among all Redux files. |
|
| 19 | + * |
|
| 20 | + * @since 3.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Functions_Ex { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * What is this for? |
|
| 26 | + * |
|
| 27 | + * @var array |
|
| 28 | + */ |
|
| 29 | + public static $args; |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Enqueue Font Awesome. |
|
| 33 | + * |
|
| 34 | + * @return void |
|
| 35 | + */ |
|
| 36 | + public static function enqueue_font_awesome() { |
|
| 37 | + wp_enqueue_style( |
|
| 38 | + 'font-awesome', |
|
| 39 | + Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css', |
|
| 40 | + array(), |
|
| 41 | + '6.5.2' |
|
| 42 | + ); |
|
| 43 | + |
|
| 44 | + wp_enqueue_style( |
|
| 45 | + 'font-awesome-4-shims', |
|
| 46 | + Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css', |
|
| 47 | + array(), |
|
| 48 | + '6.5.2' |
|
| 49 | + ); |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * Enqueue Elusive Font. |
|
| 54 | + * |
|
| 55 | + * @return void |
|
| 56 | + */ |
|
| 57 | + public static function enqueue_elusive_font() { |
|
| 58 | + wp_enqueue_style( |
|
| 59 | + 'redux-elusive-icon', |
|
| 60 | + Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css', |
|
| 61 | + array(), |
|
| 62 | + '2.0.0' |
|
| 63 | + ); |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + /** |
|
| 67 | + * Output alpha data tag for Iris alpha color picker, if enabled. |
|
| 68 | + * |
|
| 69 | + * @param array $data Data array. |
|
| 70 | + * |
|
| 71 | + * @return string |
|
| 72 | + */ |
|
| 73 | + public static function output_alpha_data( array $data ): string { |
|
| 74 | + $index = null; |
|
| 75 | + |
|
| 76 | + extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract |
|
| 77 | + |
|
| 78 | + $value = false; |
|
| 79 | + |
|
| 80 | + if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
|
| 81 | + if ( is_array( $field['color_alpha'] ) ) { |
|
| 82 | + $value = $field['color_alpha'][ $index ] ?? false; |
|
| 83 | + } else { |
|
| 84 | + $value = $field['color_alpha']; |
|
| 85 | + } |
|
| 86 | + } |
|
| 87 | + |
|
| 88 | + return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + /** |
|
| 92 | + * Parses the string into variables without the max_input_vars limitation. |
|
| 93 | + * |
|
| 94 | + * @param string $str String of data. |
|
| 95 | + * |
|
| 96 | + * @return array|false $result |
|
| 97 | + * @since 3.5.7.11 |
|
| 98 | + * @author harunbasic |
|
| 99 | + * @access private |
|
| 100 | + */ |
|
| 101 | + public static function parse_str( string $str ) { |
|
| 102 | + if ( '' === $str ) { |
|
| 103 | + return false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + $result = array(); |
|
| 107 | + $pairs = explode( '&', $str ); |
|
| 108 | + |
|
| 109 | + foreach ( $pairs as $pair ) { |
|
| 110 | + // use the original parse_str() on each element. |
|
| 111 | + parse_str( $pair, $params ); |
|
| 112 | + |
|
| 113 | + $k = key( $params ); |
|
| 114 | + |
|
| 115 | + if ( ! isset( $result[ $k ] ) ) { |
|
| 116 | + $result += $params; |
|
| 117 | + } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | + $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 119 | + } |
|
| 120 | + } |
|
| 121 | + |
|
| 122 | + return $result; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does. |
|
| 127 | + * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195 |
|
| 128 | + * |
|
| 129 | + * @param array $array1 array one. |
|
| 130 | + * @param array $array2 array two. |
|
| 131 | + * |
|
| 132 | + * @return array $merged |
|
| 133 | + * @since 3.5.7.11 |
|
| 134 | + * @author harunbasic |
|
| 135 | + * @access private |
|
| 136 | + */ |
|
| 137 | + public static function array_merge_recursive_distinct( array $array1, array $array2 ): array { |
|
| 138 | + $merged = $array1; |
|
| 139 | + |
|
| 140 | + foreach ( $array2 as $key => $value ) { |
|
| 141 | + |
|
| 142 | + if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | + $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | + } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 145 | + $merged[] = $value; |
|
| 146 | + } else { |
|
| 147 | + $merged[ $key ] = $value; |
|
| 148 | + } |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + return $merged; |
|
| 152 | + } |
|
| 153 | + |
|
| 154 | + /** |
|
| 155 | + * Records calling function. |
|
| 156 | + * |
|
| 157 | + * @param string $opt_name Panel opt_name. |
|
| 158 | + */ |
|
| 159 | + public static function record_caller( string $opt_name = '' ) { |
|
| 160 | + global $pagenow; |
|
| 161 | + |
|
| 162 | + // phpcs:ignore WordPress.Security.NonceVerification |
|
| 163 | + if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) { |
|
| 164 | + return; |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 168 | + $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
|
| 169 | + |
|
| 170 | + if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
|
| 171 | + if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | + Redux_Core::$callers[ $opt_name ] = array(); |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
|
| 176 | + return; |
|
| 177 | + } |
|
| 178 | + |
|
| 179 | + if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | + Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | + self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 185 | + } |
|
| 186 | + } |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + /** |
|
| 190 | + * Normalize path. |
|
| 191 | + * |
|
| 192 | + * @param string $path Path to normalize. |
|
| 193 | + * |
|
| 194 | + * @return string|string[]|null |
|
| 195 | + */ |
|
| 196 | + public static function wp_normalize_path( string $path = '' ) { |
|
| 197 | + if ( function_exists( 'wp_normalize_path' ) ) { |
|
| 198 | + $path = wp_normalize_path( $path ); |
|
| 199 | + } else { |
|
| 200 | + // Shim for pre WP 3.9. |
|
| 201 | + $path = str_replace( '\\', '/', $path ); |
|
| 202 | + $path = preg_replace( '|(?<=.)/+|', '/', $path ); |
|
| 203 | + |
|
| 204 | + if ( ':' === substr( $path, 1, 1 ) ) { |
|
| 205 | + $path = ucfirst( $path ); |
|
| 206 | + } |
|
| 207 | + } |
|
| 208 | + |
|
| 209 | + return $path; |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + /** |
|
| 213 | + * Action to add generator tag to page HEAD. |
|
| 214 | + */ |
|
| 215 | + public static function generator() { |
|
| 216 | + add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) ); |
|
| 217 | + } |
|
| 218 | + |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * Callback for wp_head hook to add meta tag. |
|
| 222 | + */ |
|
| 223 | + public static function meta_tag() { |
|
| 224 | + echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />'; |
|
| 225 | + } |
|
| 226 | + |
|
| 227 | + /** |
|
| 228 | + * Run URL through a ssl check. |
|
| 229 | + * |
|
| 230 | + * @param string $url URL to check. |
|
| 231 | + * |
|
| 232 | + * @return string |
|
| 233 | + */ |
|
| 234 | + public static function verify_url_protocol( string $url ): string { |
|
| 235 | + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 236 | + $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://'; |
|
| 237 | + |
|
| 238 | + if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 239 | + $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated |
|
| 240 | + if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) { |
|
| 241 | + $url = str_replace( $protocol, $new_protocol, $url ); |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + return $url; |
|
| 246 | + } |
|
| 247 | + |
|
| 248 | + /** |
|
| 249 | + * Check s. |
|
| 250 | + * |
|
| 251 | + * @access public |
|
| 252 | + * @return bool |
|
| 253 | + * @since 4.0.0 |
|
| 254 | + */ |
|
| 255 | + public static function s(): bool { |
|
| 256 | + if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 257 | + $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found |
|
| 258 | + |
|
| 259 | + if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) { |
|
| 260 | + return true; |
|
| 261 | + } |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + return false; |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + /** |
|
| 268 | + * Is file in theme. |
|
| 269 | + * |
|
| 270 | + * @param string $file File to check. |
|
| 271 | + * |
|
| 272 | + * @return bool |
|
| 273 | + */ |
|
| 274 | + public static function file_in_theme( string $file ): bool { |
|
| 275 | + $file_path = self::wp_normalize_path( dirname( $file ) ); |
|
| 276 | + |
|
| 277 | + if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) { |
|
| 278 | + return true; |
|
| 279 | + } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) { |
|
| 280 | + return true; |
|
| 281 | + } |
|
| 282 | + |
|
| 283 | + return false; |
|
| 284 | + } |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * Is Redux embedded inside a plugin? |
|
| 288 | + * |
|
| 289 | + * @param string $file File to check. |
|
| 290 | + * |
|
| 291 | + * @return array|bool |
|
| 292 | + */ |
|
| 293 | + public static function is_inside_plugin( string $file ) { |
|
| 294 | + $file = self::wp_normalize_path( $file ); |
|
| 295 | + $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) ); |
|
| 296 | + |
|
| 297 | + if ( self::file_in_theme( $file ) ) { |
|
| 298 | + return false; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + if ( $plugin_basename !== $file ) { |
|
| 302 | + $slug = explode( '/', $plugin_basename ); |
|
| 303 | + $slug = $slug[0]; |
|
| 304 | + |
|
| 305 | + return array( |
|
| 306 | + 'slug' => $slug, |
|
| 307 | + 'basename' => $plugin_basename, |
|
| 308 | + 'path' => $file, |
|
| 309 | + 'url' => self::verify_url_protocol( plugins_url( $plugin_basename ) ), |
|
| 310 | + 'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ), |
|
| 311 | + ); |
|
| 312 | + } |
|
| 313 | + |
|
| 314 | + return false; |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + /** |
|
| 318 | + * Is Redux embedded in a theme? |
|
| 319 | + * |
|
| 320 | + * @param string $file File to check. |
|
| 321 | + * |
|
| 322 | + * @return array|bool |
|
| 323 | + */ |
|
| 324 | + public static function is_inside_theme( string $file = '' ) { |
|
| 325 | + |
|
| 326 | + if ( ! self::file_in_theme( $file ) ) { |
|
| 327 | + return false; |
|
| 328 | + } |
|
| 329 | + |
|
| 330 | + $theme_paths = array( |
|
| 331 | + self::wp_normalize_path( get_template_directory() ) => get_template_directory_uri(), |
|
| 332 | + // parent. |
|
| 333 | + self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(), |
|
| 334 | + // child. |
|
| 335 | + ); |
|
| 336 | + |
|
| 337 | + $theme_paths = array_unique( $theme_paths ); |
|
| 338 | + $file_path = self::wp_normalize_path( $file ); |
|
| 339 | + |
|
| 340 | + $filename = explode( DIRECTORY_SEPARATOR, $file ); |
|
| 341 | + |
|
| 342 | + end( $filename ); |
|
| 343 | + |
|
| 344 | + $filename = prev( $filename ); |
|
| 345 | + |
|
| 346 | + foreach ( $theme_paths as $theme_path => $url ) { |
|
| 347 | + $real_path = self::wp_normalize_path( realpath( $theme_path ) ); |
|
| 348 | + |
|
| 349 | + if ( empty( $real_path ) ) { |
|
| 350 | + continue; |
|
| 351 | + } |
|
| 352 | + |
|
| 353 | + if ( strpos( $file_path, $real_path ) !== false ) { |
|
| 354 | + $slug = explode( '/', $theme_path ); |
|
| 355 | + $slug = end( $slug ); |
|
| 356 | + $relative_path = explode( $slug . '/', dirname( $file_path ) ); |
|
| 357 | + $relative_path = $relative_path[1]; |
|
| 358 | + $data = array( |
|
| 359 | + 'slug' => $slug, |
|
| 360 | + 'path' => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename, |
|
| 361 | + 'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename, |
|
| 362 | + 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
|
| 363 | + 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
|
| 364 | + ); |
|
| 365 | + $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | + |
|
| 367 | + if ( count( $theme_paths ) > 1 ) { |
|
| 368 | + $key = array_search( $theme_path, $theme_paths, true ); |
|
| 369 | + |
|
| 370 | + if ( false !== $key ) { |
|
| 371 | + unset( $theme_paths[ $key ] ); |
|
| 372 | + } |
|
| 373 | + |
|
| 374 | + $theme_paths_end = end( $theme_paths ); |
|
| 375 | + $parent_slug_end = explode( '/', $theme_paths_end ); |
|
| 376 | + $parent_slug_end = end( $parent_slug_end ); |
|
| 377 | + |
|
| 378 | + $data['parent_slug'] = $parent_slug_end; |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + return $data; |
|
| 382 | + } |
|
| 383 | + } |
|
| 384 | + |
|
| 385 | + return false; |
|
| 386 | + } |
|
| 387 | + |
|
| 388 | + /** |
|
| 389 | + * Used to merge two deep arrays. |
|
| 390 | + * |
|
| 391 | + * @param array $a First array to deeply merge. |
|
| 392 | + * @param array $b Second array to deeply merge. |
|
| 393 | + * |
|
| 394 | + * @return array - Deep merge of the two arrays. |
|
| 395 | + */ |
|
| 396 | + public static function nested_wp_parse_args( array &$a, array $b ): array { |
|
| 397 | + $result = $b; |
|
| 398 | + |
|
| 399 | + foreach ( $a as $k => &$v ) { |
|
| 400 | + if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | + $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 402 | + } else { |
|
| 403 | + $result[ $k ] = $v; |
|
| 404 | + } |
|
| 405 | + } |
|
| 406 | + |
|
| 407 | + return $result; |
|
| 408 | + } |
|
| 409 | + |
|
| 410 | + /** |
|
| 411 | + * AJAX callback key |
|
| 412 | + */ |
|
| 413 | + public static function hash_key(): string { |
|
| 414 | + $key = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url(); |
|
| 415 | + $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : ''; |
|
| 416 | + |
|
| 417 | + return $key; |
|
| 418 | + } |
|
| 419 | + |
|
| 420 | + /** |
|
| 421 | + * Register a class path to be autoloaded. |
|
| 422 | + * Registers a namespace to be autoloaded from a given path, using the |
|
| 423 | + * WordPress/HM-style filenames (`class-{name}.php`). |
|
| 424 | + * |
|
| 425 | + * @link https://engineering.hmn.md/standards/style/php/#file-naming |
|
| 426 | + * |
|
| 427 | + * @param string $prefix Prefix to autoload from. |
|
| 428 | + * @param string $path Path to validate. |
|
| 429 | + */ |
|
| 430 | + public static function register_class_path( string $prefix = '', string $path = '' ) { |
|
| 431 | + if ( ! class_exists( 'Redux_Autoloader' ) ) { |
|
| 432 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' ); |
|
| 433 | + } |
|
| 434 | + |
|
| 435 | + $loader = new Redux_Autoloader( $prefix, $path ); |
|
| 436 | + |
|
| 437 | + spl_autoload_register( array( $loader, 'load' ) ); |
|
| 438 | + } |
|
| 439 | + |
|
| 440 | + /** |
|
| 441 | + * Check if a string starts with a string. |
|
| 442 | + * |
|
| 443 | + * @param string $haystack Full string. |
|
| 444 | + * @param string $needle String to check if it starts with. |
|
| 445 | + * |
|
| 446 | + * @return bool |
|
| 447 | + */ |
|
| 448 | + public static function string_starts_with( string $haystack, string $needle ): bool { |
|
| 449 | + $length = strlen( $needle ); |
|
| 450 | + |
|
| 451 | + return substr( $haystack, 0, $length ) === $needle; |
|
| 452 | + } |
|
| 453 | + |
|
| 454 | + /** |
|
| 455 | + * Check if a string ends with a string. |
|
| 456 | + * |
|
| 457 | + * @param string $haystack Full string. |
|
| 458 | + * @param string $needle String to check if it starts with. |
|
| 459 | + * |
|
| 460 | + * @return bool |
|
| 461 | + */ |
|
| 462 | + public static function string_ends_with( string $haystack, string $needle ): bool { |
|
| 463 | + $length = strlen( $needle ); |
|
| 464 | + |
|
| 465 | + if ( ! $length ) { |
|
| 466 | + return true; |
|
| 467 | + } |
|
| 468 | + |
|
| 469 | + return substr( $haystack, - $length ) === $needle; |
|
| 470 | + } |
|
| 471 | + |
|
| 472 | + /** |
|
| 473 | + * Is plugin active. |
|
| 474 | + * |
|
| 475 | + * @param string $name Plugin name. |
|
| 476 | + * |
|
| 477 | + * @return bool |
|
| 478 | + */ |
|
| 479 | + public static function is_plugin_active( string $name ): bool { |
|
| 480 | + if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) { |
|
| 481 | + return true; |
|
| 482 | + } |
|
| 483 | + |
|
| 484 | + return false; |
|
| 485 | + } |
|
| 486 | + } |
|
| 487 | 487 | } |
@@ -79,13 +79,13 @@ discard block |
||
| 79 | 79 | |
| 80 | 80 | if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) { |
| 81 | 81 | if ( is_array( $field['color_alpha'] ) ) { |
| 82 | - $value = $field['color_alpha'][ $index ] ?? false; |
|
| 82 | + $value = $field['color_alpha'][$index] ?? false; |
|
| 83 | 83 | } else { |
| 84 | 84 | $value = $field['color_alpha']; |
| 85 | 85 | } |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | - return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"'; |
|
| 88 | + return 'data-alpha-enabled="' . ( bool ) esc_attr( $value ) . '"'; |
|
| 89 | 89 | } |
| 90 | 90 | |
| 91 | 91 | /** |
@@ -112,10 +112,10 @@ discard block |
||
| 112 | 112 | |
| 113 | 113 | $k = key( $params ); |
| 114 | 114 | |
| 115 | - if ( ! isset( $result[ $k ] ) ) { |
|
| 115 | + if ( ! isset( $result[$k] ) ) { |
|
| 116 | 116 | $result += $params; |
| 117 | - } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) { |
|
| 118 | - $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] ); |
|
| 117 | + } elseif ( is_array( $result[$k] ) && is_array( $params[$k] ) ) { |
|
| 118 | + $result[$k] = self::array_merge_recursive_distinct( $result[$k], $params[$k] ); |
|
| 119 | 119 | } |
| 120 | 120 | } |
| 121 | 121 | |
@@ -139,12 +139,12 @@ discard block |
||
| 139 | 139 | |
| 140 | 140 | foreach ( $array2 as $key => $value ) { |
| 141 | 141 | |
| 142 | - if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) { |
|
| 143 | - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); |
|
| 144 | - } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) { |
|
| 142 | + if ( is_array( $value ) && isset( $merged[$key] ) && is_array( $merged[$key] ) ) { |
|
| 143 | + $merged[$key] = self::array_merge_recursive_distinct( $merged[$key], $value ); |
|
| 144 | + } elseif ( is_numeric( $key ) && isset( $merged[$key] ) ) { |
|
| 145 | 145 | $merged[] = $value; |
| 146 | 146 | } else { |
| 147 | - $merged[ $key ] = $value; |
|
| 147 | + $merged[$key] = $value; |
|
| 148 | 148 | } |
| 149 | 149 | } |
| 150 | 150 | |
@@ -168,20 +168,20 @@ discard block |
||
| 168 | 168 | $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file']; |
| 169 | 169 | |
| 170 | 170 | if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) { |
| 171 | - if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) { |
|
| 172 | - Redux_Core::$callers[ $opt_name ] = array(); |
|
| 171 | + if ( ! isset( Redux_Core::$callers[$opt_name] ) ) { |
|
| 172 | + Redux_Core::$callers[$opt_name] = array(); |
|
| 173 | 173 | } |
| 174 | 174 | |
| 175 | 175 | if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) { |
| 176 | 176 | return; |
| 177 | 177 | } |
| 178 | 178 | |
| 179 | - if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) { |
|
| 180 | - Redux_Core::$callers[ $opt_name ][] = $caller; |
|
| 179 | + if ( ! in_array( $caller, Redux_Core::$callers[$opt_name], true ) ) { |
|
| 180 | + Redux_Core::$callers[$opt_name][] = $caller; |
|
| 181 | 181 | } |
| 182 | 182 | |
| 183 | - if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) { |
|
| 184 | - self::$args[ $opt_name ]['callers'][] = $caller; |
|
| 183 | + if ( ! empty( self::$args[$opt_name]['callers'] ) && ! in_array( $caller, self::$args[$opt_name]['callers'], true ) ) { |
|
| 184 | + self::$args[$opt_name]['callers'][] = $caller; |
|
| 185 | 185 | } |
| 186 | 186 | } |
| 187 | 187 | } |
@@ -362,13 +362,13 @@ discard block |
||
| 362 | 362 | 'url' => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ), |
| 363 | 363 | 'basename' => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename, |
| 364 | 364 | ); |
| 365 | - $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 365 | + $data['realpath'] = $data['real_path']; // Shim for old extensions. |
|
| 366 | 366 | |
| 367 | 367 | if ( count( $theme_paths ) > 1 ) { |
| 368 | 368 | $key = array_search( $theme_path, $theme_paths, true ); |
| 369 | 369 | |
| 370 | 370 | if ( false !== $key ) { |
| 371 | - unset( $theme_paths[ $key ] ); |
|
| 371 | + unset( $theme_paths[$key] ); |
|
| 372 | 372 | } |
| 373 | 373 | |
| 374 | 374 | $theme_paths_end = end( $theme_paths ); |
@@ -397,10 +397,10 @@ discard block |
||
| 397 | 397 | $result = $b; |
| 398 | 398 | |
| 399 | 399 | foreach ( $a as $k => &$v ) { |
| 400 | - if ( is_array( $v ) && isset( $result[ $k ] ) ) { |
|
| 401 | - $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] ); |
|
| 400 | + if ( is_array( $v ) && isset( $result[$k] ) ) { |
|
| 401 | + $result[$k] = self::nested_wp_parse_args( $v, $result[$k] ); |
|
| 402 | 402 | } else { |
| 403 | - $result[ $k ] = $v; |
|
| 403 | + $result[$k] = $v; |
|
| 404 | 404 | } |
| 405 | 405 | } |
| 406 | 406 | |
@@ -76,8 +76,8 @@ discard block |
||
| 76 | 76 | foreach ( $sections as $key => $section ) { |
| 77 | 77 | if ( 'fields' === $key ) { |
| 78 | 78 | foreach ( $section as $field ) { |
| 79 | - if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) { |
|
| 80 | - $options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true ); |
|
| 79 | + if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[$field['id']] ) && Redux_Helpers::is_integer( $options_values[$field['id']] ) ) { |
|
| 80 | + $options_values[$field['id']] = apply_filters( 'wpml_object_id', $options_values[$field['id']], $field['data'], true ); |
|
| 81 | 81 | } |
| 82 | 82 | } |
| 83 | 83 | } elseif ( is_array( $section ) && ! empty( $section ) ) { |
@@ -188,10 +188,10 @@ discard block |
||
| 188 | 188 | // Store the changed values in the transient. |
| 189 | 189 | if ( $value !== $core->options ) { |
| 190 | 190 | foreach ( $value as $k => $v ) { |
| 191 | - if ( ! isset( $core->options[ $k ] ) ) { |
|
| 192 | - $core->options[ $k ] = ''; |
|
| 193 | - } elseif ( $v === $core->options[ $k ] ) { |
|
| 194 | - unset( $core->options[ $k ] ); |
|
| 191 | + if ( ! isset( $core->options[$k] ) ) { |
|
| 192 | + $core->options[$k] = ''; |
|
| 193 | + } elseif ( $v === $core->options[$k] ) { |
|
| 194 | + unset( $core->options[$k] ); |
|
| 195 | 195 | } |
| 196 | 196 | } |
| 197 | 197 | |
@@ -227,7 +227,7 @@ discard block |
||
| 227 | 227 | */ |
| 228 | 228 | |
| 229 | 229 | // phpcs:ignore WordPress.NamingConventions.ValidHookName |
| 230 | - $GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options ); |
|
| 230 | + $GLOBALS[$options_global] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options ); |
|
| 231 | 231 | } |
| 232 | 232 | } |
| 233 | 233 | |
@@ -291,7 +291,7 @@ discard block |
||
| 291 | 291 | } |
| 292 | 292 | |
| 293 | 293 | if ( empty( $section ) ) { |
| 294 | - unset( $core->sections[ $k ] ); |
|
| 294 | + unset( $core->sections[$k] ); |
|
| 295 | 295 | continue; |
| 296 | 296 | } |
| 297 | 297 | |
@@ -301,7 +301,7 @@ discard block |
||
| 301 | 301 | |
| 302 | 302 | if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) { |
| 303 | 303 | $section['panel'] = false; |
| 304 | - $core->sections[ $k ] = $section; |
|
| 304 | + $core->sections[$k] = $section; |
|
| 305 | 305 | } |
| 306 | 306 | |
| 307 | 307 | $heading = $section['heading'] ?? $section['title']; |
@@ -315,10 +315,10 @@ discard block |
||
| 315 | 315 | |
| 316 | 316 | if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) { |
| 317 | 317 | $field_id = $field_data['id']; |
| 318 | - $default = $core->options_defaults[ $field_id ] ?? ''; |
|
| 319 | - $data = $core->options[ $field_id ] ?? $default; |
|
| 318 | + $default = $core->options_defaults[$field_id] ?? ''; |
|
| 319 | + $data = $core->options[$field_id] ?? $default; |
|
| 320 | 320 | |
| 321 | - $this->hidden_perm_fields[ $field_id ] = $data; |
|
| 321 | + $this->hidden_perm_fields[$field_id] = $data; |
|
| 322 | 322 | } |
| 323 | 323 | } |
| 324 | 324 | |
@@ -327,7 +327,7 @@ discard block |
||
| 327 | 327 | } |
| 328 | 328 | |
| 329 | 329 | if ( ! $display || ! function_exists( 'add_settings_section' ) ) { |
| 330 | - $this->no_panel_section[ $k ] = $section; |
|
| 330 | + $this->no_panel_section[$k] = $section; |
|
| 331 | 331 | } else { |
| 332 | 332 | add_settings_section( |
| 333 | 333 | $core->args['opt_name'] . $k . '_section', |
@@ -351,11 +351,11 @@ discard block |
||
| 351 | 351 | $field['type'] = 'raw'; |
| 352 | 352 | $field['content'] = $field['desc']; |
| 353 | 353 | $field['desc'] = ''; |
| 354 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 354 | + $core->sections[$k]['fields'][$fieldk] = $field; |
|
| 355 | 355 | } elseif ( 'info' === $field['type'] ) { |
| 356 | 356 | if ( ! isset( $field['full_width'] ) ) { |
| 357 | 357 | $field['full_width'] = true; |
| 358 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 358 | + $core->sections[$k]['fields'][$fieldk] = $field; |
|
| 359 | 359 | } |
| 360 | 360 | } |
| 361 | 361 | |
@@ -366,7 +366,7 @@ discard block |
||
| 366 | 366 | } elseif ( ! isset( $field['full_width'] ) ) { |
| 367 | 367 | $field['full_width'] = true; |
| 368 | 368 | } |
| 369 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 369 | + $core->sections[$k]['fields'][$fieldk] = $field; |
|
| 370 | 370 | } |
| 371 | 371 | |
| 372 | 372 | /** |
@@ -378,9 +378,9 @@ discard block |
||
| 378 | 378 | // phpcs:ignore WordPress.NamingConventions.ValidHookName |
| 379 | 379 | $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field ); |
| 380 | 380 | |
| 381 | - $core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array(); |
|
| 381 | + $core->field_types[$field['type']] = $core->field_types[$field['type']] ?? array(); |
|
| 382 | 382 | |
| 383 | - $core->field_sections[ $field['type'] ][ $field['id'] ] = $k; |
|
| 383 | + $core->field_sections[$field['type']][$field['id']] = $k; |
|
| 384 | 384 | |
| 385 | 385 | $display = true; |
| 386 | 386 | |
@@ -395,14 +395,14 @@ discard block |
||
| 395 | 395 | |
| 396 | 396 | if ( isset( $section['customizer'] ) ) { |
| 397 | 397 | $field['customizer'] = $section['customizer']; |
| 398 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 398 | + $core->sections[$k]['fields'][$fieldk] = $field; |
|
| 399 | 399 | } |
| 400 | 400 | |
| 401 | 401 | if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) { |
| 402 | 402 | if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) { |
| 403 | - $data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ]; |
|
| 403 | + $data = $core->options[$field['id']] ?? $core->options_defaults[$field['id']]; |
|
| 404 | 404 | |
| 405 | - $this->hidden_perm_fields[ $field['id'] ] = $data; |
|
| 405 | + $this->hidden_perm_fields[$field['id']] = $data; |
|
| 406 | 406 | |
| 407 | 407 | continue; |
| 408 | 408 | } |
@@ -436,79 +436,79 @@ discard block |
||
| 436 | 436 | $field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']'; |
| 437 | 437 | |
| 438 | 438 | // Set the default value if present. |
| 439 | - $core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? ''; |
|
| 439 | + $core->options_defaults[$field['id']] = $core->options_defaults[$field['id']] ?? ''; |
|
| 440 | 440 | |
| 441 | 441 | // Set the defaults to the value if not present. |
| 442 | 442 | $do_update = false; |
| 443 | 443 | |
| 444 | 444 | // Check fields for values in the default parameter. |
| 445 | - if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) { |
|
| 446 | - $core->options_defaults[ $field['id'] ] = $field['default']; |
|
| 447 | - $core->options[ $field['id'] ] = $field['default']; |
|
| 445 | + if ( ! isset( $core->options[$field['id']] ) && isset( $field['default'] ) ) { |
|
| 446 | + $core->options_defaults[$field['id']] = $field['default']; |
|
| 447 | + $core->options[$field['id']] = $field['default']; |
|
| 448 | 448 | $do_update = true; |
| 449 | 449 | |
| 450 | 450 | // Check fields that hae no default value, but an option value with settings to |
| 451 | 451 | // be saved by default. |
| 452 | - } elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) { |
|
| 452 | + } elseif ( ! isset( $core->options[$field['id']] ) && isset( $field['options'] ) ) { |
|
| 453 | 453 | |
| 454 | 454 | // If a sorter field, check for options and save them as defaults. |
| 455 | 455 | if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) { |
| 456 | - $core->options_defaults[ $field['id'] ] = $field['options']; |
|
| 457 | - $core->options[ $field['id'] ] = $field['options']; |
|
| 456 | + $core->options_defaults[$field['id']] = $field['options']; |
|
| 457 | + $core->options[$field['id']] = $field['options']; |
|
| 458 | 458 | $do_update = true; |
| 459 | 459 | } |
| 460 | 460 | } |
| 461 | 461 | |
| 462 | 462 | // CORRECT URLS if media URLs are wrong, but attachment IDs are present. |
| 463 | 463 | if ( 'media' === $field['type'] ) { |
| 464 | - if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { |
|
| 465 | - $data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] ); |
|
| 464 | + if ( isset( $core->options[$field['id']]['id'] ) && isset( $core->options[$field['id']]['url'] ) && ! empty( $core->options[$field['id']]['url'] ) && strpos( $core->options[$field['id']]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { |
|
| 465 | + $data = wp_get_attachment_url( $core->options[$field['id']]['id'] ); |
|
| 466 | 466 | |
| 467 | 467 | if ( isset( $data ) && ! empty( $data ) ) { |
| 468 | - $core->options[ $field['id'] ]['url'] = $data; |
|
| 468 | + $core->options[$field['id']]['url'] = $data; |
|
| 469 | 469 | |
| 470 | 470 | $data = wp_get_attachment_image_src( |
| 471 | - $core->options[ $field['id'] ]['id'], |
|
| 471 | + $core->options[$field['id']]['id'], |
|
| 472 | 472 | array( |
| 473 | 473 | 150, |
| 474 | 474 | 150, |
| 475 | 475 | ) |
| 476 | 476 | ); |
| 477 | 477 | |
| 478 | - $core->options[ $field['id'] ]['thumbnail'] = $data[0]; |
|
| 478 | + $core->options[$field['id']]['thumbnail'] = $data[0]; |
|
| 479 | 479 | $do_update = true; |
| 480 | 480 | } |
| 481 | 481 | } |
| 482 | 482 | } |
| 483 | 483 | |
| 484 | 484 | if ( 'background' === $field['type'] ) { |
| 485 | - if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 486 | - $data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] ); |
|
| 485 | + if ( isset( $core->options[$field['id']]['media']['id'] ) && isset( $core->options[$field['id']]['background-image'] ) && ! empty( $core->options[$field['id']]['background-image'] ) && strpos( $core->options[$field['id']]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 486 | + $data = wp_get_attachment_url( $core->options[$field['id']]['media']['id'] ); |
|
| 487 | 487 | |
| 488 | 488 | if ( isset( $data ) && ! empty( $data ) ) { |
| 489 | - $core->options[ $field['id'] ]['background-image'] = $data; |
|
| 489 | + $core->options[$field['id']]['background-image'] = $data; |
|
| 490 | 490 | |
| 491 | 491 | $data = wp_get_attachment_image_src( |
| 492 | - $core->options[ $field['id'] ]['media']['id'], |
|
| 492 | + $core->options[$field['id']]['media']['id'], |
|
| 493 | 493 | array( |
| 494 | 494 | 150, |
| 495 | 495 | 150, |
| 496 | 496 | ) |
| 497 | 497 | ); |
| 498 | 498 | |
| 499 | - $core->options[ $field['id'] ]['media']['thumbnail'] = $data[0]; |
|
| 499 | + $core->options[$field['id']]['media']['thumbnail'] = $data[0]; |
|
| 500 | 500 | $do_update = true; |
| 501 | 501 | } |
| 502 | 502 | } |
| 503 | 503 | } |
| 504 | 504 | |
| 505 | 505 | if ( 'slides' === $field['type'] ) { |
| 506 | - if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 507 | - foreach ( $core->options[ $field['id'] ] as $key => $val ) { |
|
| 506 | + if ( isset( $core->options[$field['id']] ) && is_array( $core->options[$field['id']] ) && isset( $core->options[$field['id']][0]['attachment_id'] ) && isset( $core->options[$field['id']][0]['image'] ) && ! empty( $core->options[$field['id']][0]['image'] ) && strpos( $core->options[$field['id']][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 507 | + foreach ( $core->options[$field['id']] as $key => $val ) { |
|
| 508 | 508 | $data = wp_get_attachment_url( $val['attachment_id'] ); |
| 509 | 509 | |
| 510 | 510 | if ( isset( $data ) && ! empty( $data ) ) { |
| 511 | - $core->options[ $field['id'] ][ $key ]['image'] = $data; |
|
| 511 | + $core->options[$field['id']][$key]['image'] = $data; |
|
| 512 | 512 | |
| 513 | 513 | $data = wp_get_attachment_image_src( |
| 514 | 514 | $val['attachment_id'], |
@@ -518,7 +518,7 @@ discard block |
||
| 518 | 518 | ) |
| 519 | 519 | ); |
| 520 | 520 | |
| 521 | - $core->options[ $field['id'] ][ $key ]['thumb'] = $data[0]; |
|
| 521 | + $core->options[$field['id']][$key]['thumb'] = $data[0]; |
|
| 522 | 522 | $do_update = true; |
| 523 | 523 | } |
| 524 | 524 | } |
@@ -545,21 +545,21 @@ discard block |
||
| 545 | 545 | $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field ); |
| 546 | 546 | |
| 547 | 547 | if ( empty( $field ) ) { |
| 548 | - unset( $core->sections[ $k ]['fields'][ $fieldk ] ); |
|
| 548 | + unset( $core->sections[$k]['fields'][$fieldk] ); |
|
| 549 | 549 | continue; |
| 550 | 550 | } |
| 551 | 551 | |
| 552 | - if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default. |
|
| 552 | + if ( ! empty( Redux_Core::$folds[$field['id']]['parent'] ) ) { // This has some fold items, hide it by default. |
|
| 553 | 553 | $field['class'] .= ' fold'; |
| 554 | 554 | } |
| 555 | 555 | |
| 556 | - if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on. |
|
| 556 | + if ( ! empty( Redux_Core::$folds[$field['id']]['children'] ) ) { // Sets the values you shoe fold children on. |
|
| 557 | 557 | $field['class'] .= ' fold-parent'; |
| 558 | 558 | } |
| 559 | 559 | |
| 560 | 560 | if ( ! empty( $field['compiler'] ) ) { |
| 561 | 561 | $field['class'] .= ' compiler'; |
| 562 | - $core->compiler_fields[ $field['id'] ] = 1; |
|
| 562 | + $core->compiler_fields[$field['id']] = 1; |
|
| 563 | 563 | } |
| 564 | 564 | |
| 565 | 565 | if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) { |
@@ -567,11 +567,11 @@ discard block |
||
| 567 | 567 | unset( $field['unit'] ); |
| 568 | 568 | } |
| 569 | 569 | |
| 570 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 570 | + $core->sections[$k]['fields'][$fieldk] = $field; |
|
| 571 | 571 | |
| 572 | 572 | if ( isset( $core->args['display_source'] ) ) { |
| 573 | 573 | // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
| 574 | - $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>'; |
|
| 574 | + $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[$k]['fields'][$fieldk], true ) . '</pre></div>'; |
|
| 575 | 575 | $th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>'; |
| 576 | 576 | } |
| 577 | 577 | |
@@ -583,9 +583,9 @@ discard block |
||
| 583 | 583 | do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field ); |
| 584 | 584 | |
| 585 | 585 | $core->required_class->check_dependencies( $field ); |
| 586 | - $core->field_head[ $field['id'] ] = $th; |
|
| 586 | + $core->field_head[$field['id']] = $th; |
|
| 587 | 587 | |
| 588 | - if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) { |
|
| 588 | + if ( ! $display || isset( $this->no_panel_section[$k] ) ) { |
|
| 589 | 589 | $this->no_panel[] = $field['id']; |
| 590 | 590 | } else { |
| 591 | 591 | if ( isset( $field['disabled'] ) && $field['disabled'] ) { |
@@ -718,7 +718,7 @@ discard block |
||
| 718 | 718 | if ( isset( $plugin_options['redux-no_panel'] ) ) { |
| 719 | 719 | $keys = explode( '|', $plugin_options['redux-no_panel'] ); |
| 720 | 720 | foreach ( $keys as $key ) { |
| 721 | - $plugin_options[ $key ] = $core->options[ $key ]; |
|
| 721 | + $plugin_options[$key] = $core->options[$key]; |
|
| 722 | 722 | } |
| 723 | 723 | if ( isset( $plugin_options['redux-no_panel'] ) ) { |
| 724 | 724 | unset( $plugin_options['redux-no_panel'] ); |
@@ -727,7 +727,7 @@ discard block |
||
| 727 | 727 | |
| 728 | 728 | if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) { |
| 729 | 729 | foreach ( $this->hidden_perm_fields as $id => $data ) { |
| 730 | - $plugin_options[ $id ] = $data; |
|
| 730 | + $plugin_options[$id] = $data; |
|
| 731 | 731 | } |
| 732 | 732 | } |
| 733 | 733 | |
@@ -755,9 +755,9 @@ discard block |
||
| 755 | 755 | if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) { |
| 756 | 756 | $core->transients['changed_values'] = array(); |
| 757 | 757 | foreach ( $plugin_options as $key => $value ) { |
| 758 | - if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) { |
|
| 759 | - $plugin_options[ $key ] = $value; |
|
| 760 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 758 | + if ( isset( $imported_options[$key] ) && $value !== $imported_options[$key] ) { |
|
| 759 | + $plugin_options[$key] = $value; |
|
| 760 | + $core->transients['changed_values'][$key] = $value; |
|
| 761 | 761 | } |
| 762 | 762 | } |
| 763 | 763 | |
@@ -778,7 +778,7 @@ discard block |
||
| 778 | 778 | ); |
| 779 | 779 | |
| 780 | 780 | setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' ); |
| 781 | - $_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1; |
|
| 781 | + $_COOKIE['redux_current_tab_' . $core->args['opt_name']] = 1; |
|
| 782 | 782 | |
| 783 | 783 | unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] ); |
| 784 | 784 | if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) { |
@@ -816,8 +816,8 @@ discard block |
||
| 816 | 816 | } |
| 817 | 817 | |
| 818 | 818 | foreach ( $core->options as $key => $value ) { |
| 819 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 820 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 819 | + if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) { |
|
| 820 | + $core->transients['changed_values'][$key] = $value; |
|
| 821 | 821 | } |
| 822 | 822 | } |
| 823 | 823 | |
@@ -831,21 +831,21 @@ discard block |
||
| 831 | 831 | |
| 832 | 832 | // Section reset to default. |
| 833 | 833 | if ( ! empty( $plugin_options['defaults-section'] ) ) { |
| 834 | - if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) { |
|
| 834 | + if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[$plugin_options['redux-section']]['fields'] ) ) { |
|
| 835 | 835 | if ( empty( $core->options_defaults ) ) { |
| 836 | 836 | $core->options_defaults = $core->_default_values(); |
| 837 | 837 | } |
| 838 | 838 | |
| 839 | - foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) { |
|
| 839 | + foreach ( $core->sections[$plugin_options['redux-section']]['fields'] as $field ) { |
|
| 840 | 840 | if ( 'tabbed' === $field['type'] ) { |
| 841 | 841 | if ( ! empty( $field['tabs'] ) ) { |
| 842 | 842 | foreach ( $field['tabs'] as $val ) { |
| 843 | 843 | if ( ! empty( $val['fields'] ) ) { |
| 844 | 844 | foreach ( $val['fields'] as $f ) { |
| 845 | - if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 846 | - $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 845 | + if ( isset( $core->options_defaults[$f['id']] ) ) { |
|
| 846 | + $plugin_options[$f['id']] = $core->options_defaults[$f['id']]; |
|
| 847 | 847 | } else { |
| 848 | - $plugin_options[ $f['id'] ] = ''; |
|
| 848 | + $plugin_options[$f['id']] = ''; |
|
| 849 | 849 | } |
| 850 | 850 | } |
| 851 | 851 | } |
@@ -854,18 +854,18 @@ discard block |
||
| 854 | 854 | } elseif ( 'repeater' === $field['type'] ) { |
| 855 | 855 | if ( ! empty( $field['fields'] ) ) { |
| 856 | 856 | foreach ( $field['fields'] as $f ) { |
| 857 | - if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 858 | - $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 857 | + if ( isset( $core->options_defaults[$f['id']] ) ) { |
|
| 858 | + $plugin_options[$f['id']] = $core->options_defaults[$f['id']]; |
|
| 859 | 859 | } else { |
| 860 | - $plugin_options[ $f['id'] ] = ''; |
|
| 860 | + $plugin_options[$f['id']] = ''; |
|
| 861 | 861 | } |
| 862 | 862 | } |
| 863 | 863 | } |
| 864 | 864 | } else { |
| 865 | - if ( isset( $core->options_defaults[ $field['id'] ] ) ) { |
|
| 866 | - $plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ]; |
|
| 865 | + if ( isset( $core->options_defaults[$field['id']] ) ) { |
|
| 866 | + $plugin_options[$field['id']] = $core->options_defaults[$field['id']]; |
|
| 867 | 867 | } else { |
| 868 | - $plugin_options[ $field['id'] ] = ''; |
|
| 868 | + $plugin_options[$field['id']] = ''; |
|
| 869 | 869 | } |
| 870 | 870 | } |
| 871 | 871 | |
@@ -887,8 +887,8 @@ discard block |
||
| 887 | 887 | $core->transients['changed_values'] = array(); |
| 888 | 888 | |
| 889 | 889 | foreach ( $core->options as $key => $value ) { |
| 890 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 891 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 890 | + if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) { |
|
| 891 | + $core->transients['changed_values'][$key] = $value; |
|
| 892 | 892 | } |
| 893 | 893 | } |
| 894 | 894 | |
@@ -962,8 +962,8 @@ discard block |
||
| 962 | 962 | |
| 963 | 963 | if ( ! empty( $core->options ) ) { |
| 964 | 964 | foreach ( $core->options as $key => $value ) { |
| 965 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 966 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 965 | + if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) { |
|
| 966 | + $core->transients['changed_values'][$key] = $value; |
|
| 967 | 967 | } |
| 968 | 968 | } |
| 969 | 969 | } |
@@ -1003,7 +1003,7 @@ discard block |
||
| 1003 | 1003 | $this->default_values(); // fill cache. |
| 1004 | 1004 | } |
| 1005 | 1005 | |
| 1006 | - return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults; |
|
| 1006 | + return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[$opt_name] : $defaults; |
|
| 1007 | 1007 | } |
| 1008 | 1008 | |
| 1009 | 1009 | return ''; |
@@ -1027,11 +1027,11 @@ discard block |
||
| 1027 | 1027 | $defaults = $this->options_defaults; |
| 1028 | 1028 | $value = ''; |
| 1029 | 1029 | |
| 1030 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 1031 | - if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) { |
|
| 1032 | - $value = $defaults[ $key ][ $array_key ]; |
|
| 1030 | + if ( isset( $defaults[$key] ) ) { |
|
| 1031 | + if ( false !== $array_key && isset( $defaults[$key][$array_key] ) ) { |
|
| 1032 | + $value = $defaults[$key][$array_key]; |
|
| 1033 | 1033 | } else { |
| 1034 | - $value = $defaults[ $key ]; |
|
| 1034 | + $value = $defaults[$key]; |
|
| 1035 | 1035 | } |
| 1036 | 1036 | } |
| 1037 | 1037 | |
@@ -12,1034 +12,1034 @@ |
||
| 12 | 12 | |
| 13 | 13 | if ( ! class_exists( 'Redux_Options_Constructor', false ) ) { |
| 14 | 14 | |
| 15 | - /** |
|
| 16 | - * Class Redux_Options |
|
| 17 | - */ |
|
| 18 | - class Redux_Options_Constructor extends Redux_Class { |
|
| 19 | - |
|
| 20 | - /** |
|
| 21 | - * Array to hold single panel data. |
|
| 22 | - * |
|
| 23 | - * @var array |
|
| 24 | - */ |
|
| 25 | - public array $no_panel = array(); |
|
| 26 | - |
|
| 27 | - /** |
|
| 28 | - * Array to hold single panel sections. |
|
| 29 | - * |
|
| 30 | - * @var array |
|
| 31 | - */ |
|
| 32 | - private array $no_panel_section = array(); |
|
| 33 | - |
|
| 34 | - /** |
|
| 35 | - * Array to hold hidden fields. |
|
| 36 | - * |
|
| 37 | - * @var array |
|
| 38 | - */ |
|
| 39 | - private array $hidden_perm_fields = array(); |
|
| 40 | - |
|
| 41 | - /** |
|
| 42 | - * Array to hold hidden sections. |
|
| 43 | - * |
|
| 44 | - * @var array |
|
| 45 | - */ |
|
| 46 | - public array $hidden_perm_sections = array(); |
|
| 47 | - |
|
| 48 | - /** |
|
| 49 | - * Array to hold default options. |
|
| 50 | - * |
|
| 51 | - * @var array |
|
| 52 | - */ |
|
| 53 | - private array $options_defaults = array(); |
|
| 54 | - |
|
| 55 | - /** |
|
| 56 | - * Redux_Options constructor. |
|
| 57 | - * |
|
| 58 | - * @param object $redux ReduxFramework pointer. |
|
| 59 | - */ |
|
| 60 | - public function __construct( $redux ) { |
|
| 61 | - parent::__construct( $redux ); |
|
| 62 | - |
|
| 63 | - add_action( 'admin_init', array( $this, 'register' ) ); |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - /** |
|
| 67 | - * If we switch language in wpml the id of the post/page selected will be in the wrong language |
|
| 68 | - * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id |
|
| 69 | - * Bonus it also gives the user the id of the post in the right language when they retrieve it. |
|
| 70 | - * The recursion allows for it to work in a repeatable field. |
|
| 71 | - * |
|
| 72 | - * @param array $sections Sections array. |
|
| 73 | - * @param array $options_values Values array. |
|
| 74 | - */ |
|
| 75 | - private function translate_data_field_recursive( array $sections, array &$options_values ) { |
|
| 76 | - foreach ( $sections as $key => $section ) { |
|
| 77 | - if ( 'fields' === $key ) { |
|
| 78 | - foreach ( $section as $field ) { |
|
| 79 | - if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) { |
|
| 80 | - $options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true ); |
|
| 81 | - } |
|
| 82 | - } |
|
| 83 | - } elseif ( is_array( $section ) && ! empty( $section ) ) { |
|
| 84 | - $this->translate_data_field_recursive( $section, $options_values ); |
|
| 85 | - } |
|
| 86 | - } |
|
| 87 | - } |
|
| 88 | - |
|
| 89 | - /** |
|
| 90 | - * Retrieves the options. |
|
| 91 | - */ |
|
| 92 | - public function get() { |
|
| 93 | - $core = $this->core(); |
|
| 94 | - |
|
| 95 | - $defaults = false; |
|
| 96 | - |
|
| 97 | - if ( ! empty( $core->defaults ) ) { |
|
| 98 | - $defaults = $core->defaults; |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - if ( empty( $core->args ) ) { |
|
| 102 | - return; |
|
| 103 | - } |
|
| 104 | - |
|
| 105 | - switch ( $core->args['database'] ) { |
|
| 106 | - case 'transient': |
|
| 107 | - $result = get_transient( $core->args['opt_name'] . '-transient' ); |
|
| 108 | - break; |
|
| 109 | - case 'theme_mods': |
|
| 110 | - $result = get_theme_mod( $core->args['opt_name'] . '-mods' ); |
|
| 111 | - break; |
|
| 112 | - case 'theme_mods_expanded': |
|
| 113 | - $result = get_theme_mods(); |
|
| 114 | - break; |
|
| 115 | - case 'network': |
|
| 116 | - $result = get_site_option( $core->args['opt_name'], array() ); |
|
| 117 | - break; |
|
| 118 | - default: |
|
| 119 | - $result = get_option( $core->args['opt_name'], array() ); |
|
| 120 | - |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - if ( ! is_array( $result ) ) { |
|
| 124 | - return; |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - if ( empty( $result ) && empty( $defaults ) ) { |
|
| 128 | - return; |
|
| 129 | - } |
|
| 130 | - |
|
| 131 | - if ( empty( $result ) && ! empty( $defaults ) ) { |
|
| 132 | - $results = $defaults; |
|
| 133 | - $this->set( $results ); |
|
| 134 | - } else { |
|
| 135 | - $core->options = $result; |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - // Don't iterate unnecessarily. |
|
| 139 | - if ( has_filter( 'wpml_object_id' ) ) { |
|
| 140 | - $this->translate_data_field_recursive( $core->sections, $core->options ); |
|
| 141 | - } |
|
| 142 | - |
|
| 143 | - /** |
|
| 144 | - * Action 'redux/options/{opt_name}/options' |
|
| 145 | - * |
|
| 146 | - * @param mixed $value option values |
|
| 147 | - */ |
|
| 148 | - |
|
| 149 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 150 | - $core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections ); |
|
| 151 | - |
|
| 152 | - // Get transient values. |
|
| 153 | - $core->transient_class->get(); |
|
| 154 | - |
|
| 155 | - // Set a global variable by the global_variable argument. |
|
| 156 | - $this->set_global_variable( $core ); |
|
| 157 | - } |
|
| 158 | - |
|
| 159 | - /** |
|
| 160 | - * ->set_options(); This is used to set an arbitrary option in the option array |
|
| 161 | - * |
|
| 162 | - * @since ReduxFramework 3.0.0 |
|
| 163 | - * |
|
| 164 | - * @param string|array $value the value of the option being added. |
|
| 165 | - */ |
|
| 166 | - public function set( $value = '' ) { |
|
| 167 | - $core = $this->core(); |
|
| 168 | - |
|
| 169 | - $core->transients['last_save'] = time(); |
|
| 170 | - |
|
| 171 | - if ( ! empty( $value ) ) { |
|
| 172 | - switch ( $core->args['database'] ) { |
|
| 173 | - case 'transient': |
|
| 174 | - set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] ); |
|
| 175 | - break; |
|
| 176 | - case 'theme_mods': |
|
| 177 | - set_theme_mod( $core->args['opt_name'] . '-mods', $value ); |
|
| 178 | - break; |
|
| 179 | - case 'theme_mods_expanded': |
|
| 180 | - foreach ( $value as $k => $v ) { |
|
| 181 | - set_theme_mod( $k, $v ); |
|
| 182 | - } |
|
| 183 | - break; |
|
| 184 | - case 'network': |
|
| 185 | - update_site_option( $core->args['opt_name'], $value ); |
|
| 186 | - break; |
|
| 187 | - default: |
|
| 188 | - update_option( $core->args['opt_name'], $value ); |
|
| 189 | - |
|
| 190 | - } |
|
| 191 | - |
|
| 192 | - // Store the changed values in the transient. |
|
| 193 | - if ( $value !== $core->options ) { |
|
| 194 | - foreach ( $value as $k => $v ) { |
|
| 195 | - if ( ! isset( $core->options[ $k ] ) ) { |
|
| 196 | - $core->options[ $k ] = ''; |
|
| 197 | - } elseif ( $v === $core->options[ $k ] ) { |
|
| 198 | - unset( $core->options[ $k ] ); |
|
| 199 | - } |
|
| 200 | - } |
|
| 201 | - |
|
| 202 | - $core->transients['changed_values'] = $core->options; |
|
| 203 | - } |
|
| 204 | - |
|
| 205 | - $core->options = $value; |
|
| 206 | - |
|
| 207 | - // Set a global variable by the global_variable argument. |
|
| 208 | - $this->set_global_variable( $core ); |
|
| 209 | - |
|
| 210 | - // Saving the transient values. |
|
| 211 | - $core->transient_class->set(); |
|
| 212 | - } |
|
| 213 | - } |
|
| 214 | - |
|
| 215 | - /** |
|
| 216 | - * Set a global variable by the global_variable argument |
|
| 217 | - * |
|
| 218 | - * @param null|ReduxFramework $core ReduxFramework core object. |
|
| 219 | - * |
|
| 220 | - * @return void (global was set) |
|
| 221 | - * @since 3.1.5 |
|
| 222 | - */ |
|
| 223 | - private function set_global_variable( ?ReduxFramework $core ): void { |
|
| 224 | - if ( ! empty( $core->args['global_variable'] ) ) { |
|
| 225 | - $options_global = $core->args['global_variable']; |
|
| 226 | - |
|
| 227 | - /** |
|
| 228 | - * Filter 'redux/options/{opt_name}/global_variable' |
|
| 229 | - * |
|
| 230 | - * @param array $value option value to set global_variable with |
|
| 231 | - */ |
|
| 232 | - |
|
| 233 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 234 | - $GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options ); |
|
| 235 | - } |
|
| 236 | - } |
|
| 237 | - |
|
| 238 | - /** |
|
| 239 | - * Register Option for use |
|
| 240 | - * |
|
| 241 | - * @return void |
|
| 242 | - * @throws ReflectionException Exception. |
|
| 243 | - * @since 1.0.0 |
|
| 244 | - * @access public |
|
| 245 | - */ |
|
| 246 | - public function register() { |
|
| 247 | - $core = $this->core(); |
|
| 248 | - |
|
| 249 | - if ( ! is_object( $core ) ) { |
|
| 250 | - return; |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - if ( true === $core->args['options_api'] ) { |
|
| 254 | - register_setting( |
|
| 255 | - $core->args['opt_name'] . '_group', |
|
| 256 | - $core->args['opt_name'], |
|
| 257 | - array( |
|
| 258 | - $this, |
|
| 259 | - 'validate_options', |
|
| 260 | - ) |
|
| 261 | - ); |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - if ( is_null( $core->sections ) ) { |
|
| 265 | - return; |
|
| 266 | - } |
|
| 267 | - |
|
| 268 | - if ( empty( $core->options_defaults ) ) { |
|
| 269 | - $core->options_defaults = $core->default_values(); |
|
| 270 | - } |
|
| 271 | - |
|
| 272 | - $run_update = false; |
|
| 273 | - |
|
| 274 | - foreach ( $core->sections as $k => $section ) { |
|
| 275 | - if ( isset( $section['type'] ) && 'divide' === $section['type'] ) { |
|
| 276 | - continue; |
|
| 277 | - } |
|
| 278 | - |
|
| 279 | - $display = true; |
|
| 280 | - |
|
| 281 | - if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 282 | - if ( isset( $section['panel'] ) && false === $section['panel'] ) { |
|
| 283 | - $display = false; |
|
| 284 | - } |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - /** |
|
| 288 | - * Filter 'redux/options/{opt_name}/section/{section.id}' |
|
| 289 | - * |
|
| 290 | - * @param array $section section configuration |
|
| 291 | - */ |
|
| 292 | - if ( isset( $section['id'] ) ) { |
|
| 293 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 294 | - $section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section ); |
|
| 295 | - } |
|
| 296 | - |
|
| 297 | - if ( empty( $section ) ) { |
|
| 298 | - unset( $core->sections[ $k ] ); |
|
| 299 | - continue; |
|
| 300 | - } |
|
| 301 | - |
|
| 302 | - if ( ! isset( $section['title'] ) ) { |
|
| 303 | - $section['title'] = ''; |
|
| 304 | - } |
|
| 305 | - |
|
| 306 | - if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) { |
|
| 307 | - $section['panel'] = false; |
|
| 308 | - $core->sections[ $k ] = $section; |
|
| 309 | - } |
|
| 310 | - |
|
| 311 | - $heading = $section['heading'] ?? $section['title']; |
|
| 312 | - |
|
| 313 | - if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) { |
|
| 314 | - if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) { |
|
| 315 | - $core->hidden_perm_sections[] = $section['title']; |
|
| 316 | - |
|
| 317 | - foreach ( $section['fields'] as $field_data ) { |
|
| 318 | - $field_type = $field_data['type']; |
|
| 319 | - |
|
| 320 | - if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) { |
|
| 321 | - $field_id = $field_data['id']; |
|
| 322 | - $default = $core->options_defaults[ $field_id ] ?? ''; |
|
| 323 | - $data = $core->options[ $field_id ] ?? $default; |
|
| 324 | - |
|
| 325 | - $this->hidden_perm_fields[ $field_id ] = $data; |
|
| 326 | - } |
|
| 327 | - } |
|
| 328 | - |
|
| 329 | - continue; |
|
| 330 | - } |
|
| 331 | - } |
|
| 332 | - |
|
| 333 | - if ( ! $display || ! function_exists( 'add_settings_section' ) ) { |
|
| 334 | - $this->no_panel_section[ $k ] = $section; |
|
| 335 | - } else { |
|
| 336 | - add_settings_section( |
|
| 337 | - $core->args['opt_name'] . $k . '_section', |
|
| 338 | - $heading, |
|
| 339 | - array( |
|
| 340 | - $core->render_class, |
|
| 341 | - 'section_desc', |
|
| 342 | - ), |
|
| 343 | - $core->args['opt_name'] . $k . '_section_group' |
|
| 344 | - ); |
|
| 345 | - } |
|
| 346 | - |
|
| 347 | - $section_ident = false; |
|
| 348 | - if ( isset( $section['fields'] ) ) { |
|
| 349 | - foreach ( $section['fields'] as $fieldk => $field ) { |
|
| 350 | - if ( ! isset( $field['type'] ) ) { |
|
| 351 | - continue; // You need a type! |
|
| 352 | - } |
|
| 353 | - |
|
| 354 | - if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) { |
|
| 355 | - $field['type'] = 'raw'; |
|
| 356 | - $field['content'] = $field['desc']; |
|
| 357 | - $field['desc'] = ''; |
|
| 358 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 359 | - } elseif ( 'info' === $field['type'] ) { |
|
| 360 | - if ( ! isset( $field['full_width'] ) ) { |
|
| 361 | - $field['full_width'] = true; |
|
| 362 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 363 | - } |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - if ( 'raw' === $field['type'] ) { |
|
| 367 | - if ( isset( $field['align'] ) ) { |
|
| 368 | - $field['full_width'] = ! $field['align']; |
|
| 369 | - unset( $field['align'] ); |
|
| 370 | - } elseif ( ! isset( $field['full_width'] ) ) { |
|
| 371 | - $field['full_width'] = true; |
|
| 372 | - } |
|
| 373 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 374 | - } |
|
| 375 | - |
|
| 376 | - /** |
|
| 377 | - * Filter 'redux/options/{opt_name}/field/{field.id}' |
|
| 378 | - * |
|
| 379 | - * @param array $field field config |
|
| 380 | - */ |
|
| 381 | - |
|
| 382 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 383 | - $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field ); |
|
| 384 | - |
|
| 385 | - $core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array(); |
|
| 386 | - |
|
| 387 | - $core->field_sections[ $field['type'] ][ $field['id'] ] = $k; |
|
| 388 | - |
|
| 389 | - $display = true; |
|
| 390 | - |
|
| 391 | - if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 392 | - if ( isset( $field['panel'] ) && false === $field['panel'] ) { |
|
| 393 | - $display = false; |
|
| 394 | - } |
|
| 395 | - } |
|
| 396 | - if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) { |
|
| 397 | - $display = false; |
|
| 398 | - } |
|
| 399 | - |
|
| 400 | - if ( isset( $section['customizer'] ) ) { |
|
| 401 | - $field['customizer'] = $section['customizer']; |
|
| 402 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 403 | - } |
|
| 404 | - |
|
| 405 | - if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) { |
|
| 406 | - if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) { |
|
| 407 | - $data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ]; |
|
| 408 | - |
|
| 409 | - $this->hidden_perm_fields[ $field['id'] ] = $data; |
|
| 410 | - |
|
| 411 | - continue; |
|
| 412 | - } |
|
| 413 | - } |
|
| 414 | - |
|
| 415 | - if ( ! isset( $field['id'] ) ) { |
|
| 416 | - echo '<br /><h3>No field ID is set.</h3><pre>'; |
|
| 417 | - |
|
| 418 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 419 | - print_r( $field ); |
|
| 420 | - |
|
| 421 | - echo '</pre><br />'; |
|
| 422 | - |
|
| 423 | - continue; |
|
| 424 | - } |
|
| 425 | - |
|
| 426 | - if ( isset( $field['type'] ) && 'section' === $field['type'] ) { |
|
| 427 | - if ( isset( $field['indent'] ) && true === $field['indent'] ) { |
|
| 428 | - $section_ident = true; |
|
| 429 | - } else { |
|
| 430 | - $section_ident = false; |
|
| 431 | - } |
|
| 432 | - } |
|
| 433 | - |
|
| 434 | - if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) { |
|
| 435 | - $field['indent'] = true; |
|
| 436 | - } |
|
| 437 | - |
|
| 438 | - $th = $core->render_class->get_header_html( $field ); |
|
| 439 | - |
|
| 440 | - $field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']'; |
|
| 441 | - |
|
| 442 | - // Set the default value if present. |
|
| 443 | - $core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? ''; |
|
| 444 | - |
|
| 445 | - // Set the defaults to the value if not present. |
|
| 446 | - $do_update = false; |
|
| 447 | - |
|
| 448 | - // Check fields for values in the default parameter. |
|
| 449 | - if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) { |
|
| 450 | - $core->options_defaults[ $field['id'] ] = $field['default']; |
|
| 451 | - $core->options[ $field['id'] ] = $field['default']; |
|
| 452 | - $do_update = true; |
|
| 453 | - |
|
| 454 | - // Check fields that hae no default value, but an option value with settings to |
|
| 455 | - // be saved by default. |
|
| 456 | - } elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) { |
|
| 457 | - |
|
| 458 | - // If a sorter field, check for options and save them as defaults. |
|
| 459 | - if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) { |
|
| 460 | - $core->options_defaults[ $field['id'] ] = $field['options']; |
|
| 461 | - $core->options[ $field['id'] ] = $field['options']; |
|
| 462 | - $do_update = true; |
|
| 463 | - } |
|
| 464 | - } |
|
| 465 | - |
|
| 466 | - // CORRECT URLS if media URLs are wrong, but attachment IDs are present. |
|
| 467 | - if ( 'media' === $field['type'] ) { |
|
| 468 | - if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { |
|
| 469 | - $data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] ); |
|
| 470 | - |
|
| 471 | - if ( isset( $data ) && ! empty( $data ) ) { |
|
| 472 | - $core->options[ $field['id'] ]['url'] = $data; |
|
| 473 | - |
|
| 474 | - $data = wp_get_attachment_image_src( |
|
| 475 | - $core->options[ $field['id'] ]['id'], |
|
| 476 | - array( |
|
| 477 | - 150, |
|
| 478 | - 150, |
|
| 479 | - ) |
|
| 480 | - ); |
|
| 481 | - |
|
| 482 | - $core->options[ $field['id'] ]['thumbnail'] = $data[0]; |
|
| 483 | - $do_update = true; |
|
| 484 | - } |
|
| 485 | - } |
|
| 486 | - } |
|
| 487 | - |
|
| 488 | - if ( 'background' === $field['type'] ) { |
|
| 489 | - if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 490 | - $data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] ); |
|
| 491 | - |
|
| 492 | - if ( isset( $data ) && ! empty( $data ) ) { |
|
| 493 | - $core->options[ $field['id'] ]['background-image'] = $data; |
|
| 494 | - |
|
| 495 | - $data = wp_get_attachment_image_src( |
|
| 496 | - $core->options[ $field['id'] ]['media']['id'], |
|
| 497 | - array( |
|
| 498 | - 150, |
|
| 499 | - 150, |
|
| 500 | - ) |
|
| 501 | - ); |
|
| 502 | - |
|
| 503 | - $core->options[ $field['id'] ]['media']['thumbnail'] = $data[0]; |
|
| 504 | - $do_update = true; |
|
| 505 | - } |
|
| 506 | - } |
|
| 507 | - } |
|
| 508 | - |
|
| 509 | - if ( 'slides' === $field['type'] ) { |
|
| 510 | - if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 511 | - foreach ( $core->options[ $field['id'] ] as $key => $val ) { |
|
| 512 | - $data = wp_get_attachment_url( $val['attachment_id'] ); |
|
| 513 | - |
|
| 514 | - if ( isset( $data ) && ! empty( $data ) ) { |
|
| 515 | - $core->options[ $field['id'] ][ $key ]['image'] = $data; |
|
| 516 | - |
|
| 517 | - $data = wp_get_attachment_image_src( |
|
| 518 | - $val['attachment_id'], |
|
| 519 | - array( |
|
| 520 | - 150, |
|
| 521 | - 150, |
|
| 522 | - ) |
|
| 523 | - ); |
|
| 524 | - |
|
| 525 | - $core->options[ $field['id'] ][ $key ]['thumb'] = $data[0]; |
|
| 526 | - $do_update = true; |
|
| 527 | - } |
|
| 528 | - } |
|
| 529 | - } |
|
| 530 | - } |
|
| 531 | - // END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present. |
|
| 532 | - if ( true === $do_update && ! isset( $core->never_save_to_db ) ) { |
|
| 533 | - if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to. |
|
| 534 | - $run_update = true; |
|
| 535 | - } |
|
| 536 | - } |
|
| 537 | - |
|
| 538 | - if ( ! isset( $field['class'] ) ) { // No errors, please. |
|
| 539 | - $field['class'] = ''; |
|
| 540 | - } |
|
| 541 | - |
|
| 542 | - /** |
|
| 543 | - * Filter 'redux/options/{opt_name}/field/{field.id}'. |
|
| 544 | - * |
|
| 545 | - * @param array $field field config |
|
| 546 | - */ |
|
| 547 | - |
|
| 548 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 549 | - $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field ); |
|
| 550 | - |
|
| 551 | - if ( empty( $field ) ) { |
|
| 552 | - unset( $core->sections[ $k ]['fields'][ $fieldk ] ); |
|
| 553 | - continue; |
|
| 554 | - } |
|
| 555 | - |
|
| 556 | - if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default. |
|
| 557 | - $field['class'] .= ' fold'; |
|
| 558 | - } |
|
| 559 | - |
|
| 560 | - if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on. |
|
| 561 | - $field['class'] .= ' fold-parent'; |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - if ( ! empty( $field['compiler'] ) ) { |
|
| 565 | - $field['class'] .= ' compiler'; |
|
| 566 | - $core->compiler_fields[ $field['id'] ] = 1; |
|
| 567 | - } |
|
| 568 | - |
|
| 569 | - if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) { |
|
| 570 | - $field['units'] = $field['unit']; |
|
| 571 | - unset( $field['unit'] ); |
|
| 572 | - } |
|
| 573 | - |
|
| 574 | - $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 575 | - |
|
| 576 | - if ( isset( $core->args['display_source'] ) ) { |
|
| 577 | - // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 578 | - $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>'; |
|
| 579 | - $th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>'; |
|
| 580 | - } |
|
| 581 | - |
|
| 582 | - /** |
|
| 583 | - * Action 'redux/options/{opt_name}/field/{field.type}/register' |
|
| 584 | - */ |
|
| 585 | - |
|
| 586 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 587 | - do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field ); |
|
| 588 | - |
|
| 589 | - $core->required_class->check_dependencies( $field ); |
|
| 590 | - $core->field_head[ $field['id'] ] = $th; |
|
| 591 | - |
|
| 592 | - if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) { |
|
| 593 | - $this->no_panel[] = $field['id']; |
|
| 594 | - } else { |
|
| 595 | - if ( isset( $field['disabled'] ) && $field['disabled'] ) { |
|
| 596 | - $field['class'] .= ' redux_disable_field'; |
|
| 597 | - } |
|
| 598 | - |
|
| 599 | - if ( isset( $field['hidden'] ) && $field['hidden'] ) { |
|
| 600 | - $field['class'] .= ' redux_hide_field'; |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - if ( true === $core->args['options_api'] ) { |
|
| 604 | - add_settings_field( |
|
| 605 | - "{$fieldk}_field", |
|
| 606 | - $th, |
|
| 607 | - array( |
|
| 608 | - $core->render_class, |
|
| 609 | - 'field_input', |
|
| 610 | - ), |
|
| 611 | - "{$core->args['opt_name']}{$k}_section_group", |
|
| 612 | - "{$core->args['opt_name']}{$k}_section", |
|
| 613 | - $field |
|
| 614 | - ); |
|
| 615 | - } |
|
| 616 | - } |
|
| 617 | - } |
|
| 618 | - } |
|
| 619 | - } |
|
| 620 | - |
|
| 621 | - /** |
|
| 622 | - * Action 'redux/options/{opt_name}/register' |
|
| 623 | - * |
|
| 624 | - * @param array $section Option sections |
|
| 625 | - */ |
|
| 626 | - |
|
| 627 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 628 | - do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections ); |
|
| 629 | - |
|
| 630 | - if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields. |
|
| 631 | - $this->set( $core->options ); |
|
| 632 | - } |
|
| 633 | - |
|
| 634 | - if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) { |
|
| 635 | - |
|
| 636 | - Redux_Core::$no_output = true; |
|
| 637 | - $temp = $core->args['output_variables_prefix']; |
|
| 638 | - |
|
| 639 | - // Allow the override of variable's prefix for use by SCSS or LESS. |
|
| 640 | - if ( isset( $core->args['compiler_output_variables_prefix'] ) ) { |
|
| 641 | - $core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix']; |
|
| 642 | - } |
|
| 643 | - $core->output_class->enqueue(); |
|
| 644 | - $core->args['output_variables_prefix'] = $temp; |
|
| 645 | - |
|
| 646 | - // phpcs:ignore WordPress.NamingConventions.ValidVariableName |
|
| 647 | - $compiler_css = $core->compilerCSS; |
|
| 648 | - |
|
| 649 | - /** |
|
| 650 | - * Action 'redux/options/{opt_name}/compiler' |
|
| 651 | - * |
|
| 652 | - * @param array $options Options. |
|
| 653 | - * @param string $css CSS that get sent to the compiler hook. |
|
| 654 | - * @param array $changed_values Changed values. |
|
| 655 | - * @param array $output_variables Output variables. |
|
| 656 | - */ |
|
| 657 | - |
|
| 658 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 659 | - do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables ); |
|
| 660 | - |
|
| 661 | - /** |
|
| 662 | - * Action 'redux/options/{opt_name}/compiler/advanced' |
|
| 663 | - * |
|
| 664 | - * @param object $redux ReduxFramework object. |
|
| 665 | - */ |
|
| 666 | - |
|
| 667 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 668 | - do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core ); |
|
| 669 | - |
|
| 670 | - unset( $core->transients['run_compiler'] ); |
|
| 671 | - $core->transient_class->set(); |
|
| 672 | - } |
|
| 673 | - } |
|
| 674 | - |
|
| 675 | - /** |
|
| 676 | - * Get default options into an array suitable for the settings API |
|
| 677 | - * |
|
| 678 | - * @since 1.0.0 |
|
| 679 | - * @access public |
|
| 680 | - * @return array $this->options_defaults |
|
| 681 | - */ |
|
| 682 | - public function default_values(): array { |
|
| 683 | - $core = $this->core(); |
|
| 684 | - |
|
| 685 | - if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) { |
|
| 686 | - $core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data ); |
|
| 687 | - } |
|
| 688 | - |
|
| 689 | - /** |
|
| 690 | - * Filter 'redux/options/{opt_name}/defaults' |
|
| 691 | - * |
|
| 692 | - * @param array $defaults option default values |
|
| 693 | - */ |
|
| 694 | - |
|
| 695 | - $core->transients['changed_values'] = $core->transients['changed_values'] ?? array(); |
|
| 696 | - |
|
| 697 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | - $core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] ); |
|
| 699 | - |
|
| 700 | - return $core->options_defaults; |
|
| 701 | - } |
|
| 702 | - |
|
| 703 | - /** |
|
| 704 | - * Validate the Options before insertion |
|
| 705 | - * |
|
| 706 | - * @param array $plugin_options The option array. |
|
| 707 | - * |
|
| 708 | - * @return array|mixed|string |
|
| 709 | - * @since 3.0.0 |
|
| 710 | - * @access public |
|
| 711 | - */ |
|
| 712 | - public function validate_options( array $plugin_options ) { |
|
| 713 | - $core = $this->core(); |
|
| 714 | - |
|
| 715 | - if ( true === Redux_Core::$validation_ran ) { |
|
| 716 | - return $plugin_options; |
|
| 717 | - } |
|
| 718 | - |
|
| 719 | - Redux_Core::$validation_ran = true; |
|
| 720 | - |
|
| 721 | - // Save the values not in the panel. |
|
| 722 | - if ( isset( $plugin_options['redux-no_panel'] ) ) { |
|
| 723 | - $keys = explode( '|', $plugin_options['redux-no_panel'] ); |
|
| 724 | - foreach ( $keys as $key ) { |
|
| 725 | - $plugin_options[ $key ] = $core->options[ $key ]; |
|
| 726 | - } |
|
| 727 | - if ( isset( $plugin_options['redux-no_panel'] ) ) { |
|
| 728 | - unset( $plugin_options['redux-no_panel'] ); |
|
| 729 | - } |
|
| 730 | - } |
|
| 731 | - |
|
| 732 | - if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) { |
|
| 733 | - foreach ( $this->hidden_perm_fields as $id => $data ) { |
|
| 734 | - $plugin_options[ $id ] = $data; |
|
| 735 | - } |
|
| 736 | - } |
|
| 737 | - |
|
| 738 | - if ( $plugin_options === $core->options ) { |
|
| 739 | - return $plugin_options; |
|
| 740 | - } |
|
| 741 | - |
|
| 742 | - $time = time(); |
|
| 743 | - |
|
| 744 | - // Sets last saved time. |
|
| 745 | - $core->transients['last_save'] = $time; |
|
| 746 | - |
|
| 747 | - $imported_options = array(); |
|
| 748 | - |
|
| 749 | - if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) { |
|
| 750 | - $imported_options = json_decode( $plugin_options['import_code'], true ); |
|
| 751 | - } |
|
| 752 | - |
|
| 753 | - // Import. |
|
| 754 | - $core->transients['last_save_mode'] = 'import'; // Last save mode. |
|
| 755 | - $core->transients['last_compiler'] = $time; |
|
| 756 | - $core->transients['last_import'] = $time; |
|
| 757 | - $core->transients['run_compiler'] = 1; |
|
| 758 | - |
|
| 759 | - if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) { |
|
| 760 | - $core->transients['changed_values'] = array(); |
|
| 761 | - foreach ( $plugin_options as $key => $value ) { |
|
| 762 | - if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) { |
|
| 763 | - $plugin_options[ $key ] = $value; |
|
| 764 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 765 | - } |
|
| 766 | - } |
|
| 767 | - |
|
| 768 | - /** |
|
| 769 | - * Action 'redux/options/{opt_name}/import'. |
|
| 770 | - * |
|
| 771 | - * @param &array [&$plugin_options, redux_options] |
|
| 772 | - */ |
|
| 773 | - |
|
| 774 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 775 | - do_action_ref_array( |
|
| 776 | - "redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 777 | - array( |
|
| 778 | - &$plugin_options, |
|
| 779 | - $imported_options, |
|
| 780 | - $core->transients['changed_values'], |
|
| 781 | - ) |
|
| 782 | - ); |
|
| 783 | - |
|
| 784 | - setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' ); |
|
| 785 | - $_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1; |
|
| 786 | - |
|
| 787 | - unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] ); |
|
| 788 | - if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) { |
|
| 789 | - $this->set( $plugin_options ); |
|
| 790 | - |
|
| 791 | - return null; |
|
| 792 | - } |
|
| 793 | - |
|
| 794 | - $plugin_options = wp_parse_args( $imported_options, $plugin_options ); |
|
| 795 | - |
|
| 796 | - $core->transient_class->set(); |
|
| 797 | - |
|
| 798 | - return $plugin_options; |
|
| 799 | - } |
|
| 800 | - |
|
| 801 | - // Reset all to defaults. |
|
| 802 | - if ( ! empty( $plugin_options['defaults'] ) ) { |
|
| 803 | - if ( empty( $core->options_defaults ) ) { |
|
| 804 | - $core->options_defaults = $core->_default_values(); |
|
| 805 | - } |
|
| 806 | - |
|
| 807 | - /** |
|
| 808 | - * Filter: 'redux/validate/{opt_name}/defaults'. |
|
| 809 | - * |
|
| 810 | - * @param &array [ $this->options_defaults, $plugin_options] |
|
| 811 | - */ |
|
| 812 | - |
|
| 813 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 814 | - $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults ); |
|
| 815 | - |
|
| 816 | - $core->transients['changed_values'] = array(); |
|
| 817 | - |
|
| 818 | - if ( empty( $core->options ) ) { |
|
| 819 | - $core->options = $core->options_defaults; |
|
| 820 | - } |
|
| 821 | - |
|
| 822 | - foreach ( $core->options as $key => $value ) { |
|
| 823 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 824 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 825 | - } |
|
| 826 | - } |
|
| 827 | - |
|
| 828 | - $core->transients['run_compiler'] = 1; |
|
| 829 | - $core->transients['last_save_mode'] = 'defaults'; // Last save mode. |
|
| 830 | - |
|
| 831 | - $core->transient_class->set(); |
|
| 832 | - |
|
| 833 | - return $plugin_options; |
|
| 834 | - } |
|
| 835 | - |
|
| 836 | - // Section reset to default. |
|
| 837 | - if ( ! empty( $plugin_options['defaults-section'] ) ) { |
|
| 838 | - if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) { |
|
| 839 | - if ( empty( $core->options_defaults ) ) { |
|
| 840 | - $core->options_defaults = $core->_default_values(); |
|
| 841 | - } |
|
| 842 | - |
|
| 843 | - foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) { |
|
| 844 | - if ( 'tabbed' === $field['type'] ) { |
|
| 845 | - if ( ! empty( $field['tabs'] ) ) { |
|
| 846 | - foreach ( $field['tabs'] as $val ) { |
|
| 847 | - if ( ! empty( $val['fields'] ) ) { |
|
| 848 | - foreach ( $val['fields'] as $f ) { |
|
| 849 | - if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 850 | - $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 851 | - } else { |
|
| 852 | - $plugin_options[ $f['id'] ] = ''; |
|
| 853 | - } |
|
| 854 | - } |
|
| 855 | - } |
|
| 856 | - } |
|
| 857 | - } |
|
| 858 | - } elseif ( 'repeater' === $field['type'] ) { |
|
| 859 | - if ( ! empty( $field['fields'] ) ) { |
|
| 860 | - foreach ( $field['fields'] as $f ) { |
|
| 861 | - if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 862 | - $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 863 | - } else { |
|
| 864 | - $plugin_options[ $f['id'] ] = ''; |
|
| 865 | - } |
|
| 866 | - } |
|
| 867 | - } |
|
| 868 | - } else { |
|
| 869 | - if ( isset( $core->options_defaults[ $field['id'] ] ) ) { |
|
| 870 | - $plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ]; |
|
| 871 | - } else { |
|
| 872 | - $plugin_options[ $field['id'] ] = ''; |
|
| 873 | - } |
|
| 874 | - } |
|
| 875 | - |
|
| 876 | - if ( isset( $field['compiler'] ) ) { |
|
| 877 | - $compiler = true; |
|
| 878 | - } |
|
| 879 | - } |
|
| 880 | - |
|
| 881 | - /** |
|
| 882 | - * Filter: 'redux/validate/{opt_name}/defaults_section'. |
|
| 883 | - * |
|
| 884 | - * @param &array [ $this->options_defaults, $plugin_options] |
|
| 885 | - */ |
|
| 886 | - |
|
| 887 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 888 | - $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options ); |
|
| 889 | - } |
|
| 890 | - |
|
| 891 | - $core->transients['changed_values'] = array(); |
|
| 892 | - |
|
| 893 | - foreach ( $core->options as $key => $value ) { |
|
| 894 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 895 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 896 | - } |
|
| 897 | - } |
|
| 898 | - |
|
| 899 | - if ( isset( $compiler ) ) { |
|
| 900 | - $core->transients['last_compiler'] = $time; |
|
| 901 | - $core->transients['run_compiler'] = 1; |
|
| 902 | - } |
|
| 903 | - |
|
| 904 | - $core->transients['last_save_mode'] = 'defaults_section'; // Last save mode. |
|
| 905 | - |
|
| 906 | - unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); |
|
| 907 | - |
|
| 908 | - $core->transient_class->set(); |
|
| 909 | - |
|
| 910 | - return $plugin_options; |
|
| 911 | - } |
|
| 912 | - |
|
| 913 | - $core->transients['last_save_mode'] = 'normal'; // Last save mode. |
|
| 914 | - |
|
| 915 | - /** |
|
| 916 | - * Filter: 'redux/validate/{opt_name}/before_validation' |
|
| 917 | - * |
|
| 918 | - * @param &array [&$plugin_options, redux_options] |
|
| 919 | - */ |
|
| 920 | - |
|
| 921 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 922 | - $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options ); |
|
| 923 | - |
|
| 924 | - // Validate fields (if needed). |
|
| 925 | - $plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections ); |
|
| 926 | - |
|
| 927 | - // Sanitize options, if needed. |
|
| 928 | - $plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections ); |
|
| 929 | - |
|
| 930 | - if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) { |
|
| 931 | - $core->transients['notices'] = array( |
|
| 932 | - 'errors' => $core->errors, |
|
| 933 | - 'warnings' => $core->warnings, |
|
| 934 | - 'sanitize' => $core->sanitize, |
|
| 935 | - ); |
|
| 936 | - } |
|
| 937 | - |
|
| 938 | - if ( ! isset( $core->transients['changed_values'] ) ) { |
|
| 939 | - $core->transients['changed_values'] = array(); |
|
| 940 | - } |
|
| 941 | - |
|
| 942 | - /** |
|
| 943 | - * Action 'redux/options/{opt_name}/validate' |
|
| 944 | - * |
|
| 945 | - * @param &array [&$plugin_options, redux_options] |
|
| 946 | - */ |
|
| 947 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 948 | - do_action_ref_array( |
|
| 949 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 950 | - "redux/options/{$core->args['opt_name']}/validate", |
|
| 951 | - array( |
|
| 952 | - &$plugin_options, |
|
| 953 | - $core->options, |
|
| 954 | - $core->transients['changed_values'], |
|
| 955 | - ) |
|
| 956 | - ); |
|
| 957 | - |
|
| 958 | - if ( ! empty( $plugin_options['compiler'] ) ) { |
|
| 959 | - unset( $plugin_options['compiler'] ); |
|
| 960 | - |
|
| 961 | - $core->transients['last_compiler'] = $time; |
|
| 962 | - $core->transients['run_compiler'] = 1; |
|
| 963 | - } |
|
| 964 | - |
|
| 965 | - $core->transients['changed_values'] = array(); // Changed values since last save. |
|
| 966 | - |
|
| 967 | - if ( ! empty( $core->options ) ) { |
|
| 968 | - foreach ( $core->options as $key => $value ) { |
|
| 969 | - if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 970 | - $core->transients['changed_values'][ $key ] = $value; |
|
| 971 | - } |
|
| 972 | - } |
|
| 973 | - } |
|
| 974 | - |
|
| 975 | - unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); |
|
| 976 | - if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) { |
|
| 977 | - $core->set( $core->args['opt_name'], $plugin_options ); |
|
| 978 | - return null; |
|
| 979 | - } |
|
| 980 | - |
|
| 981 | - if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) { |
|
| 982 | - $w3_inst = w3_instance( 'W3_ObjectCache' ); |
|
| 983 | - $w3 = $w3_inst->instance(); |
|
| 984 | - $key = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' ); |
|
| 985 | - $w3->delete( $key, 'transient', true ); |
|
| 986 | - } |
|
| 987 | - |
|
| 988 | - $core->transient_class->set(); |
|
| 989 | - |
|
| 990 | - return $plugin_options; |
|
| 991 | - } |
|
| 992 | - |
|
| 993 | - /** |
|
| 994 | - * ->get_default(); This is used to return the default value if default_show is set. |
|
| 995 | - * |
|
| 996 | - * @param string $opt_name The option name to return. |
|
| 997 | - * @param mixed $defaults (null) The value to return if default not set. |
|
| 998 | - * |
|
| 999 | - * @return mixed $default |
|
| 1000 | - * @since 1.0.1 |
|
| 1001 | - * @access public |
|
| 1002 | - */ |
|
| 1003 | - public function get_default( string $opt_name, $defaults = null ) { |
|
| 1004 | - if ( true === $this->args['default_show'] ) { |
|
| 1005 | - |
|
| 1006 | - if ( empty( $this->options_defaults ) ) { |
|
| 1007 | - $this->default_values(); // fill cache. |
|
| 1008 | - } |
|
| 1009 | - |
|
| 1010 | - return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults; |
|
| 1011 | - } |
|
| 1012 | - |
|
| 1013 | - return ''; |
|
| 1014 | - } |
|
| 1015 | - |
|
| 1016 | - /** |
|
| 1017 | - * Get the default value for an option |
|
| 1018 | - * |
|
| 1019 | - * @param string $key The option's ID. |
|
| 1020 | - * @param string $array_key The key of the default's array. |
|
| 1021 | - * |
|
| 1022 | - * @return mixed |
|
| 1023 | - * @since 3.3.6 |
|
| 1024 | - * @access public |
|
| 1025 | - */ |
|
| 1026 | - public function get_default_value( string $key, $array_key = false ) { |
|
| 1027 | - if ( empty( $this->options_defaults ) ) { |
|
| 1028 | - $this->options_defaults = $this->default_values(); |
|
| 1029 | - } |
|
| 1030 | - |
|
| 1031 | - $defaults = $this->options_defaults; |
|
| 1032 | - $value = ''; |
|
| 1033 | - |
|
| 1034 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 1035 | - if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) { |
|
| 1036 | - $value = $defaults[ $key ][ $array_key ]; |
|
| 1037 | - } else { |
|
| 1038 | - $value = $defaults[ $key ]; |
|
| 1039 | - } |
|
| 1040 | - } |
|
| 1041 | - |
|
| 1042 | - return $value; |
|
| 1043 | - } |
|
| 1044 | - } |
|
| 15 | + /** |
|
| 16 | + * Class Redux_Options |
|
| 17 | + */ |
|
| 18 | + class Redux_Options_Constructor extends Redux_Class { |
|
| 19 | + |
|
| 20 | + /** |
|
| 21 | + * Array to hold single panel data. |
|
| 22 | + * |
|
| 23 | + * @var array |
|
| 24 | + */ |
|
| 25 | + public array $no_panel = array(); |
|
| 26 | + |
|
| 27 | + /** |
|
| 28 | + * Array to hold single panel sections. |
|
| 29 | + * |
|
| 30 | + * @var array |
|
| 31 | + */ |
|
| 32 | + private array $no_panel_section = array(); |
|
| 33 | + |
|
| 34 | + /** |
|
| 35 | + * Array to hold hidden fields. |
|
| 36 | + * |
|
| 37 | + * @var array |
|
| 38 | + */ |
|
| 39 | + private array $hidden_perm_fields = array(); |
|
| 40 | + |
|
| 41 | + /** |
|
| 42 | + * Array to hold hidden sections. |
|
| 43 | + * |
|
| 44 | + * @var array |
|
| 45 | + */ |
|
| 46 | + public array $hidden_perm_sections = array(); |
|
| 47 | + |
|
| 48 | + /** |
|
| 49 | + * Array to hold default options. |
|
| 50 | + * |
|
| 51 | + * @var array |
|
| 52 | + */ |
|
| 53 | + private array $options_defaults = array(); |
|
| 54 | + |
|
| 55 | + /** |
|
| 56 | + * Redux_Options constructor. |
|
| 57 | + * |
|
| 58 | + * @param object $redux ReduxFramework pointer. |
|
| 59 | + */ |
|
| 60 | + public function __construct( $redux ) { |
|
| 61 | + parent::__construct( $redux ); |
|
| 62 | + |
|
| 63 | + add_action( 'admin_init', array( $this, 'register' ) ); |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + /** |
|
| 67 | + * If we switch language in wpml the id of the post/page selected will be in the wrong language |
|
| 68 | + * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id |
|
| 69 | + * Bonus it also gives the user the id of the post in the right language when they retrieve it. |
|
| 70 | + * The recursion allows for it to work in a repeatable field. |
|
| 71 | + * |
|
| 72 | + * @param array $sections Sections array. |
|
| 73 | + * @param array $options_values Values array. |
|
| 74 | + */ |
|
| 75 | + private function translate_data_field_recursive( array $sections, array &$options_values ) { |
|
| 76 | + foreach ( $sections as $key => $section ) { |
|
| 77 | + if ( 'fields' === $key ) { |
|
| 78 | + foreach ( $section as $field ) { |
|
| 79 | + if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) { |
|
| 80 | + $options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true ); |
|
| 81 | + } |
|
| 82 | + } |
|
| 83 | + } elseif ( is_array( $section ) && ! empty( $section ) ) { |
|
| 84 | + $this->translate_data_field_recursive( $section, $options_values ); |
|
| 85 | + } |
|
| 86 | + } |
|
| 87 | + } |
|
| 88 | + |
|
| 89 | + /** |
|
| 90 | + * Retrieves the options. |
|
| 91 | + */ |
|
| 92 | + public function get() { |
|
| 93 | + $core = $this->core(); |
|
| 94 | + |
|
| 95 | + $defaults = false; |
|
| 96 | + |
|
| 97 | + if ( ! empty( $core->defaults ) ) { |
|
| 98 | + $defaults = $core->defaults; |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + if ( empty( $core->args ) ) { |
|
| 102 | + return; |
|
| 103 | + } |
|
| 104 | + |
|
| 105 | + switch ( $core->args['database'] ) { |
|
| 106 | + case 'transient': |
|
| 107 | + $result = get_transient( $core->args['opt_name'] . '-transient' ); |
|
| 108 | + break; |
|
| 109 | + case 'theme_mods': |
|
| 110 | + $result = get_theme_mod( $core->args['opt_name'] . '-mods' ); |
|
| 111 | + break; |
|
| 112 | + case 'theme_mods_expanded': |
|
| 113 | + $result = get_theme_mods(); |
|
| 114 | + break; |
|
| 115 | + case 'network': |
|
| 116 | + $result = get_site_option( $core->args['opt_name'], array() ); |
|
| 117 | + break; |
|
| 118 | + default: |
|
| 119 | + $result = get_option( $core->args['opt_name'], array() ); |
|
| 120 | + |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + if ( ! is_array( $result ) ) { |
|
| 124 | + return; |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + if ( empty( $result ) && empty( $defaults ) ) { |
|
| 128 | + return; |
|
| 129 | + } |
|
| 130 | + |
|
| 131 | + if ( empty( $result ) && ! empty( $defaults ) ) { |
|
| 132 | + $results = $defaults; |
|
| 133 | + $this->set( $results ); |
|
| 134 | + } else { |
|
| 135 | + $core->options = $result; |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + // Don't iterate unnecessarily. |
|
| 139 | + if ( has_filter( 'wpml_object_id' ) ) { |
|
| 140 | + $this->translate_data_field_recursive( $core->sections, $core->options ); |
|
| 141 | + } |
|
| 142 | + |
|
| 143 | + /** |
|
| 144 | + * Action 'redux/options/{opt_name}/options' |
|
| 145 | + * |
|
| 146 | + * @param mixed $value option values |
|
| 147 | + */ |
|
| 148 | + |
|
| 149 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 150 | + $core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections ); |
|
| 151 | + |
|
| 152 | + // Get transient values. |
|
| 153 | + $core->transient_class->get(); |
|
| 154 | + |
|
| 155 | + // Set a global variable by the global_variable argument. |
|
| 156 | + $this->set_global_variable( $core ); |
|
| 157 | + } |
|
| 158 | + |
|
| 159 | + /** |
|
| 160 | + * ->set_options(); This is used to set an arbitrary option in the option array |
|
| 161 | + * |
|
| 162 | + * @since ReduxFramework 3.0.0 |
|
| 163 | + * |
|
| 164 | + * @param string|array $value the value of the option being added. |
|
| 165 | + */ |
|
| 166 | + public function set( $value = '' ) { |
|
| 167 | + $core = $this->core(); |
|
| 168 | + |
|
| 169 | + $core->transients['last_save'] = time(); |
|
| 170 | + |
|
| 171 | + if ( ! empty( $value ) ) { |
|
| 172 | + switch ( $core->args['database'] ) { |
|
| 173 | + case 'transient': |
|
| 174 | + set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] ); |
|
| 175 | + break; |
|
| 176 | + case 'theme_mods': |
|
| 177 | + set_theme_mod( $core->args['opt_name'] . '-mods', $value ); |
|
| 178 | + break; |
|
| 179 | + case 'theme_mods_expanded': |
|
| 180 | + foreach ( $value as $k => $v ) { |
|
| 181 | + set_theme_mod( $k, $v ); |
|
| 182 | + } |
|
| 183 | + break; |
|
| 184 | + case 'network': |
|
| 185 | + update_site_option( $core->args['opt_name'], $value ); |
|
| 186 | + break; |
|
| 187 | + default: |
|
| 188 | + update_option( $core->args['opt_name'], $value ); |
|
| 189 | + |
|
| 190 | + } |
|
| 191 | + |
|
| 192 | + // Store the changed values in the transient. |
|
| 193 | + if ( $value !== $core->options ) { |
|
| 194 | + foreach ( $value as $k => $v ) { |
|
| 195 | + if ( ! isset( $core->options[ $k ] ) ) { |
|
| 196 | + $core->options[ $k ] = ''; |
|
| 197 | + } elseif ( $v === $core->options[ $k ] ) { |
|
| 198 | + unset( $core->options[ $k ] ); |
|
| 199 | + } |
|
| 200 | + } |
|
| 201 | + |
|
| 202 | + $core->transients['changed_values'] = $core->options; |
|
| 203 | + } |
|
| 204 | + |
|
| 205 | + $core->options = $value; |
|
| 206 | + |
|
| 207 | + // Set a global variable by the global_variable argument. |
|
| 208 | + $this->set_global_variable( $core ); |
|
| 209 | + |
|
| 210 | + // Saving the transient values. |
|
| 211 | + $core->transient_class->set(); |
|
| 212 | + } |
|
| 213 | + } |
|
| 214 | + |
|
| 215 | + /** |
|
| 216 | + * Set a global variable by the global_variable argument |
|
| 217 | + * |
|
| 218 | + * @param null|ReduxFramework $core ReduxFramework core object. |
|
| 219 | + * |
|
| 220 | + * @return void (global was set) |
|
| 221 | + * @since 3.1.5 |
|
| 222 | + */ |
|
| 223 | + private function set_global_variable( ?ReduxFramework $core ): void { |
|
| 224 | + if ( ! empty( $core->args['global_variable'] ) ) { |
|
| 225 | + $options_global = $core->args['global_variable']; |
|
| 226 | + |
|
| 227 | + /** |
|
| 228 | + * Filter 'redux/options/{opt_name}/global_variable' |
|
| 229 | + * |
|
| 230 | + * @param array $value option value to set global_variable with |
|
| 231 | + */ |
|
| 232 | + |
|
| 233 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 234 | + $GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options ); |
|
| 235 | + } |
|
| 236 | + } |
|
| 237 | + |
|
| 238 | + /** |
|
| 239 | + * Register Option for use |
|
| 240 | + * |
|
| 241 | + * @return void |
|
| 242 | + * @throws ReflectionException Exception. |
|
| 243 | + * @since 1.0.0 |
|
| 244 | + * @access public |
|
| 245 | + */ |
|
| 246 | + public function register() { |
|
| 247 | + $core = $this->core(); |
|
| 248 | + |
|
| 249 | + if ( ! is_object( $core ) ) { |
|
| 250 | + return; |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + if ( true === $core->args['options_api'] ) { |
|
| 254 | + register_setting( |
|
| 255 | + $core->args['opt_name'] . '_group', |
|
| 256 | + $core->args['opt_name'], |
|
| 257 | + array( |
|
| 258 | + $this, |
|
| 259 | + 'validate_options', |
|
| 260 | + ) |
|
| 261 | + ); |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + if ( is_null( $core->sections ) ) { |
|
| 265 | + return; |
|
| 266 | + } |
|
| 267 | + |
|
| 268 | + if ( empty( $core->options_defaults ) ) { |
|
| 269 | + $core->options_defaults = $core->default_values(); |
|
| 270 | + } |
|
| 271 | + |
|
| 272 | + $run_update = false; |
|
| 273 | + |
|
| 274 | + foreach ( $core->sections as $k => $section ) { |
|
| 275 | + if ( isset( $section['type'] ) && 'divide' === $section['type'] ) { |
|
| 276 | + continue; |
|
| 277 | + } |
|
| 278 | + |
|
| 279 | + $display = true; |
|
| 280 | + |
|
| 281 | + if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 282 | + if ( isset( $section['panel'] ) && false === $section['panel'] ) { |
|
| 283 | + $display = false; |
|
| 284 | + } |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + /** |
|
| 288 | + * Filter 'redux/options/{opt_name}/section/{section.id}' |
|
| 289 | + * |
|
| 290 | + * @param array $section section configuration |
|
| 291 | + */ |
|
| 292 | + if ( isset( $section['id'] ) ) { |
|
| 293 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 294 | + $section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section ); |
|
| 295 | + } |
|
| 296 | + |
|
| 297 | + if ( empty( $section ) ) { |
|
| 298 | + unset( $core->sections[ $k ] ); |
|
| 299 | + continue; |
|
| 300 | + } |
|
| 301 | + |
|
| 302 | + if ( ! isset( $section['title'] ) ) { |
|
| 303 | + $section['title'] = ''; |
|
| 304 | + } |
|
| 305 | + |
|
| 306 | + if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) { |
|
| 307 | + $section['panel'] = false; |
|
| 308 | + $core->sections[ $k ] = $section; |
|
| 309 | + } |
|
| 310 | + |
|
| 311 | + $heading = $section['heading'] ?? $section['title']; |
|
| 312 | + |
|
| 313 | + if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) { |
|
| 314 | + if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) { |
|
| 315 | + $core->hidden_perm_sections[] = $section['title']; |
|
| 316 | + |
|
| 317 | + foreach ( $section['fields'] as $field_data ) { |
|
| 318 | + $field_type = $field_data['type']; |
|
| 319 | + |
|
| 320 | + if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) { |
|
| 321 | + $field_id = $field_data['id']; |
|
| 322 | + $default = $core->options_defaults[ $field_id ] ?? ''; |
|
| 323 | + $data = $core->options[ $field_id ] ?? $default; |
|
| 324 | + |
|
| 325 | + $this->hidden_perm_fields[ $field_id ] = $data; |
|
| 326 | + } |
|
| 327 | + } |
|
| 328 | + |
|
| 329 | + continue; |
|
| 330 | + } |
|
| 331 | + } |
|
| 332 | + |
|
| 333 | + if ( ! $display || ! function_exists( 'add_settings_section' ) ) { |
|
| 334 | + $this->no_panel_section[ $k ] = $section; |
|
| 335 | + } else { |
|
| 336 | + add_settings_section( |
|
| 337 | + $core->args['opt_name'] . $k . '_section', |
|
| 338 | + $heading, |
|
| 339 | + array( |
|
| 340 | + $core->render_class, |
|
| 341 | + 'section_desc', |
|
| 342 | + ), |
|
| 343 | + $core->args['opt_name'] . $k . '_section_group' |
|
| 344 | + ); |
|
| 345 | + } |
|
| 346 | + |
|
| 347 | + $section_ident = false; |
|
| 348 | + if ( isset( $section['fields'] ) ) { |
|
| 349 | + foreach ( $section['fields'] as $fieldk => $field ) { |
|
| 350 | + if ( ! isset( $field['type'] ) ) { |
|
| 351 | + continue; // You need a type! |
|
| 352 | + } |
|
| 353 | + |
|
| 354 | + if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) { |
|
| 355 | + $field['type'] = 'raw'; |
|
| 356 | + $field['content'] = $field['desc']; |
|
| 357 | + $field['desc'] = ''; |
|
| 358 | + $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 359 | + } elseif ( 'info' === $field['type'] ) { |
|
| 360 | + if ( ! isset( $field['full_width'] ) ) { |
|
| 361 | + $field['full_width'] = true; |
|
| 362 | + $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 363 | + } |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + if ( 'raw' === $field['type'] ) { |
|
| 367 | + if ( isset( $field['align'] ) ) { |
|
| 368 | + $field['full_width'] = ! $field['align']; |
|
| 369 | + unset( $field['align'] ); |
|
| 370 | + } elseif ( ! isset( $field['full_width'] ) ) { |
|
| 371 | + $field['full_width'] = true; |
|
| 372 | + } |
|
| 373 | + $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 374 | + } |
|
| 375 | + |
|
| 376 | + /** |
|
| 377 | + * Filter 'redux/options/{opt_name}/field/{field.id}' |
|
| 378 | + * |
|
| 379 | + * @param array $field field config |
|
| 380 | + */ |
|
| 381 | + |
|
| 382 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 383 | + $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field ); |
|
| 384 | + |
|
| 385 | + $core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array(); |
|
| 386 | + |
|
| 387 | + $core->field_sections[ $field['type'] ][ $field['id'] ] = $k; |
|
| 388 | + |
|
| 389 | + $display = true; |
|
| 390 | + |
|
| 391 | + if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 392 | + if ( isset( $field['panel'] ) && false === $field['panel'] ) { |
|
| 393 | + $display = false; |
|
| 394 | + } |
|
| 395 | + } |
|
| 396 | + if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) { |
|
| 397 | + $display = false; |
|
| 398 | + } |
|
| 399 | + |
|
| 400 | + if ( isset( $section['customizer'] ) ) { |
|
| 401 | + $field['customizer'] = $section['customizer']; |
|
| 402 | + $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 403 | + } |
|
| 404 | + |
|
| 405 | + if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) { |
|
| 406 | + if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) { |
|
| 407 | + $data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ]; |
|
| 408 | + |
|
| 409 | + $this->hidden_perm_fields[ $field['id'] ] = $data; |
|
| 410 | + |
|
| 411 | + continue; |
|
| 412 | + } |
|
| 413 | + } |
|
| 414 | + |
|
| 415 | + if ( ! isset( $field['id'] ) ) { |
|
| 416 | + echo '<br /><h3>No field ID is set.</h3><pre>'; |
|
| 417 | + |
|
| 418 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 419 | + print_r( $field ); |
|
| 420 | + |
|
| 421 | + echo '</pre><br />'; |
|
| 422 | + |
|
| 423 | + continue; |
|
| 424 | + } |
|
| 425 | + |
|
| 426 | + if ( isset( $field['type'] ) && 'section' === $field['type'] ) { |
|
| 427 | + if ( isset( $field['indent'] ) && true === $field['indent'] ) { |
|
| 428 | + $section_ident = true; |
|
| 429 | + } else { |
|
| 430 | + $section_ident = false; |
|
| 431 | + } |
|
| 432 | + } |
|
| 433 | + |
|
| 434 | + if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) { |
|
| 435 | + $field['indent'] = true; |
|
| 436 | + } |
|
| 437 | + |
|
| 438 | + $th = $core->render_class->get_header_html( $field ); |
|
| 439 | + |
|
| 440 | + $field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']'; |
|
| 441 | + |
|
| 442 | + // Set the default value if present. |
|
| 443 | + $core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? ''; |
|
| 444 | + |
|
| 445 | + // Set the defaults to the value if not present. |
|
| 446 | + $do_update = false; |
|
| 447 | + |
|
| 448 | + // Check fields for values in the default parameter. |
|
| 449 | + if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) { |
|
| 450 | + $core->options_defaults[ $field['id'] ] = $field['default']; |
|
| 451 | + $core->options[ $field['id'] ] = $field['default']; |
|
| 452 | + $do_update = true; |
|
| 453 | + |
|
| 454 | + // Check fields that hae no default value, but an option value with settings to |
|
| 455 | + // be saved by default. |
|
| 456 | + } elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) { |
|
| 457 | + |
|
| 458 | + // If a sorter field, check for options and save them as defaults. |
|
| 459 | + if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) { |
|
| 460 | + $core->options_defaults[ $field['id'] ] = $field['options']; |
|
| 461 | + $core->options[ $field['id'] ] = $field['options']; |
|
| 462 | + $do_update = true; |
|
| 463 | + } |
|
| 464 | + } |
|
| 465 | + |
|
| 466 | + // CORRECT URLS if media URLs are wrong, but attachment IDs are present. |
|
| 467 | + if ( 'media' === $field['type'] ) { |
|
| 468 | + if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) { |
|
| 469 | + $data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] ); |
|
| 470 | + |
|
| 471 | + if ( isset( $data ) && ! empty( $data ) ) { |
|
| 472 | + $core->options[ $field['id'] ]['url'] = $data; |
|
| 473 | + |
|
| 474 | + $data = wp_get_attachment_image_src( |
|
| 475 | + $core->options[ $field['id'] ]['id'], |
|
| 476 | + array( |
|
| 477 | + 150, |
|
| 478 | + 150, |
|
| 479 | + ) |
|
| 480 | + ); |
|
| 481 | + |
|
| 482 | + $core->options[ $field['id'] ]['thumbnail'] = $data[0]; |
|
| 483 | + $do_update = true; |
|
| 484 | + } |
|
| 485 | + } |
|
| 486 | + } |
|
| 487 | + |
|
| 488 | + if ( 'background' === $field['type'] ) { |
|
| 489 | + if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 490 | + $data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] ); |
|
| 491 | + |
|
| 492 | + if ( isset( $data ) && ! empty( $data ) ) { |
|
| 493 | + $core->options[ $field['id'] ]['background-image'] = $data; |
|
| 494 | + |
|
| 495 | + $data = wp_get_attachment_image_src( |
|
| 496 | + $core->options[ $field['id'] ]['media']['id'], |
|
| 497 | + array( |
|
| 498 | + 150, |
|
| 499 | + 150, |
|
| 500 | + ) |
|
| 501 | + ); |
|
| 502 | + |
|
| 503 | + $core->options[ $field['id'] ]['media']['thumbnail'] = $data[0]; |
|
| 504 | + $do_update = true; |
|
| 505 | + } |
|
| 506 | + } |
|
| 507 | + } |
|
| 508 | + |
|
| 509 | + if ( 'slides' === $field['type'] ) { |
|
| 510 | + if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) { |
|
| 511 | + foreach ( $core->options[ $field['id'] ] as $key => $val ) { |
|
| 512 | + $data = wp_get_attachment_url( $val['attachment_id'] ); |
|
| 513 | + |
|
| 514 | + if ( isset( $data ) && ! empty( $data ) ) { |
|
| 515 | + $core->options[ $field['id'] ][ $key ]['image'] = $data; |
|
| 516 | + |
|
| 517 | + $data = wp_get_attachment_image_src( |
|
| 518 | + $val['attachment_id'], |
|
| 519 | + array( |
|
| 520 | + 150, |
|
| 521 | + 150, |
|
| 522 | + ) |
|
| 523 | + ); |
|
| 524 | + |
|
| 525 | + $core->options[ $field['id'] ][ $key ]['thumb'] = $data[0]; |
|
| 526 | + $do_update = true; |
|
| 527 | + } |
|
| 528 | + } |
|
| 529 | + } |
|
| 530 | + } |
|
| 531 | + // END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present. |
|
| 532 | + if ( true === $do_update && ! isset( $core->never_save_to_db ) ) { |
|
| 533 | + if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to. |
|
| 534 | + $run_update = true; |
|
| 535 | + } |
|
| 536 | + } |
|
| 537 | + |
|
| 538 | + if ( ! isset( $field['class'] ) ) { // No errors, please. |
|
| 539 | + $field['class'] = ''; |
|
| 540 | + } |
|
| 541 | + |
|
| 542 | + /** |
|
| 543 | + * Filter 'redux/options/{opt_name}/field/{field.id}'. |
|
| 544 | + * |
|
| 545 | + * @param array $field field config |
|
| 546 | + */ |
|
| 547 | + |
|
| 548 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 549 | + $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field ); |
|
| 550 | + |
|
| 551 | + if ( empty( $field ) ) { |
|
| 552 | + unset( $core->sections[ $k ]['fields'][ $fieldk ] ); |
|
| 553 | + continue; |
|
| 554 | + } |
|
| 555 | + |
|
| 556 | + if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default. |
|
| 557 | + $field['class'] .= ' fold'; |
|
| 558 | + } |
|
| 559 | + |
|
| 560 | + if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on. |
|
| 561 | + $field['class'] .= ' fold-parent'; |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + if ( ! empty( $field['compiler'] ) ) { |
|
| 565 | + $field['class'] .= ' compiler'; |
|
| 566 | + $core->compiler_fields[ $field['id'] ] = 1; |
|
| 567 | + } |
|
| 568 | + |
|
| 569 | + if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) { |
|
| 570 | + $field['units'] = $field['unit']; |
|
| 571 | + unset( $field['unit'] ); |
|
| 572 | + } |
|
| 573 | + |
|
| 574 | + $core->sections[ $k ]['fields'][ $fieldk ] = $field; |
|
| 575 | + |
|
| 576 | + if ( isset( $core->args['display_source'] ) ) { |
|
| 577 | + // phpcs:ignore WordPress.PHP.DevelopmentFunctions |
|
| 578 | + $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>'; |
|
| 579 | + $th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>'; |
|
| 580 | + } |
|
| 581 | + |
|
| 582 | + /** |
|
| 583 | + * Action 'redux/options/{opt_name}/field/{field.type}/register' |
|
| 584 | + */ |
|
| 585 | + |
|
| 586 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 587 | + do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field ); |
|
| 588 | + |
|
| 589 | + $core->required_class->check_dependencies( $field ); |
|
| 590 | + $core->field_head[ $field['id'] ] = $th; |
|
| 591 | + |
|
| 592 | + if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) { |
|
| 593 | + $this->no_panel[] = $field['id']; |
|
| 594 | + } else { |
|
| 595 | + if ( isset( $field['disabled'] ) && $field['disabled'] ) { |
|
| 596 | + $field['class'] .= ' redux_disable_field'; |
|
| 597 | + } |
|
| 598 | + |
|
| 599 | + if ( isset( $field['hidden'] ) && $field['hidden'] ) { |
|
| 600 | + $field['class'] .= ' redux_hide_field'; |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + if ( true === $core->args['options_api'] ) { |
|
| 604 | + add_settings_field( |
|
| 605 | + "{$fieldk}_field", |
|
| 606 | + $th, |
|
| 607 | + array( |
|
| 608 | + $core->render_class, |
|
| 609 | + 'field_input', |
|
| 610 | + ), |
|
| 611 | + "{$core->args['opt_name']}{$k}_section_group", |
|
| 612 | + "{$core->args['opt_name']}{$k}_section", |
|
| 613 | + $field |
|
| 614 | + ); |
|
| 615 | + } |
|
| 616 | + } |
|
| 617 | + } |
|
| 618 | + } |
|
| 619 | + } |
|
| 620 | + |
|
| 621 | + /** |
|
| 622 | + * Action 'redux/options/{opt_name}/register' |
|
| 623 | + * |
|
| 624 | + * @param array $section Option sections |
|
| 625 | + */ |
|
| 626 | + |
|
| 627 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 628 | + do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections ); |
|
| 629 | + |
|
| 630 | + if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields. |
|
| 631 | + $this->set( $core->options ); |
|
| 632 | + } |
|
| 633 | + |
|
| 634 | + if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) { |
|
| 635 | + |
|
| 636 | + Redux_Core::$no_output = true; |
|
| 637 | + $temp = $core->args['output_variables_prefix']; |
|
| 638 | + |
|
| 639 | + // Allow the override of variable's prefix for use by SCSS or LESS. |
|
| 640 | + if ( isset( $core->args['compiler_output_variables_prefix'] ) ) { |
|
| 641 | + $core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix']; |
|
| 642 | + } |
|
| 643 | + $core->output_class->enqueue(); |
|
| 644 | + $core->args['output_variables_prefix'] = $temp; |
|
| 645 | + |
|
| 646 | + // phpcs:ignore WordPress.NamingConventions.ValidVariableName |
|
| 647 | + $compiler_css = $core->compilerCSS; |
|
| 648 | + |
|
| 649 | + /** |
|
| 650 | + * Action 'redux/options/{opt_name}/compiler' |
|
| 651 | + * |
|
| 652 | + * @param array $options Options. |
|
| 653 | + * @param string $css CSS that get sent to the compiler hook. |
|
| 654 | + * @param array $changed_values Changed values. |
|
| 655 | + * @param array $output_variables Output variables. |
|
| 656 | + */ |
|
| 657 | + |
|
| 658 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 659 | + do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables ); |
|
| 660 | + |
|
| 661 | + /** |
|
| 662 | + * Action 'redux/options/{opt_name}/compiler/advanced' |
|
| 663 | + * |
|
| 664 | + * @param object $redux ReduxFramework object. |
|
| 665 | + */ |
|
| 666 | + |
|
| 667 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 668 | + do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core ); |
|
| 669 | + |
|
| 670 | + unset( $core->transients['run_compiler'] ); |
|
| 671 | + $core->transient_class->set(); |
|
| 672 | + } |
|
| 673 | + } |
|
| 674 | + |
|
| 675 | + /** |
|
| 676 | + * Get default options into an array suitable for the settings API |
|
| 677 | + * |
|
| 678 | + * @since 1.0.0 |
|
| 679 | + * @access public |
|
| 680 | + * @return array $this->options_defaults |
|
| 681 | + */ |
|
| 682 | + public function default_values(): array { |
|
| 683 | + $core = $this->core(); |
|
| 684 | + |
|
| 685 | + if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) { |
|
| 686 | + $core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data ); |
|
| 687 | + } |
|
| 688 | + |
|
| 689 | + /** |
|
| 690 | + * Filter 'redux/options/{opt_name}/defaults' |
|
| 691 | + * |
|
| 692 | + * @param array $defaults option default values |
|
| 693 | + */ |
|
| 694 | + |
|
| 695 | + $core->transients['changed_values'] = $core->transients['changed_values'] ?? array(); |
|
| 696 | + |
|
| 697 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 698 | + $core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] ); |
|
| 699 | + |
|
| 700 | + return $core->options_defaults; |
|
| 701 | + } |
|
| 702 | + |
|
| 703 | + /** |
|
| 704 | + * Validate the Options before insertion |
|
| 705 | + * |
|
| 706 | + * @param array $plugin_options The option array. |
|
| 707 | + * |
|
| 708 | + * @return array|mixed|string |
|
| 709 | + * @since 3.0.0 |
|
| 710 | + * @access public |
|
| 711 | + */ |
|
| 712 | + public function validate_options( array $plugin_options ) { |
|
| 713 | + $core = $this->core(); |
|
| 714 | + |
|
| 715 | + if ( true === Redux_Core::$validation_ran ) { |
|
| 716 | + return $plugin_options; |
|
| 717 | + } |
|
| 718 | + |
|
| 719 | + Redux_Core::$validation_ran = true; |
|
| 720 | + |
|
| 721 | + // Save the values not in the panel. |
|
| 722 | + if ( isset( $plugin_options['redux-no_panel'] ) ) { |
|
| 723 | + $keys = explode( '|', $plugin_options['redux-no_panel'] ); |
|
| 724 | + foreach ( $keys as $key ) { |
|
| 725 | + $plugin_options[ $key ] = $core->options[ $key ]; |
|
| 726 | + } |
|
| 727 | + if ( isset( $plugin_options['redux-no_panel'] ) ) { |
|
| 728 | + unset( $plugin_options['redux-no_panel'] ); |
|
| 729 | + } |
|
| 730 | + } |
|
| 731 | + |
|
| 732 | + if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) { |
|
| 733 | + foreach ( $this->hidden_perm_fields as $id => $data ) { |
|
| 734 | + $plugin_options[ $id ] = $data; |
|
| 735 | + } |
|
| 736 | + } |
|
| 737 | + |
|
| 738 | + if ( $plugin_options === $core->options ) { |
|
| 739 | + return $plugin_options; |
|
| 740 | + } |
|
| 741 | + |
|
| 742 | + $time = time(); |
|
| 743 | + |
|
| 744 | + // Sets last saved time. |
|
| 745 | + $core->transients['last_save'] = $time; |
|
| 746 | + |
|
| 747 | + $imported_options = array(); |
|
| 748 | + |
|
| 749 | + if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) { |
|
| 750 | + $imported_options = json_decode( $plugin_options['import_code'], true ); |
|
| 751 | + } |
|
| 752 | + |
|
| 753 | + // Import. |
|
| 754 | + $core->transients['last_save_mode'] = 'import'; // Last save mode. |
|
| 755 | + $core->transients['last_compiler'] = $time; |
|
| 756 | + $core->transients['last_import'] = $time; |
|
| 757 | + $core->transients['run_compiler'] = 1; |
|
| 758 | + |
|
| 759 | + if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) { |
|
| 760 | + $core->transients['changed_values'] = array(); |
|
| 761 | + foreach ( $plugin_options as $key => $value ) { |
|
| 762 | + if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) { |
|
| 763 | + $plugin_options[ $key ] = $value; |
|
| 764 | + $core->transients['changed_values'][ $key ] = $value; |
|
| 765 | + } |
|
| 766 | + } |
|
| 767 | + |
|
| 768 | + /** |
|
| 769 | + * Action 'redux/options/{opt_name}/import'. |
|
| 770 | + * |
|
| 771 | + * @param &array [&$plugin_options, redux_options] |
|
| 772 | + */ |
|
| 773 | + |
|
| 774 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 775 | + do_action_ref_array( |
|
| 776 | + "redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 777 | + array( |
|
| 778 | + &$plugin_options, |
|
| 779 | + $imported_options, |
|
| 780 | + $core->transients['changed_values'], |
|
| 781 | + ) |
|
| 782 | + ); |
|
| 783 | + |
|
| 784 | + setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' ); |
|
| 785 | + $_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1; |
|
| 786 | + |
|
| 787 | + unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] ); |
|
| 788 | + if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) { |
|
| 789 | + $this->set( $plugin_options ); |
|
| 790 | + |
|
| 791 | + return null; |
|
| 792 | + } |
|
| 793 | + |
|
| 794 | + $plugin_options = wp_parse_args( $imported_options, $plugin_options ); |
|
| 795 | + |
|
| 796 | + $core->transient_class->set(); |
|
| 797 | + |
|
| 798 | + return $plugin_options; |
|
| 799 | + } |
|
| 800 | + |
|
| 801 | + // Reset all to defaults. |
|
| 802 | + if ( ! empty( $plugin_options['defaults'] ) ) { |
|
| 803 | + if ( empty( $core->options_defaults ) ) { |
|
| 804 | + $core->options_defaults = $core->_default_values(); |
|
| 805 | + } |
|
| 806 | + |
|
| 807 | + /** |
|
| 808 | + * Filter: 'redux/validate/{opt_name}/defaults'. |
|
| 809 | + * |
|
| 810 | + * @param &array [ $this->options_defaults, $plugin_options] |
|
| 811 | + */ |
|
| 812 | + |
|
| 813 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 814 | + $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults ); |
|
| 815 | + |
|
| 816 | + $core->transients['changed_values'] = array(); |
|
| 817 | + |
|
| 818 | + if ( empty( $core->options ) ) { |
|
| 819 | + $core->options = $core->options_defaults; |
|
| 820 | + } |
|
| 821 | + |
|
| 822 | + foreach ( $core->options as $key => $value ) { |
|
| 823 | + if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 824 | + $core->transients['changed_values'][ $key ] = $value; |
|
| 825 | + } |
|
| 826 | + } |
|
| 827 | + |
|
| 828 | + $core->transients['run_compiler'] = 1; |
|
| 829 | + $core->transients['last_save_mode'] = 'defaults'; // Last save mode. |
|
| 830 | + |
|
| 831 | + $core->transient_class->set(); |
|
| 832 | + |
|
| 833 | + return $plugin_options; |
|
| 834 | + } |
|
| 835 | + |
|
| 836 | + // Section reset to default. |
|
| 837 | + if ( ! empty( $plugin_options['defaults-section'] ) ) { |
|
| 838 | + if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) { |
|
| 839 | + if ( empty( $core->options_defaults ) ) { |
|
| 840 | + $core->options_defaults = $core->_default_values(); |
|
| 841 | + } |
|
| 842 | + |
|
| 843 | + foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) { |
|
| 844 | + if ( 'tabbed' === $field['type'] ) { |
|
| 845 | + if ( ! empty( $field['tabs'] ) ) { |
|
| 846 | + foreach ( $field['tabs'] as $val ) { |
|
| 847 | + if ( ! empty( $val['fields'] ) ) { |
|
| 848 | + foreach ( $val['fields'] as $f ) { |
|
| 849 | + if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 850 | + $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 851 | + } else { |
|
| 852 | + $plugin_options[ $f['id'] ] = ''; |
|
| 853 | + } |
|
| 854 | + } |
|
| 855 | + } |
|
| 856 | + } |
|
| 857 | + } |
|
| 858 | + } elseif ( 'repeater' === $field['type'] ) { |
|
| 859 | + if ( ! empty( $field['fields'] ) ) { |
|
| 860 | + foreach ( $field['fields'] as $f ) { |
|
| 861 | + if ( isset( $core->options_defaults[ $f['id'] ] ) ) { |
|
| 862 | + $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ]; |
|
| 863 | + } else { |
|
| 864 | + $plugin_options[ $f['id'] ] = ''; |
|
| 865 | + } |
|
| 866 | + } |
|
| 867 | + } |
|
| 868 | + } else { |
|
| 869 | + if ( isset( $core->options_defaults[ $field['id'] ] ) ) { |
|
| 870 | + $plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ]; |
|
| 871 | + } else { |
|
| 872 | + $plugin_options[ $field['id'] ] = ''; |
|
| 873 | + } |
|
| 874 | + } |
|
| 875 | + |
|
| 876 | + if ( isset( $field['compiler'] ) ) { |
|
| 877 | + $compiler = true; |
|
| 878 | + } |
|
| 879 | + } |
|
| 880 | + |
|
| 881 | + /** |
|
| 882 | + * Filter: 'redux/validate/{opt_name}/defaults_section'. |
|
| 883 | + * |
|
| 884 | + * @param &array [ $this->options_defaults, $plugin_options] |
|
| 885 | + */ |
|
| 886 | + |
|
| 887 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 888 | + $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options ); |
|
| 889 | + } |
|
| 890 | + |
|
| 891 | + $core->transients['changed_values'] = array(); |
|
| 892 | + |
|
| 893 | + foreach ( $core->options as $key => $value ) { |
|
| 894 | + if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 895 | + $core->transients['changed_values'][ $key ] = $value; |
|
| 896 | + } |
|
| 897 | + } |
|
| 898 | + |
|
| 899 | + if ( isset( $compiler ) ) { |
|
| 900 | + $core->transients['last_compiler'] = $time; |
|
| 901 | + $core->transients['run_compiler'] = 1; |
|
| 902 | + } |
|
| 903 | + |
|
| 904 | + $core->transients['last_save_mode'] = 'defaults_section'; // Last save mode. |
|
| 905 | + |
|
| 906 | + unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); |
|
| 907 | + |
|
| 908 | + $core->transient_class->set(); |
|
| 909 | + |
|
| 910 | + return $plugin_options; |
|
| 911 | + } |
|
| 912 | + |
|
| 913 | + $core->transients['last_save_mode'] = 'normal'; // Last save mode. |
|
| 914 | + |
|
| 915 | + /** |
|
| 916 | + * Filter: 'redux/validate/{opt_name}/before_validation' |
|
| 917 | + * |
|
| 918 | + * @param &array [&$plugin_options, redux_options] |
|
| 919 | + */ |
|
| 920 | + |
|
| 921 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 922 | + $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options ); |
|
| 923 | + |
|
| 924 | + // Validate fields (if needed). |
|
| 925 | + $plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections ); |
|
| 926 | + |
|
| 927 | + // Sanitize options, if needed. |
|
| 928 | + $plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections ); |
|
| 929 | + |
|
| 930 | + if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) { |
|
| 931 | + $core->transients['notices'] = array( |
|
| 932 | + 'errors' => $core->errors, |
|
| 933 | + 'warnings' => $core->warnings, |
|
| 934 | + 'sanitize' => $core->sanitize, |
|
| 935 | + ); |
|
| 936 | + } |
|
| 937 | + |
|
| 938 | + if ( ! isset( $core->transients['changed_values'] ) ) { |
|
| 939 | + $core->transients['changed_values'] = array(); |
|
| 940 | + } |
|
| 941 | + |
|
| 942 | + /** |
|
| 943 | + * Action 'redux/options/{opt_name}/validate' |
|
| 944 | + * |
|
| 945 | + * @param &array [&$plugin_options, redux_options] |
|
| 946 | + */ |
|
| 947 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 948 | + do_action_ref_array( |
|
| 949 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 950 | + "redux/options/{$core->args['opt_name']}/validate", |
|
| 951 | + array( |
|
| 952 | + &$plugin_options, |
|
| 953 | + $core->options, |
|
| 954 | + $core->transients['changed_values'], |
|
| 955 | + ) |
|
| 956 | + ); |
|
| 957 | + |
|
| 958 | + if ( ! empty( $plugin_options['compiler'] ) ) { |
|
| 959 | + unset( $plugin_options['compiler'] ); |
|
| 960 | + |
|
| 961 | + $core->transients['last_compiler'] = $time; |
|
| 962 | + $core->transients['run_compiler'] = 1; |
|
| 963 | + } |
|
| 964 | + |
|
| 965 | + $core->transients['changed_values'] = array(); // Changed values since last save. |
|
| 966 | + |
|
| 967 | + if ( ! empty( $core->options ) ) { |
|
| 968 | + foreach ( $core->options as $key => $value ) { |
|
| 969 | + if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) { |
|
| 970 | + $core->transients['changed_values'][ $key ] = $value; |
|
| 971 | + } |
|
| 972 | + } |
|
| 973 | + } |
|
| 974 | + |
|
| 975 | + unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] ); |
|
| 976 | + if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) { |
|
| 977 | + $core->set( $core->args['opt_name'], $plugin_options ); |
|
| 978 | + return null; |
|
| 979 | + } |
|
| 980 | + |
|
| 981 | + if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) { |
|
| 982 | + $w3_inst = w3_instance( 'W3_ObjectCache' ); |
|
| 983 | + $w3 = $w3_inst->instance(); |
|
| 984 | + $key = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' ); |
|
| 985 | + $w3->delete( $key, 'transient', true ); |
|
| 986 | + } |
|
| 987 | + |
|
| 988 | + $core->transient_class->set(); |
|
| 989 | + |
|
| 990 | + return $plugin_options; |
|
| 991 | + } |
|
| 992 | + |
|
| 993 | + /** |
|
| 994 | + * ->get_default(); This is used to return the default value if default_show is set. |
|
| 995 | + * |
|
| 996 | + * @param string $opt_name The option name to return. |
|
| 997 | + * @param mixed $defaults (null) The value to return if default not set. |
|
| 998 | + * |
|
| 999 | + * @return mixed $default |
|
| 1000 | + * @since 1.0.1 |
|
| 1001 | + * @access public |
|
| 1002 | + */ |
|
| 1003 | + public function get_default( string $opt_name, $defaults = null ) { |
|
| 1004 | + if ( true === $this->args['default_show'] ) { |
|
| 1005 | + |
|
| 1006 | + if ( empty( $this->options_defaults ) ) { |
|
| 1007 | + $this->default_values(); // fill cache. |
|
| 1008 | + } |
|
| 1009 | + |
|
| 1010 | + return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults; |
|
| 1011 | + } |
|
| 1012 | + |
|
| 1013 | + return ''; |
|
| 1014 | + } |
|
| 1015 | + |
|
| 1016 | + /** |
|
| 1017 | + * Get the default value for an option |
|
| 1018 | + * |
|
| 1019 | + * @param string $key The option's ID. |
|
| 1020 | + * @param string $array_key The key of the default's array. |
|
| 1021 | + * |
|
| 1022 | + * @return mixed |
|
| 1023 | + * @since 3.3.6 |
|
| 1024 | + * @access public |
|
| 1025 | + */ |
|
| 1026 | + public function get_default_value( string $key, $array_key = false ) { |
|
| 1027 | + if ( empty( $this->options_defaults ) ) { |
|
| 1028 | + $this->options_defaults = $this->default_values(); |
|
| 1029 | + } |
|
| 1030 | + |
|
| 1031 | + $defaults = $this->options_defaults; |
|
| 1032 | + $value = ''; |
|
| 1033 | + |
|
| 1034 | + if ( isset( $defaults[ $key ] ) ) { |
|
| 1035 | + if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) { |
|
| 1036 | + $value = $defaults[ $key ][ $array_key ]; |
|
| 1037 | + } else { |
|
| 1038 | + $value = $defaults[ $key ]; |
|
| 1039 | + } |
|
| 1040 | + } |
|
| 1041 | + |
|
| 1042 | + return $value; |
|
| 1043 | + } |
|
| 1044 | + } |
|
| 1045 | 1045 | } |
@@ -11,620 +11,620 @@ |
||
| 11 | 11 | |
| 12 | 12 | if ( ! class_exists( 'Redux_Core', false ) ) { |
| 13 | 13 | |
| 14 | - /** |
|
| 15 | - * Class Redux_Core |
|
| 16 | - */ |
|
| 17 | - class Redux_Core { |
|
| 18 | - |
|
| 19 | - /** |
|
| 20 | - * Class instance. |
|
| 21 | - * |
|
| 22 | - * @var null|Redux_Core |
|
| 23 | - */ |
|
| 24 | - public static ?Redux_Core $instance = null; |
|
| 25 | - |
|
| 26 | - /** |
|
| 27 | - * Project version |
|
| 28 | - * |
|
| 29 | - * @var string |
|
| 30 | - */ |
|
| 31 | - public static string $version; |
|
| 32 | - |
|
| 33 | - /** |
|
| 34 | - * Project directory. |
|
| 35 | - * |
|
| 36 | - * @var string. |
|
| 37 | - */ |
|
| 38 | - public static string $dir; |
|
| 39 | - |
|
| 40 | - /** |
|
| 41 | - * Project URL. |
|
| 42 | - * |
|
| 43 | - * @var string. |
|
| 44 | - */ |
|
| 45 | - public static string $url; |
|
| 46 | - |
|
| 47 | - /** |
|
| 48 | - * Base directory path. |
|
| 49 | - * |
|
| 50 | - * @var string |
|
| 51 | - */ |
|
| 52 | - public static string $redux_path; |
|
| 53 | - |
|
| 54 | - /** |
|
| 55 | - * Absolute direction path to WordPress upload directory. |
|
| 56 | - * |
|
| 57 | - * @var string |
|
| 58 | - */ |
|
| 59 | - public static string $upload_dir = ''; |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * Full URL to WordPress upload directory. |
|
| 63 | - * |
|
| 64 | - * @var null|string |
|
| 65 | - */ |
|
| 66 | - public static ?string $upload_url = ''; |
|
| 67 | - |
|
| 68 | - /** |
|
| 69 | - * Set when Redux is run as a plugin. |
|
| 70 | - * |
|
| 71 | - * @var bool |
|
| 72 | - */ |
|
| 73 | - public static bool $is_plugin = true; |
|
| 74 | - |
|
| 75 | - /** |
|
| 76 | - * Indicated in_theme or in_plugin. |
|
| 77 | - * |
|
| 78 | - * @var string |
|
| 79 | - */ |
|
| 80 | - public static string $installed = ''; |
|
| 81 | - |
|
| 82 | - /** |
|
| 83 | - * Set when Redux is run as a plugin. |
|
| 84 | - * |
|
| 85 | - * @var bool |
|
| 86 | - */ |
|
| 87 | - public static bool $as_plugin = false; |
|
| 88 | - |
|
| 89 | - /** |
|
| 90 | - * Set when Redux is embedded within a theme. |
|
| 91 | - * |
|
| 92 | - * @var bool |
|
| 93 | - */ |
|
| 94 | - public static bool $in_theme = false; |
|
| 95 | - |
|
| 96 | - /** |
|
| 97 | - * Pointer to an updated Google fonts array. |
|
| 98 | - * |
|
| 99 | - * @var array|null |
|
| 100 | - */ |
|
| 101 | - public static ?array $updated_google_fonts = array(); |
|
| 102 | - |
|
| 103 | - /** |
|
| 104 | - * List of files calling Redux. |
|
| 105 | - * |
|
| 106 | - * @var array|null |
|
| 107 | - */ |
|
| 108 | - public static ?array $callers = array(); |
|
| 109 | - |
|
| 110 | - /** |
|
| 111 | - * Pointer to _SERVER global. |
|
| 112 | - * |
|
| 113 | - * @var array|null |
|
| 114 | - */ |
|
| 115 | - public static ?array $server = array(); |
|
| 116 | - |
|
| 117 | - /** |
|
| 118 | - * Field folding information for localization. |
|
| 119 | - * |
|
| 120 | - * @var null|array |
|
| 121 | - */ |
|
| 122 | - public static ?array $required = array(); |
|
| 123 | - |
|
| 124 | - /** |
|
| 125 | - * Field child-folding information for localization. |
|
| 126 | - * |
|
| 127 | - * @var null|array |
|
| 128 | - */ |
|
| 129 | - public static ?array $required_child = array(); |
|
| 130 | - |
|
| 131 | - /** |
|
| 132 | - * Array of fields to be folded. |
|
| 133 | - * |
|
| 134 | - * @var array|null |
|
| 135 | - */ |
|
| 136 | - public static ?array $folds = array(); |
|
| 137 | - |
|
| 138 | - /** |
|
| 139 | - * Array of fields that didn't pass the fold dependency test and are hidden. |
|
| 140 | - * |
|
| 141 | - * @var null|array |
|
| 142 | - */ |
|
| 143 | - public static ?array $fields_hidden = array(); |
|
| 144 | - |
|
| 145 | - /** |
|
| 146 | - * Values to generate google font CSS. |
|
| 147 | - * |
|
| 148 | - * @var null|array |
|
| 149 | - */ |
|
| 150 | - public static ?array $typography = array(); |
|
| 151 | - |
|
| 152 | - /** |
|
| 153 | - * Validation ran flag. |
|
| 154 | - * |
|
| 155 | - * @var bool |
|
| 156 | - */ |
|
| 157 | - public static bool $validation_ran = false; |
|
| 158 | - |
|
| 159 | - /** |
|
| 160 | - * No output flag. |
|
| 161 | - * |
|
| 162 | - * @var bool |
|
| 163 | - */ |
|
| 164 | - public static bool $no_output = false; |
|
| 165 | - |
|
| 166 | - /** |
|
| 167 | - * Array of fonts used by the panel for localization. |
|
| 168 | - * |
|
| 169 | - * @var null|array |
|
| 170 | - */ |
|
| 171 | - public static ?array $fonts = array(); |
|
| 172 | - |
|
| 173 | - /** |
|
| 174 | - * Array of Google fonts used by the panel for localization. |
|
| 175 | - * |
|
| 176 | - * @var null|array |
|
| 177 | - */ |
|
| 178 | - public static ?array $google_array = array(); |
|
| 179 | - |
|
| 180 | - /** |
|
| 181 | - * Array of various font groups used within the typography field. |
|
| 182 | - * |
|
| 183 | - * @var null|array |
|
| 184 | - */ |
|
| 185 | - public static ?array $font_groups = array(); |
|
| 186 | - |
|
| 187 | - /** |
|
| 188 | - * File system object used for I/O file operations. Done the WordPress way. |
|
| 189 | - * |
|
| 190 | - * @var null|object |
|
| 191 | - */ |
|
| 192 | - public static ?object $filesystem; |
|
| 193 | - |
|
| 194 | - /** |
|
| 195 | - * Pointer to the third party fixes class. |
|
| 196 | - * |
|
| 197 | - * @var Redux_ThirdParty_Fixes |
|
| 198 | - */ |
|
| 199 | - public static Redux_ThirdParty_Fixes $third_party_fixes; |
|
| 200 | - |
|
| 201 | - /** |
|
| 202 | - * Redux Welcome screen object. |
|
| 203 | - * |
|
| 204 | - * @var Redux_Welcome |
|
| 205 | - */ |
|
| 206 | - public static Redux_Welcome $welcome; |
|
| 207 | - |
|
| 208 | - /** |
|
| 209 | - * Creates instance of class. |
|
| 210 | - * |
|
| 211 | - * @return Redux_Core |
|
| 212 | - * @throws Exception Comment. |
|
| 213 | - */ |
|
| 214 | - public static function instance(): ?Redux_Core { |
|
| 215 | - if ( ! self::$instance ) { |
|
| 216 | - self::$instance = new self(); |
|
| 217 | - |
|
| 218 | - self::$instance->includes(); |
|
| 219 | - self::$instance->init(); |
|
| 220 | - self::$instance->hooks(); |
|
| 221 | - |
|
| 222 | - add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) ); |
|
| 223 | - } |
|
| 224 | - |
|
| 225 | - return self::$instance; |
|
| 226 | - } |
|
| 227 | - |
|
| 228 | - /** |
|
| 229 | - * Things to run after pluggable.php had loaded. |
|
| 230 | - */ |
|
| 231 | - public static function plugins_loaded() {} |
|
| 232 | - |
|
| 233 | - /** |
|
| 234 | - * Class init. |
|
| 235 | - */ |
|
| 236 | - private function init() { |
|
| 237 | - self::$server = array( |
|
| 238 | - 'SERVER_SOFTWARE' => '', |
|
| 239 | - 'REMOTE_ADDR' => Redux_Helpers::is_local_host() ? '127.0.0.1' : '', |
|
| 240 | - 'HTTP_USER_AGENT' => '', |
|
| 241 | - 'HTTP_HOST' => '', |
|
| 242 | - 'REQUEST_URI' => '', |
|
| 243 | - ); |
|
| 244 | - |
|
| 245 | - // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase |
|
| 246 | - if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) { |
|
| 247 | - self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ); |
|
| 248 | - } |
|
| 249 | - if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { |
|
| 250 | - self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); |
|
| 251 | - } |
|
| 252 | - if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { |
|
| 253 | - self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); |
|
| 254 | - } |
|
| 255 | - if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { |
|
| 256 | - self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ); |
|
| 257 | - } |
|
| 258 | - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { |
|
| 259 | - self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); |
|
| 260 | - } |
|
| 261 | - |
|
| 262 | - // phpcs:enable |
|
| 263 | - |
|
| 264 | - self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) ); |
|
| 265 | - |
|
| 266 | - Redux_Functions_Ex::generator(); |
|
| 267 | - |
|
| 268 | - if ( defined( 'REDUX_PLUGIN_FILE' ) ) { |
|
| 269 | - $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE ); |
|
| 270 | - } |
|
| 271 | - |
|
| 272 | - $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ ); |
|
| 273 | - |
|
| 274 | - if ( false !== $plugin_info ) { |
|
| 275 | - self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin'; |
|
| 276 | - self::$is_plugin = class_exists( 'Redux_Framework_Plugin' ); |
|
| 277 | - self::$as_plugin = true; |
|
| 278 | - self::$url = trailingslashit( dirname( $plugin_info['url'] ) ); |
|
| 279 | - } else { |
|
| 280 | - $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ ); |
|
| 281 | - if ( false !== $theme_info ) { |
|
| 282 | - self::$url = trailingslashit( dirname( $theme_info['url'] ) ); |
|
| 283 | - self::$in_theme = true; |
|
| 284 | - self::$installed = 'in_theme'; |
|
| 285 | - } |
|
| 286 | - } |
|
| 287 | - |
|
| 288 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 289 | - self::$url = apply_filters( 'redux/url', self::$url ); |
|
| 290 | - |
|
| 291 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 292 | - self::$dir = apply_filters( 'redux/dir', self::$dir ); |
|
| 293 | - |
|
| 294 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 295 | - self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin ); |
|
| 296 | - |
|
| 297 | - if ( ! function_exists( 'current_time' ) ) { |
|
| 298 | - require_once ABSPATH . '/wp-includes/functions.php'; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - $upload_dir = wp_upload_dir(); |
|
| 302 | - self::$upload_dir = $upload_dir['basedir'] . '/redux/'; |
|
| 303 | - self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' ); |
|
| 304 | - |
|
| 305 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | - self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir ); |
|
| 307 | - |
|
| 308 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 309 | - self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url ); |
|
| 310 | - } |
|
| 311 | - |
|
| 312 | - /** |
|
| 313 | - * Code to execute on a framework __construct. |
|
| 314 | - * |
|
| 315 | - * @param ReduxFramework $redux Pointer to ReduxFramework object. |
|
| 316 | - */ |
|
| 317 | - public static function core_construct( ReduxFramework $redux ) { |
|
| 318 | - self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux ); |
|
| 319 | - |
|
| 320 | - Redux_ThemeCheck::get_instance(); |
|
| 321 | - } |
|
| 322 | - |
|
| 323 | - /** |
|
| 324 | - * Autoregister run. |
|
| 325 | - * |
|
| 326 | - * @throws Exception Comment. |
|
| 327 | - */ |
|
| 328 | - private function includes() { |
|
| 329 | - if ( is_admin() ) { |
|
| 330 | - if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) { |
|
| 331 | - echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>'; |
|
| 332 | - } |
|
| 333 | - } |
|
| 334 | - |
|
| 335 | - require_once __DIR__ . '/inc/classes/class-redux-path.php'; |
|
| 336 | - require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php'; |
|
| 337 | - require_once __DIR__ . '/inc/classes/class-redux-helpers.php'; |
|
| 338 | - require_once __DIR__ . '/inc/classes/class-redux-instances.php'; |
|
| 339 | - |
|
| 340 | - Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' ); |
|
| 341 | - Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' ); |
|
| 342 | - |
|
| 343 | - spl_autoload_register( array( $this, 'register_classes' ) ); |
|
| 344 | - |
|
| 345 | - self::$welcome = new Redux_Welcome(); |
|
| 346 | - |
|
| 347 | - add_filter( 'debug_information', array( $this, 'add_debug_info' ) ); |
|
| 348 | - } |
|
| 349 | - |
|
| 350 | - /** |
|
| 351 | - * Add debug info for the WP Site Health screen. |
|
| 352 | - * |
|
| 353 | - * @param array $debug_info Debug data. |
|
| 354 | - * |
|
| 355 | - * @return array |
|
| 356 | - * @throws ReflectionException Exception. |
|
| 357 | - */ |
|
| 358 | - public function add_debug_info( array $debug_info ): array { |
|
| 359 | - |
|
| 360 | - // Get browser data. |
|
| 361 | - if ( ! class_exists( 'ReduxBrowser' ) ) { |
|
| 362 | - require_once self::$dir . 'inc/lib/browser.php'; |
|
| 363 | - } |
|
| 364 | - |
|
| 365 | - $browser = new ReduxBrowser(); |
|
| 366 | - |
|
| 367 | - $browser_data = array( |
|
| 368 | - 'Agent' => $browser->getUserAgent(), |
|
| 369 | - 'Browser' => $browser->getBrowser(), |
|
| 370 | - 'Version' => $browser->getVersion(), |
|
| 371 | - 'Platform' => $browser->getPlatform(), |
|
| 372 | - ); |
|
| 373 | - |
|
| 374 | - // Set Redux dir permission results to Site Health screen. |
|
| 375 | - $debug_info['wp-filesystem']['fields'][] = array( |
|
| 376 | - 'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ), |
|
| 377 | - 'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable', |
|
| 378 | - ); |
|
| 379 | - |
|
| 380 | - // Set Redux plugin results to Site Health screen. |
|
| 381 | - $debug_info['redux-framework'] = array( |
|
| 382 | - 'label' => esc_html__( 'Redux Framework', 'redux-framework' ), |
|
| 383 | - 'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ), |
|
| 384 | - 'fields' => array( |
|
| 385 | - 'version' => array( |
|
| 386 | - 'label' => esc_html__( 'Version', 'redux-framework' ), |
|
| 387 | - 'value' => self::$version, |
|
| 388 | - ), |
|
| 389 | - 'installation' => array( |
|
| 390 | - 'label' => esc_html__( 'Installation', 'redux-framework' ), |
|
| 391 | - 'value' => self::$installed, |
|
| 392 | - ), |
|
| 393 | - 'data directory' => array( |
|
| 394 | - 'label' => esc_html__( 'Data directory', 'redux-framework' ), |
|
| 395 | - 'value' => self::$dir, |
|
| 396 | - ), |
|
| 397 | - 'browser' => array( |
|
| 398 | - 'label' => esc_html__( 'Browser', 'redux-framework' ), |
|
| 399 | - 'value' => $browser_data, |
|
| 400 | - ), |
|
| 401 | - ), |
|
| 402 | - ); |
|
| 403 | - |
|
| 404 | - $redux = Redux::all_instances(); |
|
| 405 | - |
|
| 406 | - $extensions = array(); |
|
| 407 | - |
|
| 408 | - if ( ! empty( $redux ) && is_array( $redux ) ) { |
|
| 409 | - foreach ( $redux as $inst => $data ) { |
|
| 410 | - Redux::init( $inst ); |
|
| 411 | - |
|
| 412 | - $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) ); |
|
| 413 | - $args = $data->args; |
|
| 414 | - |
|
| 415 | - $ext = Redux::get_extensions( $inst ); |
|
| 416 | - if ( ! empty( $ext ) && is_array( $ext ) ) { |
|
| 417 | - ksort( $ext ); |
|
| 418 | - |
|
| 419 | - foreach ( $ext as $name => $arr ) { |
|
| 420 | - $ver = $arr['version']; |
|
| 421 | - |
|
| 422 | - $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
|
| 423 | - |
|
| 424 | - $extensions[ $ex ] = esc_html( $ver ); |
|
| 425 | - } |
|
| 426 | - } |
|
| 427 | - |
|
| 428 | - // Output Redux instances. |
|
| 429 | - $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 430 | - // translators: %s = Instance name. |
|
| 431 | - 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
|
| 432 | - // translators: %s = Instance name w/ HTML. |
|
| 433 | - 'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ), |
|
| 434 | - 'fields' => array( |
|
| 435 | - 'opt_name' => array( |
|
| 436 | - 'label' => esc_html( 'opt_name' ), |
|
| 437 | - 'value' => $args['opt_name'], |
|
| 438 | - ), |
|
| 439 | - 'global_variable' => array( |
|
| 440 | - 'label' => esc_html( 'global_variable' ), |
|
| 441 | - 'value' => $args['global_variable'], |
|
| 442 | - ), |
|
| 443 | - 'dev_mode' => array( |
|
| 444 | - 'label' => esc_html( 'dev_mode' ), |
|
| 445 | - 'value' => $args['dev_mode'] ? 'true' : 'false', |
|
| 446 | - ), |
|
| 447 | - 'ajax_save' => array( |
|
| 448 | - 'label' => esc_html( 'ajax_save' ), |
|
| 449 | - 'value' => $args['ajax_save'] ? 'true' : 'false', |
|
| 450 | - ), |
|
| 451 | - 'page_slug' => array( |
|
| 452 | - 'label' => esc_html( 'page_slug' ), |
|
| 453 | - 'value' => $args['page_slug'], |
|
| 454 | - ), |
|
| 455 | - 'page_permissions' => array( |
|
| 456 | - 'label' => esc_html( 'page_permissions' ), |
|
| 457 | - 'value' => $args['page_permissions'], |
|
| 458 | - ), |
|
| 459 | - 'menu_type' => array( |
|
| 460 | - 'label' => esc_html( 'menu_type' ), |
|
| 461 | - 'value' => $args['menu_type'], |
|
| 462 | - ), |
|
| 463 | - 'page_parent' => array( |
|
| 464 | - 'label' => esc_html( 'page_parent' ), |
|
| 465 | - 'value' => $args['page_parent'], |
|
| 466 | - ), |
|
| 467 | - 'compiler' => array( |
|
| 468 | - 'label' => esc_html( 'compiler' ), |
|
| 469 | - 'value' => $args['compiler'] ? 'true' : 'false', |
|
| 470 | - ), |
|
| 471 | - 'output' => array( |
|
| 472 | - 'label' => esc_html( 'output' ), |
|
| 473 | - 'value' => $args['output'] ? 'true' : 'false', |
|
| 474 | - ), |
|
| 475 | - 'output_tag' => array( |
|
| 476 | - 'label' => esc_html( 'output_tag' ), |
|
| 477 | - 'value' => $args['output_tag'] ? 'true' : 'false', |
|
| 478 | - ), |
|
| 479 | - 'templates_path' => array( |
|
| 480 | - 'label' => esc_html( 'templates_path' ), |
|
| 481 | - 'value' => $args['templates_path'], |
|
| 482 | - ), |
|
| 483 | - 'extensions' => array( |
|
| 484 | - 'label' => esc_html( 'extensions' ), |
|
| 485 | - 'value' => $extensions, |
|
| 486 | - ), |
|
| 487 | - ), |
|
| 488 | - ); |
|
| 489 | - } |
|
| 490 | - } |
|
| 491 | - |
|
| 492 | - return $debug_info; |
|
| 493 | - } |
|
| 494 | - |
|
| 495 | - /** |
|
| 496 | - * Register callback for autoload. |
|
| 497 | - * |
|
| 498 | - * @param string $class_name name of class. |
|
| 499 | - */ |
|
| 500 | - public function register_classes( string $class_name ) { |
|
| 501 | - $class_name_test = self::strtolower( $class_name ); |
|
| 502 | - |
|
| 503 | - if ( strpos( $class_name_test, 'redux' ) === false ) { |
|
| 504 | - return; |
|
| 505 | - } |
|
| 506 | - |
|
| 507 | - if ( ! class_exists( 'Redux_Functions_Ex' ) ) { |
|
| 508 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' ); |
|
| 509 | - } |
|
| 510 | - |
|
| 511 | - if ( ! class_exists( $class_name ) ) { |
|
| 512 | - // Backward compatibility for extensions sucks! |
|
| 513 | - if ( 'Redux_Instances' === $class_name ) { |
|
| 514 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' ); |
|
| 515 | - require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' ); |
|
| 516 | - |
|
| 517 | - return; |
|
| 518 | - } |
|
| 519 | - |
|
| 520 | - // Load Redux APIs. |
|
| 521 | - if ( 'Redux' === $class_name ) { |
|
| 522 | - require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' ); |
|
| 523 | - |
|
| 524 | - return; |
|
| 525 | - } |
|
| 526 | - |
|
| 527 | - // Redux extra theme checks. |
|
| 528 | - if ( 'Redux_ThemeCheck' === $class_name ) { |
|
| 529 | - require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' ); |
|
| 530 | - |
|
| 531 | - return; |
|
| 532 | - } |
|
| 533 | - |
|
| 534 | - if ( 'Redux_Welcome' === $class_name ) { |
|
| 535 | - require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' ); |
|
| 536 | - |
|
| 537 | - return; |
|
| 538 | - } |
|
| 539 | - |
|
| 540 | - $mappings = array( |
|
| 541 | - 'ReduxFrameworkInstances' => 'Redux_Instances', |
|
| 542 | - 'reduxCorePanel' => 'Redux_Panel', |
|
| 543 | - 'reduxCoreEnqueue' => 'Redux_Enqueue', |
|
| 544 | - 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
|
| 545 | - ); |
|
| 546 | - $alias = false; |
|
| 547 | - if ( isset( $mappings[ $class_name ] ) ) { |
|
| 548 | - $alias = $class_name; |
|
| 549 | - $class_name = $mappings[ $class_name ]; |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - // Everything else. |
|
| 553 | - $file = 'class.' . $class_name_test . '.php'; |
|
| 554 | - |
|
| 555 | - $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 556 | - |
|
| 557 | - if ( ! file_exists( $class_path ) ) { |
|
| 558 | - $class_file_name = str_replace( '_', '-', $class_name ); |
|
| 559 | - $file = 'class-' . $class_name_test . '.php'; |
|
| 560 | - $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) { |
|
| 564 | - require_once $class_path; |
|
| 565 | - } |
|
| 566 | - if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) { |
|
| 567 | - class_alias( $class_name, $alias ); |
|
| 568 | - } |
|
| 569 | - } |
|
| 570 | - |
|
| 571 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 572 | - do_action( 'redux/core/includes', $this ); |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - /** |
|
| 576 | - * Hooks to run on instance creation. |
|
| 577 | - */ |
|
| 578 | - private function hooks() { |
|
| 579 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 580 | - do_action( 'redux/core/hooks', $this ); |
|
| 581 | - } |
|
| 582 | - |
|
| 583 | - /** |
|
| 584 | - * Action to run on WordPress heartbeat. |
|
| 585 | - * |
|
| 586 | - * @return bool |
|
| 587 | - */ |
|
| 588 | - public static function is_heartbeat(): bool { |
|
| 589 | - // Disregard WP AJAX 'heartbeat' call. Why waste resources? |
|
| 590 | - if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) { |
|
| 591 | - |
|
| 592 | - if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) { |
|
| 593 | - |
|
| 594 | - // Hook, for purists. |
|
| 595 | - if ( has_action( 'redux/ajax/heartbeat' ) ) { |
|
| 596 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 597 | - do_action( 'redux/ajax/heartbeat' ); |
|
| 598 | - } |
|
| 599 | - |
|
| 600 | - return true; |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - return false; |
|
| 604 | - } |
|
| 605 | - |
|
| 606 | - // Buh bye! |
|
| 607 | - return false; |
|
| 608 | - } |
|
| 609 | - |
|
| 610 | - /** |
|
| 611 | - * Helper method to check for mb_strtolower or to use the standard strtolower. |
|
| 612 | - * |
|
| 613 | - * @param string|null $str String to make lowercase. |
|
| 614 | - * |
|
| 615 | - * @return string|null |
|
| 616 | - */ |
|
| 617 | - public static function strtolower( ?string $str ): string { |
|
| 618 | - if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) { |
|
| 619 | - return mb_strtolower( $str, mb_detect_encoding( $str ) ); |
|
| 620 | - } else { |
|
| 621 | - return strtolower( $str ); |
|
| 622 | - } |
|
| 623 | - } |
|
| 624 | - } |
|
| 625 | - |
|
| 626 | - /* |
|
| 14 | + /** |
|
| 15 | + * Class Redux_Core |
|
| 16 | + */ |
|
| 17 | + class Redux_Core { |
|
| 18 | + |
|
| 19 | + /** |
|
| 20 | + * Class instance. |
|
| 21 | + * |
|
| 22 | + * @var null|Redux_Core |
|
| 23 | + */ |
|
| 24 | + public static ?Redux_Core $instance = null; |
|
| 25 | + |
|
| 26 | + /** |
|
| 27 | + * Project version |
|
| 28 | + * |
|
| 29 | + * @var string |
|
| 30 | + */ |
|
| 31 | + public static string $version; |
|
| 32 | + |
|
| 33 | + /** |
|
| 34 | + * Project directory. |
|
| 35 | + * |
|
| 36 | + * @var string. |
|
| 37 | + */ |
|
| 38 | + public static string $dir; |
|
| 39 | + |
|
| 40 | + /** |
|
| 41 | + * Project URL. |
|
| 42 | + * |
|
| 43 | + * @var string. |
|
| 44 | + */ |
|
| 45 | + public static string $url; |
|
| 46 | + |
|
| 47 | + /** |
|
| 48 | + * Base directory path. |
|
| 49 | + * |
|
| 50 | + * @var string |
|
| 51 | + */ |
|
| 52 | + public static string $redux_path; |
|
| 53 | + |
|
| 54 | + /** |
|
| 55 | + * Absolute direction path to WordPress upload directory. |
|
| 56 | + * |
|
| 57 | + * @var string |
|
| 58 | + */ |
|
| 59 | + public static string $upload_dir = ''; |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * Full URL to WordPress upload directory. |
|
| 63 | + * |
|
| 64 | + * @var null|string |
|
| 65 | + */ |
|
| 66 | + public static ?string $upload_url = ''; |
|
| 67 | + |
|
| 68 | + /** |
|
| 69 | + * Set when Redux is run as a plugin. |
|
| 70 | + * |
|
| 71 | + * @var bool |
|
| 72 | + */ |
|
| 73 | + public static bool $is_plugin = true; |
|
| 74 | + |
|
| 75 | + /** |
|
| 76 | + * Indicated in_theme or in_plugin. |
|
| 77 | + * |
|
| 78 | + * @var string |
|
| 79 | + */ |
|
| 80 | + public static string $installed = ''; |
|
| 81 | + |
|
| 82 | + /** |
|
| 83 | + * Set when Redux is run as a plugin. |
|
| 84 | + * |
|
| 85 | + * @var bool |
|
| 86 | + */ |
|
| 87 | + public static bool $as_plugin = false; |
|
| 88 | + |
|
| 89 | + /** |
|
| 90 | + * Set when Redux is embedded within a theme. |
|
| 91 | + * |
|
| 92 | + * @var bool |
|
| 93 | + */ |
|
| 94 | + public static bool $in_theme = false; |
|
| 95 | + |
|
| 96 | + /** |
|
| 97 | + * Pointer to an updated Google fonts array. |
|
| 98 | + * |
|
| 99 | + * @var array|null |
|
| 100 | + */ |
|
| 101 | + public static ?array $updated_google_fonts = array(); |
|
| 102 | + |
|
| 103 | + /** |
|
| 104 | + * List of files calling Redux. |
|
| 105 | + * |
|
| 106 | + * @var array|null |
|
| 107 | + */ |
|
| 108 | + public static ?array $callers = array(); |
|
| 109 | + |
|
| 110 | + /** |
|
| 111 | + * Pointer to _SERVER global. |
|
| 112 | + * |
|
| 113 | + * @var array|null |
|
| 114 | + */ |
|
| 115 | + public static ?array $server = array(); |
|
| 116 | + |
|
| 117 | + /** |
|
| 118 | + * Field folding information for localization. |
|
| 119 | + * |
|
| 120 | + * @var null|array |
|
| 121 | + */ |
|
| 122 | + public static ?array $required = array(); |
|
| 123 | + |
|
| 124 | + /** |
|
| 125 | + * Field child-folding information for localization. |
|
| 126 | + * |
|
| 127 | + * @var null|array |
|
| 128 | + */ |
|
| 129 | + public static ?array $required_child = array(); |
|
| 130 | + |
|
| 131 | + /** |
|
| 132 | + * Array of fields to be folded. |
|
| 133 | + * |
|
| 134 | + * @var array|null |
|
| 135 | + */ |
|
| 136 | + public static ?array $folds = array(); |
|
| 137 | + |
|
| 138 | + /** |
|
| 139 | + * Array of fields that didn't pass the fold dependency test and are hidden. |
|
| 140 | + * |
|
| 141 | + * @var null|array |
|
| 142 | + */ |
|
| 143 | + public static ?array $fields_hidden = array(); |
|
| 144 | + |
|
| 145 | + /** |
|
| 146 | + * Values to generate google font CSS. |
|
| 147 | + * |
|
| 148 | + * @var null|array |
|
| 149 | + */ |
|
| 150 | + public static ?array $typography = array(); |
|
| 151 | + |
|
| 152 | + /** |
|
| 153 | + * Validation ran flag. |
|
| 154 | + * |
|
| 155 | + * @var bool |
|
| 156 | + */ |
|
| 157 | + public static bool $validation_ran = false; |
|
| 158 | + |
|
| 159 | + /** |
|
| 160 | + * No output flag. |
|
| 161 | + * |
|
| 162 | + * @var bool |
|
| 163 | + */ |
|
| 164 | + public static bool $no_output = false; |
|
| 165 | + |
|
| 166 | + /** |
|
| 167 | + * Array of fonts used by the panel for localization. |
|
| 168 | + * |
|
| 169 | + * @var null|array |
|
| 170 | + */ |
|
| 171 | + public static ?array $fonts = array(); |
|
| 172 | + |
|
| 173 | + /** |
|
| 174 | + * Array of Google fonts used by the panel for localization. |
|
| 175 | + * |
|
| 176 | + * @var null|array |
|
| 177 | + */ |
|
| 178 | + public static ?array $google_array = array(); |
|
| 179 | + |
|
| 180 | + /** |
|
| 181 | + * Array of various font groups used within the typography field. |
|
| 182 | + * |
|
| 183 | + * @var null|array |
|
| 184 | + */ |
|
| 185 | + public static ?array $font_groups = array(); |
|
| 186 | + |
|
| 187 | + /** |
|
| 188 | + * File system object used for I/O file operations. Done the WordPress way. |
|
| 189 | + * |
|
| 190 | + * @var null|object |
|
| 191 | + */ |
|
| 192 | + public static ?object $filesystem; |
|
| 193 | + |
|
| 194 | + /** |
|
| 195 | + * Pointer to the third party fixes class. |
|
| 196 | + * |
|
| 197 | + * @var Redux_ThirdParty_Fixes |
|
| 198 | + */ |
|
| 199 | + public static Redux_ThirdParty_Fixes $third_party_fixes; |
|
| 200 | + |
|
| 201 | + /** |
|
| 202 | + * Redux Welcome screen object. |
|
| 203 | + * |
|
| 204 | + * @var Redux_Welcome |
|
| 205 | + */ |
|
| 206 | + public static Redux_Welcome $welcome; |
|
| 207 | + |
|
| 208 | + /** |
|
| 209 | + * Creates instance of class. |
|
| 210 | + * |
|
| 211 | + * @return Redux_Core |
|
| 212 | + * @throws Exception Comment. |
|
| 213 | + */ |
|
| 214 | + public static function instance(): ?Redux_Core { |
|
| 215 | + if ( ! self::$instance ) { |
|
| 216 | + self::$instance = new self(); |
|
| 217 | + |
|
| 218 | + self::$instance->includes(); |
|
| 219 | + self::$instance->init(); |
|
| 220 | + self::$instance->hooks(); |
|
| 221 | + |
|
| 222 | + add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) ); |
|
| 223 | + } |
|
| 224 | + |
|
| 225 | + return self::$instance; |
|
| 226 | + } |
|
| 227 | + |
|
| 228 | + /** |
|
| 229 | + * Things to run after pluggable.php had loaded. |
|
| 230 | + */ |
|
| 231 | + public static function plugins_loaded() {} |
|
| 232 | + |
|
| 233 | + /** |
|
| 234 | + * Class init. |
|
| 235 | + */ |
|
| 236 | + private function init() { |
|
| 237 | + self::$server = array( |
|
| 238 | + 'SERVER_SOFTWARE' => '', |
|
| 239 | + 'REMOTE_ADDR' => Redux_Helpers::is_local_host() ? '127.0.0.1' : '', |
|
| 240 | + 'HTTP_USER_AGENT' => '', |
|
| 241 | + 'HTTP_HOST' => '', |
|
| 242 | + 'REQUEST_URI' => '', |
|
| 243 | + ); |
|
| 244 | + |
|
| 245 | + // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase |
|
| 246 | + if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) { |
|
| 247 | + self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ); |
|
| 248 | + } |
|
| 249 | + if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) { |
|
| 250 | + self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); |
|
| 251 | + } |
|
| 252 | + if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { |
|
| 253 | + self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ); |
|
| 254 | + } |
|
| 255 | + if ( ! empty( $_SERVER['HTTP_HOST'] ) ) { |
|
| 256 | + self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) ); |
|
| 257 | + } |
|
| 258 | + if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { |
|
| 259 | + self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ); |
|
| 260 | + } |
|
| 261 | + |
|
| 262 | + // phpcs:enable |
|
| 263 | + |
|
| 264 | + self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) ); |
|
| 265 | + |
|
| 266 | + Redux_Functions_Ex::generator(); |
|
| 267 | + |
|
| 268 | + if ( defined( 'REDUX_PLUGIN_FILE' ) ) { |
|
| 269 | + $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE ); |
|
| 270 | + } |
|
| 271 | + |
|
| 272 | + $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ ); |
|
| 273 | + |
|
| 274 | + if ( false !== $plugin_info ) { |
|
| 275 | + self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin'; |
|
| 276 | + self::$is_plugin = class_exists( 'Redux_Framework_Plugin' ); |
|
| 277 | + self::$as_plugin = true; |
|
| 278 | + self::$url = trailingslashit( dirname( $plugin_info['url'] ) ); |
|
| 279 | + } else { |
|
| 280 | + $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ ); |
|
| 281 | + if ( false !== $theme_info ) { |
|
| 282 | + self::$url = trailingslashit( dirname( $theme_info['url'] ) ); |
|
| 283 | + self::$in_theme = true; |
|
| 284 | + self::$installed = 'in_theme'; |
|
| 285 | + } |
|
| 286 | + } |
|
| 287 | + |
|
| 288 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 289 | + self::$url = apply_filters( 'redux/url', self::$url ); |
|
| 290 | + |
|
| 291 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 292 | + self::$dir = apply_filters( 'redux/dir', self::$dir ); |
|
| 293 | + |
|
| 294 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 295 | + self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin ); |
|
| 296 | + |
|
| 297 | + if ( ! function_exists( 'current_time' ) ) { |
|
| 298 | + require_once ABSPATH . '/wp-includes/functions.php'; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + $upload_dir = wp_upload_dir(); |
|
| 302 | + self::$upload_dir = $upload_dir['basedir'] . '/redux/'; |
|
| 303 | + self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' ); |
|
| 304 | + |
|
| 305 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | + self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir ); |
|
| 307 | + |
|
| 308 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 309 | + self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url ); |
|
| 310 | + } |
|
| 311 | + |
|
| 312 | + /** |
|
| 313 | + * Code to execute on a framework __construct. |
|
| 314 | + * |
|
| 315 | + * @param ReduxFramework $redux Pointer to ReduxFramework object. |
|
| 316 | + */ |
|
| 317 | + public static function core_construct( ReduxFramework $redux ) { |
|
| 318 | + self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux ); |
|
| 319 | + |
|
| 320 | + Redux_ThemeCheck::get_instance(); |
|
| 321 | + } |
|
| 322 | + |
|
| 323 | + /** |
|
| 324 | + * Autoregister run. |
|
| 325 | + * |
|
| 326 | + * @throws Exception Comment. |
|
| 327 | + */ |
|
| 328 | + private function includes() { |
|
| 329 | + if ( is_admin() ) { |
|
| 330 | + if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) { |
|
| 331 | + echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>'; |
|
| 332 | + } |
|
| 333 | + } |
|
| 334 | + |
|
| 335 | + require_once __DIR__ . '/inc/classes/class-redux-path.php'; |
|
| 336 | + require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php'; |
|
| 337 | + require_once __DIR__ . '/inc/classes/class-redux-helpers.php'; |
|
| 338 | + require_once __DIR__ . '/inc/classes/class-redux-instances.php'; |
|
| 339 | + |
|
| 340 | + Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' ); |
|
| 341 | + Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' ); |
|
| 342 | + |
|
| 343 | + spl_autoload_register( array( $this, 'register_classes' ) ); |
|
| 344 | + |
|
| 345 | + self::$welcome = new Redux_Welcome(); |
|
| 346 | + |
|
| 347 | + add_filter( 'debug_information', array( $this, 'add_debug_info' ) ); |
|
| 348 | + } |
|
| 349 | + |
|
| 350 | + /** |
|
| 351 | + * Add debug info for the WP Site Health screen. |
|
| 352 | + * |
|
| 353 | + * @param array $debug_info Debug data. |
|
| 354 | + * |
|
| 355 | + * @return array |
|
| 356 | + * @throws ReflectionException Exception. |
|
| 357 | + */ |
|
| 358 | + public function add_debug_info( array $debug_info ): array { |
|
| 359 | + |
|
| 360 | + // Get browser data. |
|
| 361 | + if ( ! class_exists( 'ReduxBrowser' ) ) { |
|
| 362 | + require_once self::$dir . 'inc/lib/browser.php'; |
|
| 363 | + } |
|
| 364 | + |
|
| 365 | + $browser = new ReduxBrowser(); |
|
| 366 | + |
|
| 367 | + $browser_data = array( |
|
| 368 | + 'Agent' => $browser->getUserAgent(), |
|
| 369 | + 'Browser' => $browser->getBrowser(), |
|
| 370 | + 'Version' => $browser->getVersion(), |
|
| 371 | + 'Platform' => $browser->getPlatform(), |
|
| 372 | + ); |
|
| 373 | + |
|
| 374 | + // Set Redux dir permission results to Site Health screen. |
|
| 375 | + $debug_info['wp-filesystem']['fields'][] = array( |
|
| 376 | + 'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ), |
|
| 377 | + 'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable', |
|
| 378 | + ); |
|
| 379 | + |
|
| 380 | + // Set Redux plugin results to Site Health screen. |
|
| 381 | + $debug_info['redux-framework'] = array( |
|
| 382 | + 'label' => esc_html__( 'Redux Framework', 'redux-framework' ), |
|
| 383 | + 'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ), |
|
| 384 | + 'fields' => array( |
|
| 385 | + 'version' => array( |
|
| 386 | + 'label' => esc_html__( 'Version', 'redux-framework' ), |
|
| 387 | + 'value' => self::$version, |
|
| 388 | + ), |
|
| 389 | + 'installation' => array( |
|
| 390 | + 'label' => esc_html__( 'Installation', 'redux-framework' ), |
|
| 391 | + 'value' => self::$installed, |
|
| 392 | + ), |
|
| 393 | + 'data directory' => array( |
|
| 394 | + 'label' => esc_html__( 'Data directory', 'redux-framework' ), |
|
| 395 | + 'value' => self::$dir, |
|
| 396 | + ), |
|
| 397 | + 'browser' => array( |
|
| 398 | + 'label' => esc_html__( 'Browser', 'redux-framework' ), |
|
| 399 | + 'value' => $browser_data, |
|
| 400 | + ), |
|
| 401 | + ), |
|
| 402 | + ); |
|
| 403 | + |
|
| 404 | + $redux = Redux::all_instances(); |
|
| 405 | + |
|
| 406 | + $extensions = array(); |
|
| 407 | + |
|
| 408 | + if ( ! empty( $redux ) && is_array( $redux ) ) { |
|
| 409 | + foreach ( $redux as $inst => $data ) { |
|
| 410 | + Redux::init( $inst ); |
|
| 411 | + |
|
| 412 | + $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) ); |
|
| 413 | + $args = $data->args; |
|
| 414 | + |
|
| 415 | + $ext = Redux::get_extensions( $inst ); |
|
| 416 | + if ( ! empty( $ext ) && is_array( $ext ) ) { |
|
| 417 | + ksort( $ext ); |
|
| 418 | + |
|
| 419 | + foreach ( $ext as $name => $arr ) { |
|
| 420 | + $ver = $arr['version']; |
|
| 421 | + |
|
| 422 | + $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
|
| 423 | + |
|
| 424 | + $extensions[ $ex ] = esc_html( $ver ); |
|
| 425 | + } |
|
| 426 | + } |
|
| 427 | + |
|
| 428 | + // Output Redux instances. |
|
| 429 | + $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 430 | + // translators: %s = Instance name. |
|
| 431 | + 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
|
| 432 | + // translators: %s = Instance name w/ HTML. |
|
| 433 | + 'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ), |
|
| 434 | + 'fields' => array( |
|
| 435 | + 'opt_name' => array( |
|
| 436 | + 'label' => esc_html( 'opt_name' ), |
|
| 437 | + 'value' => $args['opt_name'], |
|
| 438 | + ), |
|
| 439 | + 'global_variable' => array( |
|
| 440 | + 'label' => esc_html( 'global_variable' ), |
|
| 441 | + 'value' => $args['global_variable'], |
|
| 442 | + ), |
|
| 443 | + 'dev_mode' => array( |
|
| 444 | + 'label' => esc_html( 'dev_mode' ), |
|
| 445 | + 'value' => $args['dev_mode'] ? 'true' : 'false', |
|
| 446 | + ), |
|
| 447 | + 'ajax_save' => array( |
|
| 448 | + 'label' => esc_html( 'ajax_save' ), |
|
| 449 | + 'value' => $args['ajax_save'] ? 'true' : 'false', |
|
| 450 | + ), |
|
| 451 | + 'page_slug' => array( |
|
| 452 | + 'label' => esc_html( 'page_slug' ), |
|
| 453 | + 'value' => $args['page_slug'], |
|
| 454 | + ), |
|
| 455 | + 'page_permissions' => array( |
|
| 456 | + 'label' => esc_html( 'page_permissions' ), |
|
| 457 | + 'value' => $args['page_permissions'], |
|
| 458 | + ), |
|
| 459 | + 'menu_type' => array( |
|
| 460 | + 'label' => esc_html( 'menu_type' ), |
|
| 461 | + 'value' => $args['menu_type'], |
|
| 462 | + ), |
|
| 463 | + 'page_parent' => array( |
|
| 464 | + 'label' => esc_html( 'page_parent' ), |
|
| 465 | + 'value' => $args['page_parent'], |
|
| 466 | + ), |
|
| 467 | + 'compiler' => array( |
|
| 468 | + 'label' => esc_html( 'compiler' ), |
|
| 469 | + 'value' => $args['compiler'] ? 'true' : 'false', |
|
| 470 | + ), |
|
| 471 | + 'output' => array( |
|
| 472 | + 'label' => esc_html( 'output' ), |
|
| 473 | + 'value' => $args['output'] ? 'true' : 'false', |
|
| 474 | + ), |
|
| 475 | + 'output_tag' => array( |
|
| 476 | + 'label' => esc_html( 'output_tag' ), |
|
| 477 | + 'value' => $args['output_tag'] ? 'true' : 'false', |
|
| 478 | + ), |
|
| 479 | + 'templates_path' => array( |
|
| 480 | + 'label' => esc_html( 'templates_path' ), |
|
| 481 | + 'value' => $args['templates_path'], |
|
| 482 | + ), |
|
| 483 | + 'extensions' => array( |
|
| 484 | + 'label' => esc_html( 'extensions' ), |
|
| 485 | + 'value' => $extensions, |
|
| 486 | + ), |
|
| 487 | + ), |
|
| 488 | + ); |
|
| 489 | + } |
|
| 490 | + } |
|
| 491 | + |
|
| 492 | + return $debug_info; |
|
| 493 | + } |
|
| 494 | + |
|
| 495 | + /** |
|
| 496 | + * Register callback for autoload. |
|
| 497 | + * |
|
| 498 | + * @param string $class_name name of class. |
|
| 499 | + */ |
|
| 500 | + public function register_classes( string $class_name ) { |
|
| 501 | + $class_name_test = self::strtolower( $class_name ); |
|
| 502 | + |
|
| 503 | + if ( strpos( $class_name_test, 'redux' ) === false ) { |
|
| 504 | + return; |
|
| 505 | + } |
|
| 506 | + |
|
| 507 | + if ( ! class_exists( 'Redux_Functions_Ex' ) ) { |
|
| 508 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' ); |
|
| 509 | + } |
|
| 510 | + |
|
| 511 | + if ( ! class_exists( $class_name ) ) { |
|
| 512 | + // Backward compatibility for extensions sucks! |
|
| 513 | + if ( 'Redux_Instances' === $class_name ) { |
|
| 514 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' ); |
|
| 515 | + require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' ); |
|
| 516 | + |
|
| 517 | + return; |
|
| 518 | + } |
|
| 519 | + |
|
| 520 | + // Load Redux APIs. |
|
| 521 | + if ( 'Redux' === $class_name ) { |
|
| 522 | + require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' ); |
|
| 523 | + |
|
| 524 | + return; |
|
| 525 | + } |
|
| 526 | + |
|
| 527 | + // Redux extra theme checks. |
|
| 528 | + if ( 'Redux_ThemeCheck' === $class_name ) { |
|
| 529 | + require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' ); |
|
| 530 | + |
|
| 531 | + return; |
|
| 532 | + } |
|
| 533 | + |
|
| 534 | + if ( 'Redux_Welcome' === $class_name ) { |
|
| 535 | + require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' ); |
|
| 536 | + |
|
| 537 | + return; |
|
| 538 | + } |
|
| 539 | + |
|
| 540 | + $mappings = array( |
|
| 541 | + 'ReduxFrameworkInstances' => 'Redux_Instances', |
|
| 542 | + 'reduxCorePanel' => 'Redux_Panel', |
|
| 543 | + 'reduxCoreEnqueue' => 'Redux_Enqueue', |
|
| 544 | + 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
|
| 545 | + ); |
|
| 546 | + $alias = false; |
|
| 547 | + if ( isset( $mappings[ $class_name ] ) ) { |
|
| 548 | + $alias = $class_name; |
|
| 549 | + $class_name = $mappings[ $class_name ]; |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + // Everything else. |
|
| 553 | + $file = 'class.' . $class_name_test . '.php'; |
|
| 554 | + |
|
| 555 | + $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 556 | + |
|
| 557 | + if ( ! file_exists( $class_path ) ) { |
|
| 558 | + $class_file_name = str_replace( '_', '-', $class_name ); |
|
| 559 | + $file = 'class-' . $class_name_test . '.php'; |
|
| 560 | + $class_path = Redux_Path::get_path( '/inc/classes/' . $file ); |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) { |
|
| 564 | + require_once $class_path; |
|
| 565 | + } |
|
| 566 | + if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) { |
|
| 567 | + class_alias( $class_name, $alias ); |
|
| 568 | + } |
|
| 569 | + } |
|
| 570 | + |
|
| 571 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 572 | + do_action( 'redux/core/includes', $this ); |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + /** |
|
| 576 | + * Hooks to run on instance creation. |
|
| 577 | + */ |
|
| 578 | + private function hooks() { |
|
| 579 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 580 | + do_action( 'redux/core/hooks', $this ); |
|
| 581 | + } |
|
| 582 | + |
|
| 583 | + /** |
|
| 584 | + * Action to run on WordPress heartbeat. |
|
| 585 | + * |
|
| 586 | + * @return bool |
|
| 587 | + */ |
|
| 588 | + public static function is_heartbeat(): bool { |
|
| 589 | + // Disregard WP AJAX 'heartbeat' call. Why waste resources? |
|
| 590 | + if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) { |
|
| 591 | + |
|
| 592 | + if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) { |
|
| 593 | + |
|
| 594 | + // Hook, for purists. |
|
| 595 | + if ( has_action( 'redux/ajax/heartbeat' ) ) { |
|
| 596 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 597 | + do_action( 'redux/ajax/heartbeat' ); |
|
| 598 | + } |
|
| 599 | + |
|
| 600 | + return true; |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + return false; |
|
| 604 | + } |
|
| 605 | + |
|
| 606 | + // Buh bye! |
|
| 607 | + return false; |
|
| 608 | + } |
|
| 609 | + |
|
| 610 | + /** |
|
| 611 | + * Helper method to check for mb_strtolower or to use the standard strtolower. |
|
| 612 | + * |
|
| 613 | + * @param string|null $str String to make lowercase. |
|
| 614 | + * |
|
| 615 | + * @return string|null |
|
| 616 | + */ |
|
| 617 | + public static function strtolower( ?string $str ): string { |
|
| 618 | + if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) { |
|
| 619 | + return mb_strtolower( $str, mb_detect_encoding( $str ) ); |
|
| 620 | + } else { |
|
| 621 | + return strtolower( $str ); |
|
| 622 | + } |
|
| 623 | + } |
|
| 624 | + } |
|
| 625 | + |
|
| 626 | + /* |
|
| 627 | 627 | * Backwards comparability alias |
| 628 | 628 | */ |
| 629 | - class_alias( 'Redux_Core', 'redux-core' ); |
|
| 629 | + class_alias( 'Redux_Core', 'redux-core' ); |
|
| 630 | 630 | } |
@@ -98,56 +98,56 @@ discard block |
||
| 98 | 98 | * |
| 99 | 99 | * @var array|null |
| 100 | 100 | */ |
| 101 | - public static ?array $updated_google_fonts = array(); |
|
| 101 | + public static ? array $updated_google_fonts = array(); |
|
| 102 | 102 | |
| 103 | 103 | /** |
| 104 | 104 | * List of files calling Redux. |
| 105 | 105 | * |
| 106 | 106 | * @var array|null |
| 107 | 107 | */ |
| 108 | - public static ?array $callers = array(); |
|
| 108 | + public static ? array $callers = array(); |
|
| 109 | 109 | |
| 110 | 110 | /** |
| 111 | 111 | * Pointer to _SERVER global. |
| 112 | 112 | * |
| 113 | 113 | * @var array|null |
| 114 | 114 | */ |
| 115 | - public static ?array $server = array(); |
|
| 115 | + public static ? array $server = array(); |
|
| 116 | 116 | |
| 117 | 117 | /** |
| 118 | 118 | * Field folding information for localization. |
| 119 | 119 | * |
| 120 | 120 | * @var null|array |
| 121 | 121 | */ |
| 122 | - public static ?array $required = array(); |
|
| 122 | + public static ? array $required = array(); |
|
| 123 | 123 | |
| 124 | 124 | /** |
| 125 | 125 | * Field child-folding information for localization. |
| 126 | 126 | * |
| 127 | 127 | * @var null|array |
| 128 | 128 | */ |
| 129 | - public static ?array $required_child = array(); |
|
| 129 | + public static ? array $required_child = array(); |
|
| 130 | 130 | |
| 131 | 131 | /** |
| 132 | 132 | * Array of fields to be folded. |
| 133 | 133 | * |
| 134 | 134 | * @var array|null |
| 135 | 135 | */ |
| 136 | - public static ?array $folds = array(); |
|
| 136 | + public static ? array $folds = array(); |
|
| 137 | 137 | |
| 138 | 138 | /** |
| 139 | 139 | * Array of fields that didn't pass the fold dependency test and are hidden. |
| 140 | 140 | * |
| 141 | 141 | * @var null|array |
| 142 | 142 | */ |
| 143 | - public static ?array $fields_hidden = array(); |
|
| 143 | + public static ? array $fields_hidden = array(); |
|
| 144 | 144 | |
| 145 | 145 | /** |
| 146 | 146 | * Values to generate google font CSS. |
| 147 | 147 | * |
| 148 | 148 | * @var null|array |
| 149 | 149 | */ |
| 150 | - public static ?array $typography = array(); |
|
| 150 | + public static ? array $typography = array(); |
|
| 151 | 151 | |
| 152 | 152 | /** |
| 153 | 153 | * Validation ran flag. |
@@ -168,21 +168,21 @@ discard block |
||
| 168 | 168 | * |
| 169 | 169 | * @var null|array |
| 170 | 170 | */ |
| 171 | - public static ?array $fonts = array(); |
|
| 171 | + public static ? array $fonts = array(); |
|
| 172 | 172 | |
| 173 | 173 | /** |
| 174 | 174 | * Array of Google fonts used by the panel for localization. |
| 175 | 175 | * |
| 176 | 176 | * @var null|array |
| 177 | 177 | */ |
| 178 | - public static ?array $google_array = array(); |
|
| 178 | + public static ? array $google_array = array(); |
|
| 179 | 179 | |
| 180 | 180 | /** |
| 181 | 181 | * Array of various font groups used within the typography field. |
| 182 | 182 | * |
| 183 | 183 | * @var null|array |
| 184 | 184 | */ |
| 185 | - public static ?array $font_groups = array(); |
|
| 185 | + public static ? array $font_groups = array(); |
|
| 186 | 186 | |
| 187 | 187 | /** |
| 188 | 188 | * File system object used for I/O file operations. Done the WordPress way. |
@@ -421,12 +421,12 @@ discard block |
||
| 421 | 421 | |
| 422 | 422 | $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) ); |
| 423 | 423 | |
| 424 | - $extensions[ $ex ] = esc_html( $ver ); |
|
| 424 | + $extensions[$ex] = esc_html( $ver ); |
|
| 425 | 425 | } |
| 426 | 426 | } |
| 427 | 427 | |
| 428 | 428 | // Output Redux instances. |
| 429 | - $debug_info[ 'redux-instance-' . $inst ] = array( |
|
| 429 | + $debug_info['redux-instance-' . $inst] = array( |
|
| 430 | 430 | // translators: %s = Instance name. |
| 431 | 431 | 'label' => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ), |
| 432 | 432 | // translators: %s = Instance name w/ HTML. |
@@ -543,10 +543,10 @@ discard block |
||
| 543 | 543 | 'reduxCoreEnqueue' => 'Redux_Enqueue', |
| 544 | 544 | 'Redux_Abstract_Extension' => 'Redux_Extension_Abstract', |
| 545 | 545 | ); |
| 546 | - $alias = false; |
|
| 547 | - if ( isset( $mappings[ $class_name ] ) ) { |
|
| 546 | + $alias = false; |
|
| 547 | + if ( isset( $mappings[$class_name] ) ) { |
|
| 548 | 548 | $alias = $class_name; |
| 549 | - $class_name = $mappings[ $class_name ]; |
|
| 549 | + $class_name = $mappings[$class_name]; |
|
| 550 | 550 | } |
| 551 | 551 | |
| 552 | 552 | // Everything else. |
@@ -11,328 +11,328 @@ |
||
| 11 | 11 | |
| 12 | 12 | if ( ! class_exists( 'Redux_Social_Profiles_Functions' ) ) { |
| 13 | 13 | |
| 14 | - /** |
|
| 15 | - * Class Redux_Social_Profiles_Functions |
|
| 16 | - */ |
|
| 17 | - class Redux_Social_Profiles_Functions { |
|
| 18 | - /** |
|
| 19 | - * ReduxFramework object pointer. |
|
| 20 | - * |
|
| 21 | - * @var ReduxFramework |
|
| 22 | - */ |
|
| 23 | - public static ReduxFramework $parent; |
|
| 24 | - |
|
| 25 | - /** |
|
| 26 | - * Field ID. |
|
| 27 | - * |
|
| 28 | - * @var null|string |
|
| 29 | - */ |
|
| 30 | - public static ?string $field_id; |
|
| 31 | - |
|
| 32 | - /** |
|
| 33 | - * Field array. |
|
| 34 | - * |
|
| 35 | - * @var array|null |
|
| 36 | - */ |
|
| 37 | - public static ?array $field; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * WordPress upload directory. |
|
| 41 | - * |
|
| 42 | - * @var string |
|
| 43 | - */ |
|
| 44 | - public static string $upload_dir; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * WordPress upload URI. |
|
| 48 | - * |
|
| 49 | - * @var string |
|
| 50 | - */ |
|
| 51 | - public static string $upload_url; |
|
| 52 | - |
|
| 53 | - /** |
|
| 54 | - * Init helper library. |
|
| 55 | - * |
|
| 56 | - * @param ReduxFramework $redux ReduxFramework object. |
|
| 57 | - */ |
|
| 58 | - public static function init( ReduxFramework $redux ) { |
|
| 59 | - self::$parent = $redux; |
|
| 60 | - |
|
| 61 | - if ( empty( self::$field_id ) ) { |
|
| 62 | - self::$field = self::get_field( $redux ); |
|
| 63 | - |
|
| 64 | - if ( ! is_array( self::$field ) ) { |
|
| 65 | - return; |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - self::$field_id = self::$field['id']; |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - // Make sanitized upload dir DIR. |
|
| 72 | - self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_dir . 'social-profiles/' ); |
|
| 73 | - |
|
| 74 | - // Make sanitized upload dir URL. |
|
| 75 | - self::$upload_url = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_url . 'social-profiles/' ); |
|
| 76 | - |
|
| 77 | - Redux_Functions::init_wp_filesystem(); |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - /** |
|
| 81 | - * Read data file. |
|
| 82 | - * |
|
| 83 | - * @return array|bool|mixed|object |
|
| 84 | - */ |
|
| 85 | - public static function read_data_file() { |
|
| 86 | - $file = self::get_data_path(); |
|
| 87 | - |
|
| 88 | - if ( file_exists( $file ) ) { |
|
| 89 | - |
|
| 90 | - // Get the contents of the file and stuff it in a variable. |
|
| 91 | - $data = Redux_Core::$filesystem->execute( 'get_contents', $file ); |
|
| 92 | - |
|
| 93 | - // Error or null, set the result to false. |
|
| 94 | - if ( false === $data || null === $data ) { |
|
| 95 | - $arr_data = false; |
|
| 96 | - |
|
| 97 | - // Otherwise, decode the json object and return it. |
|
| 98 | - } else { |
|
| 99 | - $arr = json_decode( $data, true ); |
|
| 100 | - $arr_data = $arr; |
|
| 101 | - } |
|
| 102 | - } else { |
|
| 103 | - $arr_data = false; |
|
| 104 | - } |
|
| 105 | - |
|
| 106 | - return $arr_data; |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - /** |
|
| 110 | - * Write data file. |
|
| 111 | - * |
|
| 112 | - * @param array $arr_data Data. |
|
| 113 | - * @param string $file Filename. |
|
| 114 | - * |
|
| 115 | - * @return bool |
|
| 116 | - */ |
|
| 117 | - public static function write_data_file( array $arr_data, string $file = '' ): bool { |
|
| 118 | - if ( ! is_dir( self::$upload_dir ) ) { |
|
| 119 | - return false; |
|
| 120 | - } |
|
| 121 | - |
|
| 122 | - $file = ( '' === $file ) ? self::get_data_path() : self::$upload_dir . $file; |
|
| 123 | - |
|
| 124 | - // Encode the array data. |
|
| 125 | - $data = wp_json_encode( $arr_data ); |
|
| 126 | - |
|
| 127 | - // Write to its file on the server, return the return value |
|
| 128 | - // True on success, false on error. |
|
| 129 | - return Redux_Core::$filesystem->execute( 'put_contents', $file, array( 'content' => $data ) ); |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - /** |
|
| 133 | - * Get the data path. |
|
| 134 | - * |
|
| 135 | - * @return mixed|Redux_Functions_Ex|string |
|
| 136 | - */ |
|
| 137 | - public static function get_data_path() { |
|
| 138 | - return Redux_Functions_Ex::wp_normalize_path( self::$upload_dir . '/' . self::$parent->args['opt_name'] . '-' . self::$field_id . '.json' ); |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - /** |
|
| 142 | - * Get field. |
|
| 143 | - * |
|
| 144 | - * @param array|ReduxFramework $redux ReduxFramework object. |
|
| 145 | - * |
|
| 146 | - * @return mixed |
|
| 147 | - */ |
|
| 148 | - public static function get_field( $redux = array() ) { |
|
| 149 | - global $pagenow; |
|
| 150 | - |
|
| 151 | - if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) { |
|
| 152 | - $inst = Redux_Instances::get_instance( self::$parent->args['opt_name'] ); |
|
| 153 | - |
|
| 154 | - $ext = $inst->extensions; |
|
| 155 | - |
|
| 156 | - if ( isset( $ext['metaboxes'] ) ) { |
|
| 157 | - $obj = $ext['metaboxes']; |
|
| 158 | - $boxes = ( $obj->boxes ); |
|
| 159 | - |
|
| 160 | - foreach ( $boxes as $sections ) { |
|
| 161 | - foreach ( $sections['sections'] as $fields ) { |
|
| 162 | - if ( isset( $fields['fields'] ) ) { |
|
| 163 | - foreach ( $fields['fields'] as $f ) { |
|
| 164 | - if ( 'social_profiles' === $f['type'] ) { |
|
| 165 | - return $f; |
|
| 166 | - } |
|
| 167 | - |
|
| 168 | - if ( 'repeater' === $f['type'] ) { |
|
| 169 | - foreach ( $f['fields'] as $r ) { |
|
| 170 | - if ( 'social_profiles' === $r['type'] ) { |
|
| 171 | - return $r; |
|
| 172 | - } |
|
| 173 | - } |
|
| 174 | - } |
|
| 175 | - } |
|
| 176 | - } |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - } |
|
| 180 | - } else { |
|
| 181 | - if ( ! empty( $redux ) ) { |
|
| 182 | - self::$parent = $redux; |
|
| 183 | - } |
|
| 184 | - |
|
| 185 | - if ( isset( self::$parent->field_sections['social_profiles'] ) ) { |
|
| 186 | - return reset( self::$parent->field_sections['social_profiles'] ); |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - $arr = self::$parent; |
|
| 190 | - |
|
| 191 | - foreach ( $arr as $part => $bla ) { |
|
| 192 | - if ( 'sections' === $part ) { |
|
| 193 | - foreach ( $bla as $field ) { |
|
| 194 | - |
|
| 195 | - foreach ( $field as $arg => $val ) { |
|
| 196 | - if ( 'fields' === $arg ) { |
|
| 197 | - foreach ( $val as $v ) { |
|
| 198 | - if ( ! empty( $v ) ) { |
|
| 199 | - foreach ( $v as $id => $x ) { |
|
| 200 | - if ( 'type' === $id ) { |
|
| 201 | - if ( 'social_profiles' === $x ) { |
|
| 202 | - return $v; |
|
| 203 | - } |
|
| 204 | - } |
|
| 205 | - } |
|
| 206 | - } |
|
| 207 | - } |
|
| 208 | - } |
|
| 209 | - } |
|
| 210 | - } |
|
| 211 | - } |
|
| 212 | - } |
|
| 213 | - } |
|
| 214 | - |
|
| 215 | - return null; |
|
| 216 | - } |
|
| 217 | - |
|
| 218 | - /** |
|
| 219 | - * Add extra icons. |
|
| 220 | - * |
|
| 221 | - * @param array $defaults Default values. |
|
| 222 | - * |
|
| 223 | - * @return array |
|
| 224 | - */ |
|
| 225 | - public static function add_extra_icons( array $defaults ): array { |
|
| 226 | - if ( empty( self::$field ) ) { |
|
| 227 | - self::$field = self::get_field(); |
|
| 228 | - } |
|
| 229 | - |
|
| 230 | - if ( isset( self::$field['icons'] ) && ! empty( self::$field['icons'] ) ) { |
|
| 231 | - $cur_count = count( $defaults ); |
|
| 232 | - |
|
| 233 | - foreach ( self::$field['icons'] as $arr ) { |
|
| 234 | - |
|
| 235 | - $skip_add = false; |
|
| 236 | - foreach ( $defaults as $i => $v ) { |
|
| 237 | - if ( $arr['id'] === $v['id'] ) { |
|
| 238 | - |
|
| 239 | - $defaults[ $i ] = array_replace( $v, $arr ); |
|
| 240 | - $skip_add = true; |
|
| 241 | - break; |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - if ( ! $skip_add ) { |
|
| 246 | - $arr['order'] = $cur_count; |
|
| 247 | - $defaults[ $cur_count ] = $arr; |
|
| 248 | - ++$cur_count; |
|
| 249 | - } |
|
| 250 | - } |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - return $defaults; |
|
| 254 | - } |
|
| 255 | - |
|
| 256 | - /** |
|
| 257 | - * Get Included files. |
|
| 258 | - * |
|
| 259 | - * @param array $val Value. |
|
| 260 | - * |
|
| 261 | - * @return array |
|
| 262 | - */ |
|
| 263 | - private static function get_includes( array $val ): array { |
|
| 264 | - if ( empty( self::$field ) ) { |
|
| 265 | - self::$field = self::get_field(); |
|
| 266 | - } |
|
| 267 | - |
|
| 268 | - if ( isset( self::$field['include'] ) && is_array( self::$field['include'] ) && ! empty( self::$field['include'] ) ) { |
|
| 269 | - $icons = self::$field['include']; |
|
| 270 | - |
|
| 271 | - $new_arr = array(); |
|
| 272 | - |
|
| 273 | - $idx = 0; |
|
| 274 | - foreach ( $val as $arr ) { |
|
| 275 | - foreach ( $icons as $icon ) { |
|
| 276 | - if ( $icon === $arr['id'] ) { |
|
| 277 | - $arr['order'] = $idx; |
|
| 278 | - $new_arr[ $idx ] = $arr; |
|
| 279 | - ++$idx; |
|
| 280 | - break; |
|
| 281 | - } |
|
| 282 | - } |
|
| 283 | - } |
|
| 284 | - } else { |
|
| 285 | - $new_arr = $val; |
|
| 286 | - } |
|
| 287 | - |
|
| 288 | - return $new_arr; |
|
| 289 | - } |
|
| 290 | - |
|
| 291 | - /** |
|
| 292 | - * Returns default data from config. |
|
| 293 | - * |
|
| 294 | - * @return array |
|
| 295 | - */ |
|
| 296 | - public static function get_default_data(): array { |
|
| 297 | - $data = Redux_Social_Profiles_Defaults::get_social_media_defaults(); |
|
| 298 | - $data = self::get_includes( $data ); |
|
| 299 | - |
|
| 300 | - return self::add_extra_icons( $data ); |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - /** |
|
| 304 | - * Static function to render the social icon. |
|
| 305 | - * |
|
| 306 | - * @param string $icon Icon css. |
|
| 307 | - * @param string $color Hex color. |
|
| 308 | - * @param string $background Background color. |
|
| 309 | - * @param string $title Icon title. |
|
| 310 | - * @param bool $output Print or echo. |
|
| 311 | - * |
|
| 312 | - * @return string|void |
|
| 313 | - */ |
|
| 314 | - public static function render_icon( string $icon, string $color, string $background, string $title, bool $output = true ) { |
|
| 315 | - if ( $color || $background ) { |
|
| 316 | - if ( '' === $color ) { |
|
| 317 | - $color = 'transparent'; |
|
| 318 | - } |
|
| 319 | - |
|
| 320 | - if ( '' === $background ) { |
|
| 321 | - $background = 'transparent'; |
|
| 322 | - } |
|
| 323 | - |
|
| 324 | - $inline = 'style="color:' . esc_attr( $color ) . ';background-color:' . esc_attr( $background ) . ';"'; |
|
| 325 | - } else { |
|
| 326 | - $inline = ''; |
|
| 327 | - } |
|
| 328 | - |
|
| 329 | - $str = '<i class="fa ' . $icon . '" ' . $inline . ' title="' . $title . '"></i>'; |
|
| 330 | - |
|
| 331 | - if ( $output ) { |
|
| 332 | - echo $str; // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 333 | - } else { |
|
| 334 | - return $str; |
|
| 335 | - } |
|
| 336 | - } |
|
| 337 | - } |
|
| 14 | + /** |
|
| 15 | + * Class Redux_Social_Profiles_Functions |
|
| 16 | + */ |
|
| 17 | + class Redux_Social_Profiles_Functions { |
|
| 18 | + /** |
|
| 19 | + * ReduxFramework object pointer. |
|
| 20 | + * |
|
| 21 | + * @var ReduxFramework |
|
| 22 | + */ |
|
| 23 | + public static ReduxFramework $parent; |
|
| 24 | + |
|
| 25 | + /** |
|
| 26 | + * Field ID. |
|
| 27 | + * |
|
| 28 | + * @var null|string |
|
| 29 | + */ |
|
| 30 | + public static ?string $field_id; |
|
| 31 | + |
|
| 32 | + /** |
|
| 33 | + * Field array. |
|
| 34 | + * |
|
| 35 | + * @var array|null |
|
| 36 | + */ |
|
| 37 | + public static ?array $field; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * WordPress upload directory. |
|
| 41 | + * |
|
| 42 | + * @var string |
|
| 43 | + */ |
|
| 44 | + public static string $upload_dir; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * WordPress upload URI. |
|
| 48 | + * |
|
| 49 | + * @var string |
|
| 50 | + */ |
|
| 51 | + public static string $upload_url; |
|
| 52 | + |
|
| 53 | + /** |
|
| 54 | + * Init helper library. |
|
| 55 | + * |
|
| 56 | + * @param ReduxFramework $redux ReduxFramework object. |
|
| 57 | + */ |
|
| 58 | + public static function init( ReduxFramework $redux ) { |
|
| 59 | + self::$parent = $redux; |
|
| 60 | + |
|
| 61 | + if ( empty( self::$field_id ) ) { |
|
| 62 | + self::$field = self::get_field( $redux ); |
|
| 63 | + |
|
| 64 | + if ( ! is_array( self::$field ) ) { |
|
| 65 | + return; |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + self::$field_id = self::$field['id']; |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + // Make sanitized upload dir DIR. |
|
| 72 | + self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_dir . 'social-profiles/' ); |
|
| 73 | + |
|
| 74 | + // Make sanitized upload dir URL. |
|
| 75 | + self::$upload_url = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_url . 'social-profiles/' ); |
|
| 76 | + |
|
| 77 | + Redux_Functions::init_wp_filesystem(); |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + /** |
|
| 81 | + * Read data file. |
|
| 82 | + * |
|
| 83 | + * @return array|bool|mixed|object |
|
| 84 | + */ |
|
| 85 | + public static function read_data_file() { |
|
| 86 | + $file = self::get_data_path(); |
|
| 87 | + |
|
| 88 | + if ( file_exists( $file ) ) { |
|
| 89 | + |
|
| 90 | + // Get the contents of the file and stuff it in a variable. |
|
| 91 | + $data = Redux_Core::$filesystem->execute( 'get_contents', $file ); |
|
| 92 | + |
|
| 93 | + // Error or null, set the result to false. |
|
| 94 | + if ( false === $data || null === $data ) { |
|
| 95 | + $arr_data = false; |
|
| 96 | + |
|
| 97 | + // Otherwise, decode the json object and return it. |
|
| 98 | + } else { |
|
| 99 | + $arr = json_decode( $data, true ); |
|
| 100 | + $arr_data = $arr; |
|
| 101 | + } |
|
| 102 | + } else { |
|
| 103 | + $arr_data = false; |
|
| 104 | + } |
|
| 105 | + |
|
| 106 | + return $arr_data; |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + /** |
|
| 110 | + * Write data file. |
|
| 111 | + * |
|
| 112 | + * @param array $arr_data Data. |
|
| 113 | + * @param string $file Filename. |
|
| 114 | + * |
|
| 115 | + * @return bool |
|
| 116 | + */ |
|
| 117 | + public static function write_data_file( array $arr_data, string $file = '' ): bool { |
|
| 118 | + if ( ! is_dir( self::$upload_dir ) ) { |
|
| 119 | + return false; |
|
| 120 | + } |
|
| 121 | + |
|
| 122 | + $file = ( '' === $file ) ? self::get_data_path() : self::$upload_dir . $file; |
|
| 123 | + |
|
| 124 | + // Encode the array data. |
|
| 125 | + $data = wp_json_encode( $arr_data ); |
|
| 126 | + |
|
| 127 | + // Write to its file on the server, return the return value |
|
| 128 | + // True on success, false on error. |
|
| 129 | + return Redux_Core::$filesystem->execute( 'put_contents', $file, array( 'content' => $data ) ); |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + /** |
|
| 133 | + * Get the data path. |
|
| 134 | + * |
|
| 135 | + * @return mixed|Redux_Functions_Ex|string |
|
| 136 | + */ |
|
| 137 | + public static function get_data_path() { |
|
| 138 | + return Redux_Functions_Ex::wp_normalize_path( self::$upload_dir . '/' . self::$parent->args['opt_name'] . '-' . self::$field_id . '.json' ); |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + /** |
|
| 142 | + * Get field. |
|
| 143 | + * |
|
| 144 | + * @param array|ReduxFramework $redux ReduxFramework object. |
|
| 145 | + * |
|
| 146 | + * @return mixed |
|
| 147 | + */ |
|
| 148 | + public static function get_field( $redux = array() ) { |
|
| 149 | + global $pagenow; |
|
| 150 | + |
|
| 151 | + if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) { |
|
| 152 | + $inst = Redux_Instances::get_instance( self::$parent->args['opt_name'] ); |
|
| 153 | + |
|
| 154 | + $ext = $inst->extensions; |
|
| 155 | + |
|
| 156 | + if ( isset( $ext['metaboxes'] ) ) { |
|
| 157 | + $obj = $ext['metaboxes']; |
|
| 158 | + $boxes = ( $obj->boxes ); |
|
| 159 | + |
|
| 160 | + foreach ( $boxes as $sections ) { |
|
| 161 | + foreach ( $sections['sections'] as $fields ) { |
|
| 162 | + if ( isset( $fields['fields'] ) ) { |
|
| 163 | + foreach ( $fields['fields'] as $f ) { |
|
| 164 | + if ( 'social_profiles' === $f['type'] ) { |
|
| 165 | + return $f; |
|
| 166 | + } |
|
| 167 | + |
|
| 168 | + if ( 'repeater' === $f['type'] ) { |
|
| 169 | + foreach ( $f['fields'] as $r ) { |
|
| 170 | + if ( 'social_profiles' === $r['type'] ) { |
|
| 171 | + return $r; |
|
| 172 | + } |
|
| 173 | + } |
|
| 174 | + } |
|
| 175 | + } |
|
| 176 | + } |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + } |
|
| 180 | + } else { |
|
| 181 | + if ( ! empty( $redux ) ) { |
|
| 182 | + self::$parent = $redux; |
|
| 183 | + } |
|
| 184 | + |
|
| 185 | + if ( isset( self::$parent->field_sections['social_profiles'] ) ) { |
|
| 186 | + return reset( self::$parent->field_sections['social_profiles'] ); |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + $arr = self::$parent; |
|
| 190 | + |
|
| 191 | + foreach ( $arr as $part => $bla ) { |
|
| 192 | + if ( 'sections' === $part ) { |
|
| 193 | + foreach ( $bla as $field ) { |
|
| 194 | + |
|
| 195 | + foreach ( $field as $arg => $val ) { |
|
| 196 | + if ( 'fields' === $arg ) { |
|
| 197 | + foreach ( $val as $v ) { |
|
| 198 | + if ( ! empty( $v ) ) { |
|
| 199 | + foreach ( $v as $id => $x ) { |
|
| 200 | + if ( 'type' === $id ) { |
|
| 201 | + if ( 'social_profiles' === $x ) { |
|
| 202 | + return $v; |
|
| 203 | + } |
|
| 204 | + } |
|
| 205 | + } |
|
| 206 | + } |
|
| 207 | + } |
|
| 208 | + } |
|
| 209 | + } |
|
| 210 | + } |
|
| 211 | + } |
|
| 212 | + } |
|
| 213 | + } |
|
| 214 | + |
|
| 215 | + return null; |
|
| 216 | + } |
|
| 217 | + |
|
| 218 | + /** |
|
| 219 | + * Add extra icons. |
|
| 220 | + * |
|
| 221 | + * @param array $defaults Default values. |
|
| 222 | + * |
|
| 223 | + * @return array |
|
| 224 | + */ |
|
| 225 | + public static function add_extra_icons( array $defaults ): array { |
|
| 226 | + if ( empty( self::$field ) ) { |
|
| 227 | + self::$field = self::get_field(); |
|
| 228 | + } |
|
| 229 | + |
|
| 230 | + if ( isset( self::$field['icons'] ) && ! empty( self::$field['icons'] ) ) { |
|
| 231 | + $cur_count = count( $defaults ); |
|
| 232 | + |
|
| 233 | + foreach ( self::$field['icons'] as $arr ) { |
|
| 234 | + |
|
| 235 | + $skip_add = false; |
|
| 236 | + foreach ( $defaults as $i => $v ) { |
|
| 237 | + if ( $arr['id'] === $v['id'] ) { |
|
| 238 | + |
|
| 239 | + $defaults[ $i ] = array_replace( $v, $arr ); |
|
| 240 | + $skip_add = true; |
|
| 241 | + break; |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + if ( ! $skip_add ) { |
|
| 246 | + $arr['order'] = $cur_count; |
|
| 247 | + $defaults[ $cur_count ] = $arr; |
|
| 248 | + ++$cur_count; |
|
| 249 | + } |
|
| 250 | + } |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + return $defaults; |
|
| 254 | + } |
|
| 255 | + |
|
| 256 | + /** |
|
| 257 | + * Get Included files. |
|
| 258 | + * |
|
| 259 | + * @param array $val Value. |
|
| 260 | + * |
|
| 261 | + * @return array |
|
| 262 | + */ |
|
| 263 | + private static function get_includes( array $val ): array { |
|
| 264 | + if ( empty( self::$field ) ) { |
|
| 265 | + self::$field = self::get_field(); |
|
| 266 | + } |
|
| 267 | + |
|
| 268 | + if ( isset( self::$field['include'] ) && is_array( self::$field['include'] ) && ! empty( self::$field['include'] ) ) { |
|
| 269 | + $icons = self::$field['include']; |
|
| 270 | + |
|
| 271 | + $new_arr = array(); |
|
| 272 | + |
|
| 273 | + $idx = 0; |
|
| 274 | + foreach ( $val as $arr ) { |
|
| 275 | + foreach ( $icons as $icon ) { |
|
| 276 | + if ( $icon === $arr['id'] ) { |
|
| 277 | + $arr['order'] = $idx; |
|
| 278 | + $new_arr[ $idx ] = $arr; |
|
| 279 | + ++$idx; |
|
| 280 | + break; |
|
| 281 | + } |
|
| 282 | + } |
|
| 283 | + } |
|
| 284 | + } else { |
|
| 285 | + $new_arr = $val; |
|
| 286 | + } |
|
| 287 | + |
|
| 288 | + return $new_arr; |
|
| 289 | + } |
|
| 290 | + |
|
| 291 | + /** |
|
| 292 | + * Returns default data from config. |
|
| 293 | + * |
|
| 294 | + * @return array |
|
| 295 | + */ |
|
| 296 | + public static function get_default_data(): array { |
|
| 297 | + $data = Redux_Social_Profiles_Defaults::get_social_media_defaults(); |
|
| 298 | + $data = self::get_includes( $data ); |
|
| 299 | + |
|
| 300 | + return self::add_extra_icons( $data ); |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + /** |
|
| 304 | + * Static function to render the social icon. |
|
| 305 | + * |
|
| 306 | + * @param string $icon Icon css. |
|
| 307 | + * @param string $color Hex color. |
|
| 308 | + * @param string $background Background color. |
|
| 309 | + * @param string $title Icon title. |
|
| 310 | + * @param bool $output Print or echo. |
|
| 311 | + * |
|
| 312 | + * @return string|void |
|
| 313 | + */ |
|
| 314 | + public static function render_icon( string $icon, string $color, string $background, string $title, bool $output = true ) { |
|
| 315 | + if ( $color || $background ) { |
|
| 316 | + if ( '' === $color ) { |
|
| 317 | + $color = 'transparent'; |
|
| 318 | + } |
|
| 319 | + |
|
| 320 | + if ( '' === $background ) { |
|
| 321 | + $background = 'transparent'; |
|
| 322 | + } |
|
| 323 | + |
|
| 324 | + $inline = 'style="color:' . esc_attr( $color ) . ';background-color:' . esc_attr( $background ) . ';"'; |
|
| 325 | + } else { |
|
| 326 | + $inline = ''; |
|
| 327 | + } |
|
| 328 | + |
|
| 329 | + $str = '<i class="fa ' . $icon . '" ' . $inline . ' title="' . $title . '"></i>'; |
|
| 330 | + |
|
| 331 | + if ( $output ) { |
|
| 332 | + echo $str; // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 333 | + } else { |
|
| 334 | + return $str; |
|
| 335 | + } |
|
| 336 | + } |
|
| 337 | + } |
|
| 338 | 338 | } |
@@ -34,7 +34,7 @@ discard block |
||
| 34 | 34 | * |
| 35 | 35 | * @var array|null |
| 36 | 36 | */ |
| 37 | - public static ?array $field; |
|
| 37 | + public static ? array $field; |
|
| 38 | 38 | |
| 39 | 39 | /** |
| 40 | 40 | * WordPress upload directory. |
@@ -236,7 +236,7 @@ discard block |
||
| 236 | 236 | foreach ( $defaults as $i => $v ) { |
| 237 | 237 | if ( $arr['id'] === $v['id'] ) { |
| 238 | 238 | |
| 239 | - $defaults[ $i ] = array_replace( $v, $arr ); |
|
| 239 | + $defaults[$i] = array_replace( $v, $arr ); |
|
| 240 | 240 | $skip_add = true; |
| 241 | 241 | break; |
| 242 | 242 | } |
@@ -244,7 +244,7 @@ discard block |
||
| 244 | 244 | |
| 245 | 245 | if ( ! $skip_add ) { |
| 246 | 246 | $arr['order'] = $cur_count; |
| 247 | - $defaults[ $cur_count ] = $arr; |
|
| 247 | + $defaults[$cur_count] = $arr; |
|
| 248 | 248 | ++$cur_count; |
| 249 | 249 | } |
| 250 | 250 | } |
@@ -275,7 +275,7 @@ discard block |
||
| 275 | 275 | foreach ( $icons as $icon ) { |
| 276 | 276 | if ( $icon === $arr['id'] ) { |
| 277 | 277 | $arr['order'] = $idx; |
| 278 | - $new_arr[ $idx ] = $arr; |
|
| 278 | + $new_arr[$idx] = $arr; |
|
| 279 | 279 | ++$idx; |
| 280 | 280 | break; |
| 281 | 281 | } |
@@ -15,108 +15,108 @@ discard block |
||
| 15 | 15 | */ |
| 16 | 16 | class Redux_Customizer_Section extends WP_Customize_Section { |
| 17 | 17 | |
| 18 | - /** |
|
| 19 | - * Type of this section. |
|
| 20 | - * |
|
| 21 | - * @since 4.1.0 |
|
| 22 | - * @access public |
|
| 23 | - * @var string |
|
| 24 | - */ |
|
| 25 | - public $type = 'redux'; |
|
| 26 | - |
|
| 27 | - /** |
|
| 28 | - * Panel opt_name. |
|
| 29 | - * |
|
| 30 | - * @since 4.0.0 |
|
| 31 | - * @access public |
|
| 32 | - * @var string |
|
| 33 | - */ |
|
| 34 | - public $opt_name = ''; |
|
| 35 | - |
|
| 36 | - /** |
|
| 37 | - * Section array. |
|
| 38 | - * |
|
| 39 | - * @var array|mixed |
|
| 40 | - */ |
|
| 41 | - public $section = array(); |
|
| 42 | - |
|
| 43 | - /** |
|
| 44 | - * Section array. |
|
| 45 | - * |
|
| 46 | - * @var string |
|
| 47 | - */ |
|
| 48 | - public string $wp_ver; |
|
| 49 | - |
|
| 50 | - /** |
|
| 51 | - * Constructor. |
|
| 52 | - * Any supplied $args override class property defaults. |
|
| 53 | - * |
|
| 54 | - * @since 3.4.0 |
|
| 55 | - * |
|
| 56 | - * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 57 | - * @param string $id A specific ID of the section. |
|
| 58 | - * @param array $args Section arguments. |
|
| 59 | - */ |
|
| 60 | - public function __construct( $manager, $id, $args = array() ) { |
|
| 61 | - global $wp_version; |
|
| 62 | - |
|
| 63 | - parent::__construct( $manager, $id, $args ); |
|
| 64 | - |
|
| 65 | - // Redux addition. |
|
| 66 | - if ( isset( $args['section'] ) ) { |
|
| 67 | - $this->section = $args['section']; |
|
| 68 | - $this->description = $this->section['desc'] ?? ''; |
|
| 69 | - $this->opt_name = $args['opt_name'] ?? ''; |
|
| 70 | - } |
|
| 71 | - |
|
| 72 | - $version = explode( '-', $wp_version ); |
|
| 73 | - $this->wp_ver = $version[0]; |
|
| 74 | - } |
|
| 75 | - |
|
| 76 | - /** |
|
| 77 | - * WP < 4.3 Render |
|
| 78 | - */ |
|
| 79 | - protected function render() { |
|
| 80 | - global $wp_version; |
|
| 81 | - $version = explode( '-', $wp_version ); |
|
| 82 | - if ( version_compare( $version[0], '4.3', '<' ) ) { |
|
| 83 | - $this->render_fallback(); |
|
| 84 | - } |
|
| 85 | - } |
|
| 86 | - |
|
| 87 | - /** |
|
| 88 | - * Render the section, and the controls that have been added to it. |
|
| 89 | - * |
|
| 90 | - * @since 3.4.0 |
|
| 91 | - */ |
|
| 92 | - protected function render_fallback() { |
|
| 93 | - $classes = 'accordion-section redux-section control-section control-section-' . $this->type; |
|
| 94 | - ?> |
|
| 18 | + /** |
|
| 19 | + * Type of this section. |
|
| 20 | + * |
|
| 21 | + * @since 4.1.0 |
|
| 22 | + * @access public |
|
| 23 | + * @var string |
|
| 24 | + */ |
|
| 25 | + public $type = 'redux'; |
|
| 26 | + |
|
| 27 | + /** |
|
| 28 | + * Panel opt_name. |
|
| 29 | + * |
|
| 30 | + * @since 4.0.0 |
|
| 31 | + * @access public |
|
| 32 | + * @var string |
|
| 33 | + */ |
|
| 34 | + public $opt_name = ''; |
|
| 35 | + |
|
| 36 | + /** |
|
| 37 | + * Section array. |
|
| 38 | + * |
|
| 39 | + * @var array|mixed |
|
| 40 | + */ |
|
| 41 | + public $section = array(); |
|
| 42 | + |
|
| 43 | + /** |
|
| 44 | + * Section array. |
|
| 45 | + * |
|
| 46 | + * @var string |
|
| 47 | + */ |
|
| 48 | + public string $wp_ver; |
|
| 49 | + |
|
| 50 | + /** |
|
| 51 | + * Constructor. |
|
| 52 | + * Any supplied $args override class property defaults. |
|
| 53 | + * |
|
| 54 | + * @since 3.4.0 |
|
| 55 | + * |
|
| 56 | + * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 57 | + * @param string $id A specific ID of the section. |
|
| 58 | + * @param array $args Section arguments. |
|
| 59 | + */ |
|
| 60 | + public function __construct( $manager, $id, $args = array() ) { |
|
| 61 | + global $wp_version; |
|
| 62 | + |
|
| 63 | + parent::__construct( $manager, $id, $args ); |
|
| 64 | + |
|
| 65 | + // Redux addition. |
|
| 66 | + if ( isset( $args['section'] ) ) { |
|
| 67 | + $this->section = $args['section']; |
|
| 68 | + $this->description = $this->section['desc'] ?? ''; |
|
| 69 | + $this->opt_name = $args['opt_name'] ?? ''; |
|
| 70 | + } |
|
| 71 | + |
|
| 72 | + $version = explode( '-', $wp_version ); |
|
| 73 | + $this->wp_ver = $version[0]; |
|
| 74 | + } |
|
| 75 | + |
|
| 76 | + /** |
|
| 77 | + * WP < 4.3 Render |
|
| 78 | + */ |
|
| 79 | + protected function render() { |
|
| 80 | + global $wp_version; |
|
| 81 | + $version = explode( '-', $wp_version ); |
|
| 82 | + if ( version_compare( $version[0], '4.3', '<' ) ) { |
|
| 83 | + $this->render_fallback(); |
|
| 84 | + } |
|
| 85 | + } |
|
| 86 | + |
|
| 87 | + /** |
|
| 88 | + * Render the section, and the controls that have been added to it. |
|
| 89 | + * |
|
| 90 | + * @since 3.4.0 |
|
| 91 | + */ |
|
| 92 | + protected function render_fallback() { |
|
| 93 | + $classes = 'accordion-section redux-section control-section control-section-' . $this->type; |
|
| 94 | + ?> |
|
| 95 | 95 | <li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>"> |
| 96 | 96 | <h3 class="accordion-section-title" tabindex="0"> |
| 97 | 97 | <?php |
| 98 | - echo wp_kses( |
|
| 99 | - $this->title, |
|
| 100 | - array( |
|
| 101 | - 'em' => array(), |
|
| 102 | - 'i' => array(), |
|
| 103 | - 'strong' => array(), |
|
| 104 | - 'span' => array( |
|
| 105 | - 'class' => array(), |
|
| 106 | - 'style' => array(), |
|
| 107 | - ), |
|
| 108 | - ) |
|
| 109 | - ); |
|
| 110 | - ?> |
|
| 98 | + echo wp_kses( |
|
| 99 | + $this->title, |
|
| 100 | + array( |
|
| 101 | + 'em' => array(), |
|
| 102 | + 'i' => array(), |
|
| 103 | + 'strong' => array(), |
|
| 104 | + 'span' => array( |
|
| 105 | + 'class' => array(), |
|
| 106 | + 'style' => array(), |
|
| 107 | + ), |
|
| 108 | + ) |
|
| 109 | + ); |
|
| 110 | + ?> |
|
| 111 | 111 | <span class="screen-reader-text"><?php esc_attr_e( 'Press return or enter to expand', 'redux-framework' ); ?></span> |
| 112 | 112 | </h3> |
| 113 | 113 | <ul class="accordion-section-content redux-main"> |
| 114 | 114 | <?php |
| 115 | - if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 116 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 117 | - do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 118 | - } |
|
| 119 | - ?> |
|
| 115 | + if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 116 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 117 | + do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 118 | + } |
|
| 119 | + ?> |
|
| 120 | 120 | <?php if ( ! empty( $this->description ) ) { ?> |
| 121 | 121 | <li class="customize-section-description-container"> |
| 122 | 122 | <p class="description customize-section-description legacy"><?php echo wp_kses_post( $this->description ); ?></p> |
@@ -125,60 +125,60 @@ discard block |
||
| 125 | 125 | </ul> |
| 126 | 126 | </li> |
| 127 | 127 | <?php |
| 128 | - } |
|
| 129 | - |
|
| 130 | - |
|
| 131 | - /** |
|
| 132 | - * Gather the parameters passed to client JavaScript via JSON. |
|
| 133 | - * |
|
| 134 | - * @since 4.1.0 |
|
| 135 | - * |
|
| 136 | - * @return array The array to be exported to the client as JSON. |
|
| 137 | - */ |
|
| 138 | - public function json(): array { |
|
| 139 | - $array = wp_array_slice_assoc( |
|
| 140 | - parent::json(), |
|
| 141 | - array( |
|
| 142 | - 'id', |
|
| 143 | - 'title', |
|
| 144 | - 'description', |
|
| 145 | - 'priority', |
|
| 146 | - 'panel', |
|
| 147 | - 'type', |
|
| 148 | - ) |
|
| 149 | - ); |
|
| 150 | - |
|
| 151 | - $array['content'] = $this->get_content(); |
|
| 152 | - $array['active'] = $this->active(); |
|
| 153 | - $array['instanceNumber'] = $this->instance_number; |
|
| 154 | - |
|
| 155 | - if ( $this->panel ) { |
|
| 156 | - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ |
|
| 157 | - $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); |
|
| 158 | - } else { |
|
| 159 | - $array['customizeAction'] = __( 'Customizing', 'redux-framework' ); |
|
| 160 | - } |
|
| 161 | - |
|
| 162 | - // BEGIN Redux Additions. |
|
| 163 | - $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 164 | - $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 165 | - |
|
| 166 | - $array['opt_name'] = $this->opt_name; |
|
| 167 | - |
|
| 168 | - return $array; |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * An Underscore (JS) template for rendering this section. |
|
| 173 | - * Class variables for this section class are available in the `data` JS object; |
|
| 174 | - * export custom variables by overriding {@see WP_Customize_Section::json()}. |
|
| 175 | - * |
|
| 176 | - * @see WP_Customize_Section::print_template() |
|
| 177 | - * @since 4.3.0 |
|
| 178 | - */ |
|
| 179 | - protected function render_template() { |
|
| 180 | - |
|
| 181 | - ?> |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + |
|
| 131 | + /** |
|
| 132 | + * Gather the parameters passed to client JavaScript via JSON. |
|
| 133 | + * |
|
| 134 | + * @since 4.1.0 |
|
| 135 | + * |
|
| 136 | + * @return array The array to be exported to the client as JSON. |
|
| 137 | + */ |
|
| 138 | + public function json(): array { |
|
| 139 | + $array = wp_array_slice_assoc( |
|
| 140 | + parent::json(), |
|
| 141 | + array( |
|
| 142 | + 'id', |
|
| 143 | + 'title', |
|
| 144 | + 'description', |
|
| 145 | + 'priority', |
|
| 146 | + 'panel', |
|
| 147 | + 'type', |
|
| 148 | + ) |
|
| 149 | + ); |
|
| 150 | + |
|
| 151 | + $array['content'] = $this->get_content(); |
|
| 152 | + $array['active'] = $this->active(); |
|
| 153 | + $array['instanceNumber'] = $this->instance_number; |
|
| 154 | + |
|
| 155 | + if ( $this->panel ) { |
|
| 156 | + /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ |
|
| 157 | + $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); |
|
| 158 | + } else { |
|
| 159 | + $array['customizeAction'] = __( 'Customizing', 'redux-framework' ); |
|
| 160 | + } |
|
| 161 | + |
|
| 162 | + // BEGIN Redux Additions. |
|
| 163 | + $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 164 | + $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 165 | + |
|
| 166 | + $array['opt_name'] = $this->opt_name; |
|
| 167 | + |
|
| 168 | + return $array; |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * An Underscore (JS) template for rendering this section. |
|
| 173 | + * Class variables for this section class are available in the `data` JS object; |
|
| 174 | + * export custom variables by overriding {@see WP_Customize_Section::json()}. |
|
| 175 | + * |
|
| 176 | + * @see WP_Customize_Section::print_template() |
|
| 177 | + * @since 4.3.0 |
|
| 178 | + */ |
|
| 179 | + protected function render_template() { |
|
| 180 | + |
|
| 181 | + ?> |
|
| 182 | 182 | <li id="accordion-section-{{ data.id }}" |
| 183 | 183 | class="redux-standalone-section redux-customizer-opt-name redux-section accordion-section control-section control-section-{{ data.type }}" |
| 184 | 184 | data-opt-name="{{ data.opt_name }}" |
@@ -210,14 +210,14 @@ discard block |
||
| 210 | 210 | <p class="description customize-section-description">{{{ data.description }}}</p> |
| 211 | 211 | <# } #> |
| 212 | 212 | <?php |
| 213 | - if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 214 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 215 | - do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 216 | - } |
|
| 217 | - ?> |
|
| 213 | + if ( isset( $this->opt_name ) && isset( $this->section ) ) { |
|
| 214 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 215 | + do_action( "redux/page/$this->opt_name/section/before", $this->section ); |
|
| 216 | + } |
|
| 217 | + ?> |
|
| 218 | 218 | </li> |
| 219 | 219 | </ul> |
| 220 | 220 | </li> |
| 221 | 221 | <?php |
| 222 | - } |
|
| 222 | + } |
|
| 223 | 223 | } |
@@ -19,83 +19,83 @@ discard block |
||
| 19 | 19 | */ |
| 20 | 20 | class Redux_Customizer_Panel extends WP_Customize_Panel { |
| 21 | 21 | |
| 22 | - /** |
|
| 23 | - * Type of this panel. |
|
| 24 | - * |
|
| 25 | - * @since 4.0.0 |
|
| 26 | - * @access public |
|
| 27 | - * @var string |
|
| 28 | - */ |
|
| 29 | - public $type = 'redux'; |
|
| 22 | + /** |
|
| 23 | + * Type of this panel. |
|
| 24 | + * |
|
| 25 | + * @since 4.0.0 |
|
| 26 | + * @access public |
|
| 27 | + * @var string |
|
| 28 | + */ |
|
| 29 | + public $type = 'redux'; |
|
| 30 | 30 | |
| 31 | - /** |
|
| 32 | - * Panel opt_name. |
|
| 33 | - * |
|
| 34 | - * @since 4.0.0 |
|
| 35 | - * @access public |
|
| 36 | - * @var string |
|
| 37 | - */ |
|
| 38 | - public $opt_name = ''; |
|
| 31 | + /** |
|
| 32 | + * Panel opt_name. |
|
| 33 | + * |
|
| 34 | + * @since 4.0.0 |
|
| 35 | + * @access public |
|
| 36 | + * @var string |
|
| 37 | + */ |
|
| 38 | + public $opt_name = ''; |
|
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * Section array. |
|
| 42 | - * |
|
| 43 | - * @var array|mixed |
|
| 44 | - */ |
|
| 45 | - public $section = array(); |
|
| 40 | + /** |
|
| 41 | + * Section array. |
|
| 42 | + * |
|
| 43 | + * @var array|mixed |
|
| 44 | + */ |
|
| 45 | + public $section = array(); |
|
| 46 | 46 | |
| 47 | - /** |
|
| 48 | - * Section array. |
|
| 49 | - * |
|
| 50 | - * @var string |
|
| 51 | - */ |
|
| 52 | - public string $wp_ver; |
|
| 47 | + /** |
|
| 48 | + * Section array. |
|
| 49 | + * |
|
| 50 | + * @var string |
|
| 51 | + */ |
|
| 52 | + public string $wp_ver; |
|
| 53 | 53 | |
| 54 | - /** |
|
| 55 | - * Constructor. |
|
| 56 | - * Any supplied $args override class property defaults. |
|
| 57 | - * |
|
| 58 | - * @since 4.0.0 |
|
| 59 | - * |
|
| 60 | - * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 61 | - * @param string $id A specific ID for the panel. |
|
| 62 | - * @param array $args Panel arguments. |
|
| 63 | - */ |
|
| 64 | - public function __construct( $manager, $id, $args = array() ) { |
|
| 65 | - global $wp_version; |
|
| 54 | + /** |
|
| 55 | + * Constructor. |
|
| 56 | + * Any supplied $args override class property defaults. |
|
| 57 | + * |
|
| 58 | + * @since 4.0.0 |
|
| 59 | + * |
|
| 60 | + * @param WP_Customize_Manager $manager Customizer bootstrap instance. |
|
| 61 | + * @param string $id A specific ID for the panel. |
|
| 62 | + * @param array $args Panel arguments. |
|
| 63 | + */ |
|
| 64 | + public function __construct( $manager, $id, $args = array() ) { |
|
| 65 | + global $wp_version; |
|
| 66 | 66 | |
| 67 | - parent::__construct( $manager, $id, $args ); |
|
| 67 | + parent::__construct( $manager, $id, $args ); |
|
| 68 | 68 | |
| 69 | - $version = explode( '-', $wp_version ); |
|
| 70 | - $this->wp_ver = $version[0]; |
|
| 69 | + $version = explode( '-', $wp_version ); |
|
| 70 | + $this->wp_ver = $version[0]; |
|
| 71 | 71 | |
| 72 | - // Redux addition. |
|
| 73 | - if ( isset( $args['section'] ) ) { |
|
| 74 | - $this->section = $args['section']; |
|
| 75 | - $this->description = $this->section['desc'] ?? ''; |
|
| 76 | - $this->opt_name = $args['opt_name'] ?? ''; |
|
| 77 | - } |
|
| 78 | - } |
|
| 72 | + // Redux addition. |
|
| 73 | + if ( isset( $args['section'] ) ) { |
|
| 74 | + $this->section = $args['section']; |
|
| 75 | + $this->description = $this->section['desc'] ?? ''; |
|
| 76 | + $this->opt_name = $args['opt_name'] ?? ''; |
|
| 77 | + } |
|
| 78 | + } |
|
| 79 | 79 | |
| 80 | - /** |
|
| 81 | - * WP < 4.3 Render |
|
| 82 | - * |
|
| 83 | - * @since |
|
| 84 | - * @access protected |
|
| 85 | - */ |
|
| 86 | - protected function render() { |
|
| 87 | - if ( version_compare( $this->wp_ver, '4.3', '<' ) ) { |
|
| 88 | - $this->render_fallback(); |
|
| 89 | - } |
|
| 90 | - } |
|
| 80 | + /** |
|
| 81 | + * WP < 4.3 Render |
|
| 82 | + * |
|
| 83 | + * @since |
|
| 84 | + * @access protected |
|
| 85 | + */ |
|
| 86 | + protected function render() { |
|
| 87 | + if ( version_compare( $this->wp_ver, '4.3', '<' ) ) { |
|
| 88 | + $this->render_fallback(); |
|
| 89 | + } |
|
| 90 | + } |
|
| 91 | 91 | |
| 92 | - /** |
|
| 93 | - * Render. |
|
| 94 | - */ |
|
| 95 | - protected function render_fallback() { |
|
| 96 | - $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type ); |
|
| 92 | + /** |
|
| 93 | + * Render. |
|
| 94 | + */ |
|
| 95 | + protected function render_fallback() { |
|
| 96 | + $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type ); |
|
| 97 | 97 | |
| 98 | - ?> |
|
| 98 | + ?> |
|
| 99 | 99 | <li id="accordion-panel-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>" |
| 100 | 100 | data-width="<?php echo isset( $this->section['customizer_width'] ) ? esc_attr( $this->section['customizer_width'] ) : ''; ?>"> |
| 101 | 101 | <h3 class="accordion-section-title" tabindex="0"> |
@@ -103,19 +103,19 @@ discard block |
||
| 103 | 103 | <i class="<?php echo esc_attr( $this->section['icon'] ); ?>"></i> |
| 104 | 104 | <?php endif; ?> |
| 105 | 105 | <?php |
| 106 | - echo wp_kses( |
|
| 107 | - $this->title, |
|
| 108 | - array( |
|
| 109 | - 'em' => array(), |
|
| 110 | - 'i' => array(), |
|
| 111 | - 'strong' => array(), |
|
| 112 | - 'span' => array( |
|
| 113 | - 'class' => array(), |
|
| 114 | - 'style' => array(), |
|
| 115 | - ), |
|
| 116 | - ) |
|
| 117 | - ); |
|
| 118 | - ?> |
|
| 106 | + echo wp_kses( |
|
| 107 | + $this->title, |
|
| 108 | + array( |
|
| 109 | + 'em' => array(), |
|
| 110 | + 'i' => array(), |
|
| 111 | + 'strong' => array(), |
|
| 112 | + 'span' => array( |
|
| 113 | + 'class' => array(), |
|
| 114 | + 'style' => array(), |
|
| 115 | + ), |
|
| 116 | + ) |
|
| 117 | + ); |
|
| 118 | + ?> |
|
| 119 | 119 | <span class="screen-reader-text"><?php esc_html_e( 'Press return or enter to open this panel', 'redux-framework' ); ?></span> |
| 120 | 120 | </h3> |
| 121 | 121 | <ul class="accordion-sub-container control-panel-content"> |
@@ -125,22 +125,22 @@ discard block |
||
| 125 | 125 | </ul> |
| 126 | 126 | </li> |
| 127 | 127 | <?php |
| 128 | - } |
|
| 128 | + } |
|
| 129 | 129 | |
| 130 | - /** |
|
| 131 | - * Render the sections that have been added to the panel. |
|
| 132 | - * |
|
| 133 | - * @since 4.1.0 |
|
| 134 | - * @access protected |
|
| 135 | - */ |
|
| 136 | - protected function render_content() { |
|
| 137 | - ?> |
|
| 130 | + /** |
|
| 131 | + * Render the sections that have been added to the panel. |
|
| 132 | + * |
|
| 133 | + * @since 4.1.0 |
|
| 134 | + * @access protected |
|
| 135 | + */ |
|
| 136 | + protected function render_content() { |
|
| 137 | + ?> |
|
| 138 | 138 | <li class="panel-meta accordion-section redux-panel redux-panel-meta control-section |
| 139 | 139 | <?php |
| 140 | - if ( empty( $this->description ) ) { |
|
| 141 | - echo ' cannot-expand'; |
|
| 142 | - } |
|
| 143 | - ?> |
|
| 140 | + if ( empty( $this->description ) ) { |
|
| 141 | + echo ' cannot-expand'; |
|
| 142 | + } |
|
| 143 | + ?> |
|
| 144 | 144 | "> |
| 145 | 145 | <div class="accordion-section-title" tabindex="0"> |
| 146 | 146 | <span class="preview-notice"> |
@@ -155,47 +155,47 @@ discard block |
||
| 155 | 155 | <?php } ?> |
| 156 | 156 | </li> |
| 157 | 157 | <?php |
| 158 | - } |
|
| 158 | + } |
|
| 159 | 159 | |
| 160 | - /** |
|
| 161 | - * JSON. |
|
| 162 | - * |
|
| 163 | - * @return array |
|
| 164 | - */ |
|
| 165 | - public function json(): array { |
|
| 166 | - $array = wp_array_slice_assoc( |
|
| 167 | - parent::json(), |
|
| 168 | - array( |
|
| 169 | - 'id', |
|
| 170 | - 'title', |
|
| 171 | - 'description', |
|
| 172 | - 'priority', |
|
| 173 | - 'type', |
|
| 174 | - ) |
|
| 175 | - ); |
|
| 160 | + /** |
|
| 161 | + * JSON. |
|
| 162 | + * |
|
| 163 | + * @return array |
|
| 164 | + */ |
|
| 165 | + public function json(): array { |
|
| 166 | + $array = wp_array_slice_assoc( |
|
| 167 | + parent::json(), |
|
| 168 | + array( |
|
| 169 | + 'id', |
|
| 170 | + 'title', |
|
| 171 | + 'description', |
|
| 172 | + 'priority', |
|
| 173 | + 'type', |
|
| 174 | + ) |
|
| 175 | + ); |
|
| 176 | 176 | |
| 177 | - $array['content'] = $this->get_content(); |
|
| 178 | - $array['active'] = $this->active(); |
|
| 179 | - $array['instanceNumber'] = $this->instance_number; |
|
| 177 | + $array['content'] = $this->get_content(); |
|
| 178 | + $array['active'] = $this->active(); |
|
| 179 | + $array['instanceNumber'] = $this->instance_number; |
|
| 180 | 180 | |
| 181 | - // BEGIN Redux Additions. |
|
| 182 | - $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 183 | - $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 181 | + // BEGIN Redux Additions. |
|
| 182 | + $array['width'] = $this->section['customizer_width'] ?? ''; |
|
| 183 | + $array['icon'] = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide'; |
|
| 184 | 184 | |
| 185 | - $array['opt_name'] = $this->opt_name; |
|
| 186 | - return $array; |
|
| 187 | - } |
|
| 185 | + $array['opt_name'] = $this->opt_name; |
|
| 186 | + return $array; |
|
| 187 | + } |
|
| 188 | 188 | |
| 189 | - /** |
|
| 190 | - * An Underscore (JS) template for this panel's content (but not its container). |
|
| 191 | - * Class variables for this panel class are available in the `data` JS object; |
|
| 192 | - * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 193 | - * |
|
| 194 | - * @see WP_Customize_Panel::print_template() |
|
| 195 | - * @since 4.3.0 |
|
| 196 | - */ |
|
| 197 | - protected function content_template() { |
|
| 198 | - ?> |
|
| 189 | + /** |
|
| 190 | + * An Underscore (JS) template for this panel's content (but not its container). |
|
| 191 | + * Class variables for this panel class are available in the `data` JS object; |
|
| 192 | + * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 193 | + * |
|
| 194 | + * @see WP_Customize_Panel::print_template() |
|
| 195 | + * @since 4.3.0 |
|
| 196 | + */ |
|
| 197 | + protected function content_template() { |
|
| 198 | + ?> |
|
| 199 | 199 | <li |
| 200 | 200 | class="panel-meta customize-info redux-customizer-opt-name redux-panel accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>" |
| 201 | 201 | data-opt-name="{{{ data.opt_name }}}"> |
@@ -223,18 +223,18 @@ discard block |
||
| 223 | 223 | <# } #> |
| 224 | 224 | </li> |
| 225 | 225 | <?php |
| 226 | - } |
|
| 226 | + } |
|
| 227 | 227 | |
| 228 | - /** |
|
| 229 | - * An Underscore (JS) template for rendering this panel's container. |
|
| 230 | - * Class variables for this panel class are available in the `data` JS object; |
|
| 231 | - * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 232 | - * |
|
| 233 | - * @see WP_Customize_Panel::print_template() |
|
| 234 | - * @since 4.3.0 |
|
| 235 | - */ |
|
| 236 | - protected function render_template() { |
|
| 237 | - ?> |
|
| 228 | + /** |
|
| 229 | + * An Underscore (JS) template for rendering this panel's container. |
|
| 230 | + * Class variables for this panel class are available in the `data` JS object; |
|
| 231 | + * export custom variables by overriding {@see WP_Customize_Panel::json()}. |
|
| 232 | + * |
|
| 233 | + * @see WP_Customize_Panel::print_template() |
|
| 234 | + * @since 4.3.0 |
|
| 235 | + */ |
|
| 236 | + protected function render_template() { |
|
| 237 | + ?> |
|
| 238 | 238 | <li id="accordion-panel-{{ data.id }}" |
| 239 | 239 | class="accordion-section redux-panel control-section control-panel control-panel-{{ data.type }}" |
| 240 | 240 | data-width="{{ data.width }}"> |
@@ -252,5 +252,5 @@ discard block |
||
| 252 | 252 | <ul class="accordion-sub-container control-panel-content"></ul> |
| 253 | 253 | </li> |
| 254 | 254 | <?php |
| 255 | - } |
|
| 255 | + } |
|
| 256 | 256 | } |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -1,1 +1,1 @@ |
||
| 1 | -<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 2 | 1 | \ No newline at end of file |
| 2 | +<?php /** * Redux Icon Select Font Awesome 6 Free icon array. * * @package Redux * @author Kevin Provance <[email protected]> */ defined( 'ABSPATH' ) || exit; if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) { /** * Array of free Font Awesome 6 icons. * * @return array */ function redux_icon_select_fa_6_free(): array { return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); } } |
|
| 3 | 3 | \ No newline at end of file |
@@ -13,631 +13,631 @@ |
||
| 13 | 13 | // Don't duplicate me! |
| 14 | 14 | if ( ! class_exists( 'Redux_Taxonomy' ) ) { |
| 15 | 15 | |
| 16 | - /** |
|
| 17 | - * Redux Taxonomy API Class |
|
| 18 | - * Simple API for Redux Framework |
|
| 19 | - * |
|
| 20 | - * @since 1.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Taxonomy { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * Terms array. |
|
| 26 | - * |
|
| 27 | - * @var array |
|
| 28 | - */ |
|
| 29 | - public static array $terms = 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_Taxonomy', '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( 'edit-tags.php', 'term.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_TAXONOMY_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 Terms |
|
| 149 | - * |
|
| 150 | - * @param string $opt_name Panel opt_name. |
|
| 151 | - * |
|
| 152 | - * @return array |
|
| 153 | - */ |
|
| 154 | - public static function construct_terms( string $opt_name ): array { |
|
| 155 | - $terms = array(); |
|
| 156 | - |
|
| 157 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 158 | - return $terms; |
|
| 159 | - } |
|
| 160 | - |
|
| 161 | - foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 162 | - $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
|
| 163 | - $terms[] = $term; |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - ksort( $terms ); |
|
| 167 | - |
|
| 168 | - return $terms; |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * Construct Sections. |
|
| 173 | - * |
|
| 174 | - * @param string $opt_name Panel opt_name. |
|
| 175 | - * @param string $term_id Term ID. |
|
| 176 | - * |
|
| 177 | - * @return array |
|
| 178 | - */ |
|
| 179 | - public static function construct_sections( string $opt_name, string $term_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['term_id'] === $term_id ) { |
|
| 188 | - self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $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 | - ksort( $sections ); |
|
| 202 | - |
|
| 203 | - return $sections; |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - /** |
|
| 207 | - * Construct Fields. |
|
| 208 | - * |
|
| 209 | - * @param string $opt_name Panel opt_name. |
|
| 210 | - * @param string $section_id Section ID. |
|
| 211 | - * @param bool $permissions Permissions. |
|
| 212 | - * @param bool $add_visibility Add visibility. |
|
| 213 | - * |
|
| 214 | - * @return array |
|
| 215 | - */ |
|
| 216 | - public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
|
| 217 | - $fields = array(); |
|
| 218 | - |
|
| 219 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 220 | - return $fields; |
|
| 221 | - } |
|
| 222 | - |
|
| 223 | - foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 224 | - // Nested permissions. |
|
| 225 | - $field['permissions'] = $field['permissions'] ?? $permissions; |
|
| 226 | - |
|
| 227 | - self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 228 | - |
|
| 229 | - // Nested add_visibility permissions. |
|
| 230 | - $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
|
| 231 | - |
|
| 232 | - self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 233 | - |
|
| 234 | - if ( $field['section_id'] === $section_id ) { |
|
| 235 | - $p = $field['priority']; |
|
| 236 | - |
|
| 237 | - while ( isset( $fields[ $p ] ) ) { |
|
| 238 | - echo esc_html( $p++ ); |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - $fields[ $p ] = $field; |
|
| 242 | - } |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - ksort( $fields ); |
|
| 246 | - |
|
| 247 | - return $fields; |
|
| 248 | - } |
|
| 249 | - |
|
| 250 | - /** |
|
| 251 | - * Get Section. |
|
| 252 | - * |
|
| 253 | - * @param string $opt_name Panel opt_name. |
|
| 254 | - * @param string $id ID. |
|
| 255 | - * |
|
| 256 | - * @return bool |
|
| 257 | - */ |
|
| 258 | - public static function get_section( string $opt_name = '', string $id = '' ): bool { |
|
| 259 | - self::check_opt_name( $opt_name ); |
|
| 260 | - |
|
| 261 | - if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 262 | - if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 263 | - $id = strtolower( sanitize_html_class( $id ) ); |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 267 | - } |
|
| 268 | - |
|
| 269 | - return false; |
|
| 270 | - } |
|
| 271 | - |
|
| 272 | - /** |
|
| 273 | - * Set_section. |
|
| 274 | - * |
|
| 275 | - * @param string $opt_name Panel opt_name. |
|
| 276 | - * @param array $section Section array. |
|
| 277 | - */ |
|
| 278 | - public static function set_section( string $opt_name = '', array $section = array() ) { |
|
| 279 | - self::check_opt_name( $opt_name ); |
|
| 280 | - |
|
| 281 | - if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) { |
|
| 282 | - if ( ! isset( $section['id'] ) ) { |
|
| 283 | - if ( isset( $section['title'] ) ) { |
|
| 284 | - $section['id'] = strtolower( sanitize_html_class( $section['title'] ) ); |
|
| 285 | - } else { |
|
| 286 | - $section['id'] = 'section'; |
|
| 287 | - } |
|
| 288 | - |
|
| 289 | - if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 290 | - $orig = $section['id']; |
|
| 291 | - $i = 0; |
|
| 292 | - |
|
| 293 | - while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 294 | - $section['id'] = $orig . '_' . $i; |
|
| 295 | - } |
|
| 296 | - } |
|
| 297 | - } |
|
| 298 | - |
|
| 299 | - if ( ! isset( $section['priority'] ) ) { |
|
| 300 | - $section['priority'] = self::get_priority( $opt_name, 'sections' ); |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - if ( isset( $section['fields'] ) ) { |
|
| 304 | - if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) { |
|
| 305 | - if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
|
| 306 | - foreach ( $section['fields'] as $key => $field ) { |
|
| 307 | - if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
|
| 308 | - $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 309 | - } |
|
| 310 | - |
|
| 311 | - if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
|
| 312 | - $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - self::process_fields_array( $opt_name, $section['id'], $section['fields'] ); |
|
| 318 | - } |
|
| 319 | - |
|
| 320 | - unset( $section['fields'] ); |
|
| 321 | - } |
|
| 322 | - |
|
| 323 | - self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 324 | - } else { |
|
| 325 | - 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' ); |
|
| 326 | - } |
|
| 327 | - } |
|
| 328 | - |
|
| 329 | - /** |
|
| 330 | - * Process Sections Array. |
|
| 331 | - * |
|
| 332 | - * @param string $opt_name Panel opt_name. |
|
| 333 | - * @param string $term_id Term ID. |
|
| 334 | - * @param array $sections Sections array. |
|
| 335 | - */ |
|
| 336 | - public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) { |
|
| 337 | - if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) { |
|
| 338 | - foreach ( $sections as $section ) { |
|
| 339 | - if ( ! is_array( $section ) ) { |
|
| 340 | - continue; |
|
| 341 | - } |
|
| 342 | - |
|
| 343 | - $section['term_id'] = $term_id; |
|
| 344 | - |
|
| 345 | - if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) { |
|
| 346 | - $section['fields'] = array(); |
|
| 347 | - } |
|
| 348 | - |
|
| 349 | - self::set_section( $opt_name, $section ); |
|
| 350 | - } |
|
| 351 | - } |
|
| 352 | - } |
|
| 353 | - |
|
| 354 | - /** |
|
| 355 | - * Process field array. |
|
| 356 | - * |
|
| 357 | - * @param string $opt_name Panel opt_name. |
|
| 358 | - * @param string $section_id Section ID. |
|
| 359 | - * @param array $fields Fields array. |
|
| 360 | - */ |
|
| 361 | - public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) { |
|
| 362 | - if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) { |
|
| 363 | - foreach ( $fields as $field ) { |
|
| 364 | - if ( ! is_array( $field ) ) { |
|
| 365 | - continue; |
|
| 366 | - } |
|
| 367 | - |
|
| 368 | - $field['section_id'] = $section_id; |
|
| 369 | - |
|
| 370 | - self::set_field( $opt_name, $field ); |
|
| 371 | - } |
|
| 372 | - } |
|
| 373 | - } |
|
| 374 | - |
|
| 375 | - /** |
|
| 376 | - * Get field. |
|
| 377 | - * |
|
| 378 | - * @param string $opt_name Panel opt_name. |
|
| 379 | - * @param string $id ID. |
|
| 380 | - * |
|
| 381 | - * @return bool |
|
| 382 | - */ |
|
| 383 | - public static function get_field( string $opt_name = '', string $id = '' ): bool { |
|
| 384 | - self::check_opt_name( $opt_name ); |
|
| 385 | - |
|
| 386 | - if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 387 | - return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 388 | - } |
|
| 389 | - |
|
| 390 | - return false; |
|
| 391 | - } |
|
| 392 | - |
|
| 393 | - /** |
|
| 394 | - * Set field. |
|
| 395 | - * |
|
| 396 | - * @param string $opt_name Panel opt_name. |
|
| 397 | - * @param array $field Field array. |
|
| 398 | - */ |
|
| 399 | - public static function set_field( string $opt_name = '', array $field = array() ) { |
|
| 400 | - self::check_opt_name( $opt_name ); |
|
| 401 | - |
|
| 402 | - if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) { |
|
| 403 | - if ( ! isset( $field['priority'] ) ) { |
|
| 404 | - $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
|
| 405 | - } |
|
| 406 | - |
|
| 407 | - self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 408 | - } |
|
| 409 | - } |
|
| 410 | - |
|
| 411 | - /** |
|
| 412 | - * Set args. |
|
| 413 | - * |
|
| 414 | - * @param string $opt_name Panel opt_name. |
|
| 415 | - * @param array $args Args array. |
|
| 416 | - */ |
|
| 417 | - public static function set_args( string $opt_name = '', array $args = array() ) { |
|
| 418 | - self::check_opt_name( $opt_name ); |
|
| 419 | - |
|
| 420 | - if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
|
| 421 | - self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | - self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 423 | - } |
|
| 424 | - } |
|
| 425 | - |
|
| 426 | - /** |
|
| 427 | - * Set term. |
|
| 428 | - * |
|
| 429 | - * @param string $opt_name Panel opt_name. |
|
| 430 | - * @param array $term Term array. |
|
| 431 | - */ |
|
| 432 | - public static function set_term( string $opt_name = '', array $term = array() ) { |
|
| 433 | - self::check_opt_name( $opt_name ); |
|
| 434 | - |
|
| 435 | - if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) { |
|
| 436 | - if ( ! isset( $term['id'] ) ) { |
|
| 437 | - if ( isset( $term['title'] ) ) { |
|
| 438 | - $term['id'] = strtolower( sanitize_html_class( $term['title'] ) ); |
|
| 439 | - } else { |
|
| 440 | - $term['id'] = 'term'; |
|
| 441 | - } |
|
| 442 | - |
|
| 443 | - if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 444 | - $orig = $term['id']; |
|
| 445 | - $i = 0; |
|
| 446 | - |
|
| 447 | - while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 448 | - $term['id'] = $orig . '_' . $i; |
|
| 449 | - } |
|
| 450 | - } |
|
| 451 | - } |
|
| 452 | - |
|
| 453 | - if ( isset( $term['sections'] ) ) { |
|
| 454 | - if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) { |
|
| 455 | - if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
|
| 456 | - foreach ( $term['sections'] as $key => $section ) { |
|
| 457 | - if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
|
| 458 | - $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 459 | - } |
|
| 460 | - |
|
| 461 | - if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
|
| 462 | - $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 463 | - } |
|
| 464 | - } |
|
| 465 | - } |
|
| 466 | - |
|
| 467 | - self::process_sections_array( $opt_name, $term['id'], $term['sections'] ); |
|
| 468 | - } |
|
| 469 | - |
|
| 470 | - unset( $term['sections'] ); |
|
| 471 | - } |
|
| 472 | - |
|
| 473 | - self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 474 | - } else { |
|
| 475 | - self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | - } |
|
| 477 | - } |
|
| 478 | - |
|
| 479 | - /** |
|
| 480 | - * Get terms. |
|
| 481 | - * |
|
| 482 | - * @param string $opt_name Panel opt_name. |
|
| 483 | - * |
|
| 484 | - * @return mixed |
|
| 485 | - */ |
|
| 486 | - public static function get_terms( string $opt_name = '' ) { |
|
| 487 | - self::check_opt_name( $opt_name ); |
|
| 488 | - |
|
| 489 | - if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | - return self::$terms[ $opt_name ]; |
|
| 491 | - } |
|
| 492 | - |
|
| 493 | - return false; |
|
| 494 | - } |
|
| 495 | - |
|
| 496 | - /** |
|
| 497 | - * Get priority. |
|
| 498 | - * |
|
| 499 | - * @param string $opt_name Panel opt_name. |
|
| 500 | - * @param string $type Field type. |
|
| 501 | - * |
|
| 502 | - * @return mixed |
|
| 503 | - */ |
|
| 504 | - public static function get_priority( string $opt_name, string $type ) { |
|
| 505 | - $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | - self::$priority[ $opt_name ][ $type ] += 1; |
|
| 507 | - |
|
| 508 | - return $priority; |
|
| 509 | - } |
|
| 510 | - |
|
| 511 | - /** |
|
| 512 | - * Check opt_name. |
|
| 513 | - * |
|
| 514 | - * @param string $opt_name Panel opt_name. |
|
| 515 | - */ |
|
| 516 | - public static function check_opt_name( string $opt_name = '' ) { |
|
| 517 | - if ( empty( $opt_name ) || is_array( $opt_name ) ) { |
|
| 518 | - return; |
|
| 519 | - } |
|
| 520 | - |
|
| 521 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | - self::$terms[ $opt_name ] = array(); |
|
| 523 | - } |
|
| 524 | - |
|
| 525 | - if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | - self::$priority[ $opt_name ]['args'] = 1; |
|
| 527 | - } |
|
| 528 | - |
|
| 529 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | - self::$sections[ $opt_name ] = array(); |
|
| 531 | - self::$priority[ $opt_name ]['sections'] = 1; |
|
| 532 | - } |
|
| 533 | - |
|
| 534 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | - self::$fields[ $opt_name ] = array(); |
|
| 536 | - self::$priority[ $opt_name ]['fields'] = 1; |
|
| 537 | - } |
|
| 538 | - |
|
| 539 | - if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | - self::$errors[ $opt_name ] = array(); |
|
| 541 | - } |
|
| 542 | - |
|
| 543 | - if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | - self::$init[ $opt_name ] = false; |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | - self::$args[ $opt_name ] = false; |
|
| 549 | - } |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - /** |
|
| 553 | - * Get field defaults. |
|
| 554 | - * |
|
| 555 | - * @param string $opt_name Panel opt_name. |
|
| 556 | - * |
|
| 557 | - * @return array|void |
|
| 558 | - */ |
|
| 559 | - public static function get_field_defaults( string $opt_name ) { |
|
| 560 | - if ( empty( $opt_name ) ) { |
|
| 561 | - return; |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 565 | - return array(); |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | - return array_map( |
|
| 569 | - function ( $field ) { |
|
| 570 | - return $field['default'] ?? ''; |
|
| 571 | - }, |
|
| 572 | - self::$fields[ $opt_name ] |
|
| 573 | - ); |
|
| 574 | - } |
|
| 575 | - |
|
| 576 | - /** |
|
| 577 | - * Get term meta. |
|
| 578 | - * |
|
| 579 | - * @param array $args Args array. |
|
| 580 | - * |
|
| 581 | - * @return array|mixed|string |
|
| 582 | - */ |
|
| 583 | - public static function get_term_meta( array $args = array() ) { |
|
| 584 | - $default = array( |
|
| 585 | - 'key' => '', |
|
| 586 | - 'opt_name' => '', |
|
| 587 | - 'taxonomy' => '', |
|
| 588 | - ); |
|
| 589 | - |
|
| 590 | - $args = wp_parse_args( $args, $default ); |
|
| 591 | - |
|
| 592 | - // phpcs:ignore WordPress.PHP.DontExtract |
|
| 593 | - extract( $args ); |
|
| 594 | - |
|
| 595 | - if ( empty( $taxonomy ) ) { |
|
| 596 | - return array(); |
|
| 597 | - } |
|
| 598 | - |
|
| 599 | - $single = ! empty( $key ); |
|
| 600 | - |
|
| 601 | - $meta = get_term_meta( $taxonomy, $key, $single ); |
|
| 602 | - |
|
| 603 | - // phpcs:ignore Generic.CodeAnalysis.EmptyStatement |
|
| 604 | - if ( $single ) { |
|
| 605 | - // Do nothing. |
|
| 606 | - } elseif ( ! empty( $meta ) ) { |
|
| 607 | - foreach ( $meta as $key => $value ) { |
|
| 608 | - if ( is_array( $value ) ) { |
|
| 609 | - $value = $value[0]; |
|
| 610 | - } |
|
| 611 | - |
|
| 612 | - $meta[ $key ] = maybe_unserialize( $value ); |
|
| 613 | - } |
|
| 614 | - } |
|
| 615 | - |
|
| 616 | - if ( ! empty( $opt_name ) ) { |
|
| 617 | - $defaults = self::get_field_defaults( $opt_name ); |
|
| 618 | - |
|
| 619 | - if ( $single ) { |
|
| 620 | - $default_value = ''; |
|
| 621 | - |
|
| 622 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | - $default_value = $defaults[ $key ]; |
|
| 624 | - } |
|
| 625 | - |
|
| 626 | - if ( is_array( $meta ) ) { |
|
| 627 | - if ( is_array( $default_value ) ) { |
|
| 628 | - $meta = wp_parse_args( $meta, $default_value ); |
|
| 629 | - } |
|
| 630 | - } elseif ( '' === $meta && '' !== $default_value ) { |
|
| 631 | - $meta = $default_value; |
|
| 632 | - } |
|
| 633 | - } else { |
|
| 634 | - $meta = wp_parse_args( $meta, $defaults ); |
|
| 635 | - } |
|
| 636 | - } |
|
| 637 | - |
|
| 638 | - return $meta; |
|
| 639 | - } |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - Redux_Taxonomy::load(); |
|
| 16 | + /** |
|
| 17 | + * Redux Taxonomy API Class |
|
| 18 | + * Simple API for Redux Framework |
|
| 19 | + * |
|
| 20 | + * @since 1.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Taxonomy { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * Terms array. |
|
| 26 | + * |
|
| 27 | + * @var array |
|
| 28 | + */ |
|
| 29 | + public static array $terms = 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_Taxonomy', '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( 'edit-tags.php', 'term.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_TAXONOMY_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 Terms |
|
| 149 | + * |
|
| 150 | + * @param string $opt_name Panel opt_name. |
|
| 151 | + * |
|
| 152 | + * @return array |
|
| 153 | + */ |
|
| 154 | + public static function construct_terms( string $opt_name ): array { |
|
| 155 | + $terms = array(); |
|
| 156 | + |
|
| 157 | + if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 158 | + return $terms; |
|
| 159 | + } |
|
| 160 | + |
|
| 161 | + foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 162 | + $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
|
| 163 | + $terms[] = $term; |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + ksort( $terms ); |
|
| 167 | + |
|
| 168 | + return $terms; |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * Construct Sections. |
|
| 173 | + * |
|
| 174 | + * @param string $opt_name Panel opt_name. |
|
| 175 | + * @param string $term_id Term ID. |
|
| 176 | + * |
|
| 177 | + * @return array |
|
| 178 | + */ |
|
| 179 | + public static function construct_sections( string $opt_name, string $term_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['term_id'] === $term_id ) { |
|
| 188 | + self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $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 | + ksort( $sections ); |
|
| 202 | + |
|
| 203 | + return $sections; |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + /** |
|
| 207 | + * Construct Fields. |
|
| 208 | + * |
|
| 209 | + * @param string $opt_name Panel opt_name. |
|
| 210 | + * @param string $section_id Section ID. |
|
| 211 | + * @param bool $permissions Permissions. |
|
| 212 | + * @param bool $add_visibility Add visibility. |
|
| 213 | + * |
|
| 214 | + * @return array |
|
| 215 | + */ |
|
| 216 | + public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
|
| 217 | + $fields = array(); |
|
| 218 | + |
|
| 219 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 220 | + return $fields; |
|
| 221 | + } |
|
| 222 | + |
|
| 223 | + foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 224 | + // Nested permissions. |
|
| 225 | + $field['permissions'] = $field['permissions'] ?? $permissions; |
|
| 226 | + |
|
| 227 | + self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 228 | + |
|
| 229 | + // Nested add_visibility permissions. |
|
| 230 | + $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
|
| 231 | + |
|
| 232 | + self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 233 | + |
|
| 234 | + if ( $field['section_id'] === $section_id ) { |
|
| 235 | + $p = $field['priority']; |
|
| 236 | + |
|
| 237 | + while ( isset( $fields[ $p ] ) ) { |
|
| 238 | + echo esc_html( $p++ ); |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + $fields[ $p ] = $field; |
|
| 242 | + } |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + ksort( $fields ); |
|
| 246 | + |
|
| 247 | + return $fields; |
|
| 248 | + } |
|
| 249 | + |
|
| 250 | + /** |
|
| 251 | + * Get Section. |
|
| 252 | + * |
|
| 253 | + * @param string $opt_name Panel opt_name. |
|
| 254 | + * @param string $id ID. |
|
| 255 | + * |
|
| 256 | + * @return bool |
|
| 257 | + */ |
|
| 258 | + public static function get_section( string $opt_name = '', string $id = '' ): bool { |
|
| 259 | + self::check_opt_name( $opt_name ); |
|
| 260 | + |
|
| 261 | + if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 262 | + if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 263 | + $id = strtolower( sanitize_html_class( $id ) ); |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 267 | + } |
|
| 268 | + |
|
| 269 | + return false; |
|
| 270 | + } |
|
| 271 | + |
|
| 272 | + /** |
|
| 273 | + * Set_section. |
|
| 274 | + * |
|
| 275 | + * @param string $opt_name Panel opt_name. |
|
| 276 | + * @param array $section Section array. |
|
| 277 | + */ |
|
| 278 | + public static function set_section( string $opt_name = '', array $section = array() ) { |
|
| 279 | + self::check_opt_name( $opt_name ); |
|
| 280 | + |
|
| 281 | + if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) { |
|
| 282 | + if ( ! isset( $section['id'] ) ) { |
|
| 283 | + if ( isset( $section['title'] ) ) { |
|
| 284 | + $section['id'] = strtolower( sanitize_html_class( $section['title'] ) ); |
|
| 285 | + } else { |
|
| 286 | + $section['id'] = 'section'; |
|
| 287 | + } |
|
| 288 | + |
|
| 289 | + if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 290 | + $orig = $section['id']; |
|
| 291 | + $i = 0; |
|
| 292 | + |
|
| 293 | + while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 294 | + $section['id'] = $orig . '_' . $i; |
|
| 295 | + } |
|
| 296 | + } |
|
| 297 | + } |
|
| 298 | + |
|
| 299 | + if ( ! isset( $section['priority'] ) ) { |
|
| 300 | + $section['priority'] = self::get_priority( $opt_name, 'sections' ); |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + if ( isset( $section['fields'] ) ) { |
|
| 304 | + if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) { |
|
| 305 | + if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
|
| 306 | + foreach ( $section['fields'] as $key => $field ) { |
|
| 307 | + if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
|
| 308 | + $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 309 | + } |
|
| 310 | + |
|
| 311 | + if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
|
| 312 | + $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + self::process_fields_array( $opt_name, $section['id'], $section['fields'] ); |
|
| 318 | + } |
|
| 319 | + |
|
| 320 | + unset( $section['fields'] ); |
|
| 321 | + } |
|
| 322 | + |
|
| 323 | + self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 324 | + } else { |
|
| 325 | + 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' ); |
|
| 326 | + } |
|
| 327 | + } |
|
| 328 | + |
|
| 329 | + /** |
|
| 330 | + * Process Sections Array. |
|
| 331 | + * |
|
| 332 | + * @param string $opt_name Panel opt_name. |
|
| 333 | + * @param string $term_id Term ID. |
|
| 334 | + * @param array $sections Sections array. |
|
| 335 | + */ |
|
| 336 | + public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) { |
|
| 337 | + if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) { |
|
| 338 | + foreach ( $sections as $section ) { |
|
| 339 | + if ( ! is_array( $section ) ) { |
|
| 340 | + continue; |
|
| 341 | + } |
|
| 342 | + |
|
| 343 | + $section['term_id'] = $term_id; |
|
| 344 | + |
|
| 345 | + if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) { |
|
| 346 | + $section['fields'] = array(); |
|
| 347 | + } |
|
| 348 | + |
|
| 349 | + self::set_section( $opt_name, $section ); |
|
| 350 | + } |
|
| 351 | + } |
|
| 352 | + } |
|
| 353 | + |
|
| 354 | + /** |
|
| 355 | + * Process field array. |
|
| 356 | + * |
|
| 357 | + * @param string $opt_name Panel opt_name. |
|
| 358 | + * @param string $section_id Section ID. |
|
| 359 | + * @param array $fields Fields array. |
|
| 360 | + */ |
|
| 361 | + public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) { |
|
| 362 | + if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) { |
|
| 363 | + foreach ( $fields as $field ) { |
|
| 364 | + if ( ! is_array( $field ) ) { |
|
| 365 | + continue; |
|
| 366 | + } |
|
| 367 | + |
|
| 368 | + $field['section_id'] = $section_id; |
|
| 369 | + |
|
| 370 | + self::set_field( $opt_name, $field ); |
|
| 371 | + } |
|
| 372 | + } |
|
| 373 | + } |
|
| 374 | + |
|
| 375 | + /** |
|
| 376 | + * Get field. |
|
| 377 | + * |
|
| 378 | + * @param string $opt_name Panel opt_name. |
|
| 379 | + * @param string $id ID. |
|
| 380 | + * |
|
| 381 | + * @return bool |
|
| 382 | + */ |
|
| 383 | + public static function get_field( string $opt_name = '', string $id = '' ): bool { |
|
| 384 | + self::check_opt_name( $opt_name ); |
|
| 385 | + |
|
| 386 | + if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
|
| 387 | + return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 388 | + } |
|
| 389 | + |
|
| 390 | + return false; |
|
| 391 | + } |
|
| 392 | + |
|
| 393 | + /** |
|
| 394 | + * Set field. |
|
| 395 | + * |
|
| 396 | + * @param string $opt_name Panel opt_name. |
|
| 397 | + * @param array $field Field array. |
|
| 398 | + */ |
|
| 399 | + public static function set_field( string $opt_name = '', array $field = array() ) { |
|
| 400 | + self::check_opt_name( $opt_name ); |
|
| 401 | + |
|
| 402 | + if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) { |
|
| 403 | + if ( ! isset( $field['priority'] ) ) { |
|
| 404 | + $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
|
| 405 | + } |
|
| 406 | + |
|
| 407 | + self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 408 | + } |
|
| 409 | + } |
|
| 410 | + |
|
| 411 | + /** |
|
| 412 | + * Set args. |
|
| 413 | + * |
|
| 414 | + * @param string $opt_name Panel opt_name. |
|
| 415 | + * @param array $args Args array. |
|
| 416 | + */ |
|
| 417 | + public static function set_args( string $opt_name = '', array $args = array() ) { |
|
| 418 | + self::check_opt_name( $opt_name ); |
|
| 419 | + |
|
| 420 | + if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
|
| 421 | + self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | + self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 423 | + } |
|
| 424 | + } |
|
| 425 | + |
|
| 426 | + /** |
|
| 427 | + * Set term. |
|
| 428 | + * |
|
| 429 | + * @param string $opt_name Panel opt_name. |
|
| 430 | + * @param array $term Term array. |
|
| 431 | + */ |
|
| 432 | + public static function set_term( string $opt_name = '', array $term = array() ) { |
|
| 433 | + self::check_opt_name( $opt_name ); |
|
| 434 | + |
|
| 435 | + if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) { |
|
| 436 | + if ( ! isset( $term['id'] ) ) { |
|
| 437 | + if ( isset( $term['title'] ) ) { |
|
| 438 | + $term['id'] = strtolower( sanitize_html_class( $term['title'] ) ); |
|
| 439 | + } else { |
|
| 440 | + $term['id'] = 'term'; |
|
| 441 | + } |
|
| 442 | + |
|
| 443 | + if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 444 | + $orig = $term['id']; |
|
| 445 | + $i = 0; |
|
| 446 | + |
|
| 447 | + while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 448 | + $term['id'] = $orig . '_' . $i; |
|
| 449 | + } |
|
| 450 | + } |
|
| 451 | + } |
|
| 452 | + |
|
| 453 | + if ( isset( $term['sections'] ) ) { |
|
| 454 | + if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) { |
|
| 455 | + if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
|
| 456 | + foreach ( $term['sections'] as $key => $section ) { |
|
| 457 | + if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
|
| 458 | + $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 459 | + } |
|
| 460 | + |
|
| 461 | + if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
|
| 462 | + $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 463 | + } |
|
| 464 | + } |
|
| 465 | + } |
|
| 466 | + |
|
| 467 | + self::process_sections_array( $opt_name, $term['id'], $term['sections'] ); |
|
| 468 | + } |
|
| 469 | + |
|
| 470 | + unset( $term['sections'] ); |
|
| 471 | + } |
|
| 472 | + |
|
| 473 | + self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 474 | + } else { |
|
| 475 | + self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | + } |
|
| 477 | + } |
|
| 478 | + |
|
| 479 | + /** |
|
| 480 | + * Get terms. |
|
| 481 | + * |
|
| 482 | + * @param string $opt_name Panel opt_name. |
|
| 483 | + * |
|
| 484 | + * @return mixed |
|
| 485 | + */ |
|
| 486 | + public static function get_terms( string $opt_name = '' ) { |
|
| 487 | + self::check_opt_name( $opt_name ); |
|
| 488 | + |
|
| 489 | + if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | + return self::$terms[ $opt_name ]; |
|
| 491 | + } |
|
| 492 | + |
|
| 493 | + return false; |
|
| 494 | + } |
|
| 495 | + |
|
| 496 | + /** |
|
| 497 | + * Get priority. |
|
| 498 | + * |
|
| 499 | + * @param string $opt_name Panel opt_name. |
|
| 500 | + * @param string $type Field type. |
|
| 501 | + * |
|
| 502 | + * @return mixed |
|
| 503 | + */ |
|
| 504 | + public static function get_priority( string $opt_name, string $type ) { |
|
| 505 | + $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | + self::$priority[ $opt_name ][ $type ] += 1; |
|
| 507 | + |
|
| 508 | + return $priority; |
|
| 509 | + } |
|
| 510 | + |
|
| 511 | + /** |
|
| 512 | + * Check opt_name. |
|
| 513 | + * |
|
| 514 | + * @param string $opt_name Panel opt_name. |
|
| 515 | + */ |
|
| 516 | + public static function check_opt_name( string $opt_name = '' ) { |
|
| 517 | + if ( empty( $opt_name ) || is_array( $opt_name ) ) { |
|
| 518 | + return; |
|
| 519 | + } |
|
| 520 | + |
|
| 521 | + if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | + self::$terms[ $opt_name ] = array(); |
|
| 523 | + } |
|
| 524 | + |
|
| 525 | + if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | + self::$priority[ $opt_name ]['args'] = 1; |
|
| 527 | + } |
|
| 528 | + |
|
| 529 | + if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | + self::$sections[ $opt_name ] = array(); |
|
| 531 | + self::$priority[ $opt_name ]['sections'] = 1; |
|
| 532 | + } |
|
| 533 | + |
|
| 534 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | + self::$fields[ $opt_name ] = array(); |
|
| 536 | + self::$priority[ $opt_name ]['fields'] = 1; |
|
| 537 | + } |
|
| 538 | + |
|
| 539 | + if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | + self::$errors[ $opt_name ] = array(); |
|
| 541 | + } |
|
| 542 | + |
|
| 543 | + if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | + self::$init[ $opt_name ] = false; |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | + self::$args[ $opt_name ] = false; |
|
| 549 | + } |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + /** |
|
| 553 | + * Get field defaults. |
|
| 554 | + * |
|
| 555 | + * @param string $opt_name Panel opt_name. |
|
| 556 | + * |
|
| 557 | + * @return array|void |
|
| 558 | + */ |
|
| 559 | + public static function get_field_defaults( string $opt_name ) { |
|
| 560 | + if ( empty( $opt_name ) ) { |
|
| 561 | + return; |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 565 | + return array(); |
|
| 566 | + } |
|
| 567 | + |
|
| 568 | + return array_map( |
|
| 569 | + function ( $field ) { |
|
| 570 | + return $field['default'] ?? ''; |
|
| 571 | + }, |
|
| 572 | + self::$fields[ $opt_name ] |
|
| 573 | + ); |
|
| 574 | + } |
|
| 575 | + |
|
| 576 | + /** |
|
| 577 | + * Get term meta. |
|
| 578 | + * |
|
| 579 | + * @param array $args Args array. |
|
| 580 | + * |
|
| 581 | + * @return array|mixed|string |
|
| 582 | + */ |
|
| 583 | + public static function get_term_meta( array $args = array() ) { |
|
| 584 | + $default = array( |
|
| 585 | + 'key' => '', |
|
| 586 | + 'opt_name' => '', |
|
| 587 | + 'taxonomy' => '', |
|
| 588 | + ); |
|
| 589 | + |
|
| 590 | + $args = wp_parse_args( $args, $default ); |
|
| 591 | + |
|
| 592 | + // phpcs:ignore WordPress.PHP.DontExtract |
|
| 593 | + extract( $args ); |
|
| 594 | + |
|
| 595 | + if ( empty( $taxonomy ) ) { |
|
| 596 | + return array(); |
|
| 597 | + } |
|
| 598 | + |
|
| 599 | + $single = ! empty( $key ); |
|
| 600 | + |
|
| 601 | + $meta = get_term_meta( $taxonomy, $key, $single ); |
|
| 602 | + |
|
| 603 | + // phpcs:ignore Generic.CodeAnalysis.EmptyStatement |
|
| 604 | + if ( $single ) { |
|
| 605 | + // Do nothing. |
|
| 606 | + } elseif ( ! empty( $meta ) ) { |
|
| 607 | + foreach ( $meta as $key => $value ) { |
|
| 608 | + if ( is_array( $value ) ) { |
|
| 609 | + $value = $value[0]; |
|
| 610 | + } |
|
| 611 | + |
|
| 612 | + $meta[ $key ] = maybe_unserialize( $value ); |
|
| 613 | + } |
|
| 614 | + } |
|
| 615 | + |
|
| 616 | + if ( ! empty( $opt_name ) ) { |
|
| 617 | + $defaults = self::get_field_defaults( $opt_name ); |
|
| 618 | + |
|
| 619 | + if ( $single ) { |
|
| 620 | + $default_value = ''; |
|
| 621 | + |
|
| 622 | + if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | + $default_value = $defaults[ $key ]; |
|
| 624 | + } |
|
| 625 | + |
|
| 626 | + if ( is_array( $meta ) ) { |
|
| 627 | + if ( is_array( $default_value ) ) { |
|
| 628 | + $meta = wp_parse_args( $meta, $default_value ); |
|
| 629 | + } |
|
| 630 | + } elseif ( '' === $meta && '' !== $default_value ) { |
|
| 631 | + $meta = $default_value; |
|
| 632 | + } |
|
| 633 | + } else { |
|
| 634 | + $meta = wp_parse_args( $meta, $defaults ); |
|
| 635 | + } |
|
| 636 | + } |
|
| 637 | + |
|
| 638 | + return $meta; |
|
| 639 | + } |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + Redux_Taxonomy::load(); |
|
| 643 | 643 | } |
@@ -92,7 +92,7 @@ discard block |
||
| 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 |
||
| 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 |
||
| 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 |
||
| 154 | 154 | public static function construct_terms( string $opt_name ): array { |
| 155 | 155 | $terms = array(); |
| 156 | 156 | |
| 157 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 157 | + if ( ! isset( self::$terms[$opt_name] ) ) { |
|
| 158 | 158 | return $terms; |
| 159 | 159 | } |
| 160 | 160 | |
| 161 | - foreach ( self::$terms[ $opt_name ] as $term ) { |
|
| 161 | + foreach ( self::$terms[$opt_name] as $term ) { |
|
| 162 | 162 | $term['sections'] = self::construct_sections( $opt_name, $term['id'] ); |
| 163 | 163 | $terms[] = $term; |
| 164 | 164 | } |
@@ -179,22 +179,22 @@ discard block |
||
| 179 | 179 | public static function construct_sections( string $opt_name, string $term_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['term_id'] === $term_id ) { |
| 188 | - self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section; |
|
| 188 | + self::$sections[$opt_name][$section_id]['add_visibility'] = $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 | |
@@ -216,29 +216,29 @@ discard block |
||
| 216 | 216 | public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array { |
| 217 | 217 | $fields = array(); |
| 218 | 218 | |
| 219 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 219 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 220 | 220 | return $fields; |
| 221 | 221 | } |
| 222 | 222 | |
| 223 | - foreach ( self::$fields[ $opt_name ] as $key => $field ) { |
|
| 223 | + foreach ( self::$fields[$opt_name] as $key => $field ) { |
|
| 224 | 224 | // Nested permissions. |
| 225 | 225 | $field['permissions'] = $field['permissions'] ?? $permissions; |
| 226 | 226 | |
| 227 | - self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions']; |
|
| 227 | + self::$fields[$opt_name][$key]['permissions'] = $field['permissions']; |
|
| 228 | 228 | |
| 229 | 229 | // Nested add_visibility permissions. |
| 230 | 230 | $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility; |
| 231 | 231 | |
| 232 | - self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility']; |
|
| 232 | + self::$fields[$opt_name][$key]['add_visibility'] = $field['add_visibility']; |
|
| 233 | 233 | |
| 234 | 234 | if ( $field['section_id'] === $section_id ) { |
| 235 | 235 | $p = $field['priority']; |
| 236 | 236 | |
| 237 | - while ( isset( $fields[ $p ] ) ) { |
|
| 237 | + while ( isset( $fields[$p] ) ) { |
|
| 238 | 238 | echo esc_html( $p++ ); |
| 239 | 239 | } |
| 240 | 240 | |
| 241 | - $fields[ $p ] = $field; |
|
| 241 | + $fields[$p] = $field; |
|
| 242 | 242 | } |
| 243 | 243 | } |
| 244 | 244 | |
@@ -259,11 +259,11 @@ discard block |
||
| 259 | 259 | self::check_opt_name( $opt_name ); |
| 260 | 260 | |
| 261 | 261 | if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
| 262 | - if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) { |
|
| 262 | + if ( ! isset( self::$sections[$opt_name][$id] ) ) { |
|
| 263 | 263 | $id = strtolower( sanitize_html_class( $id ) ); |
| 264 | 264 | } |
| 265 | 265 | |
| 266 | - return self::$sections[ $opt_name ][ $id ] ?? false; |
|
| 266 | + return self::$sections[$opt_name][$id] ?? false; |
|
| 267 | 267 | } |
| 268 | 268 | |
| 269 | 269 | return false; |
@@ -286,11 +286,11 @@ discard block |
||
| 286 | 286 | $section['id'] = 'section'; |
| 287 | 287 | } |
| 288 | 288 | |
| 289 | - if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 289 | + if ( isset( self::$sections[$opt_name][$section['id']] ) ) { |
|
| 290 | 290 | $orig = $section['id']; |
| 291 | 291 | $i = 0; |
| 292 | 292 | |
| 293 | - while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) { |
|
| 293 | + while ( isset( self::$sections[$opt_name][$section['id']] ) ) { |
|
| 294 | 294 | $section['id'] = $orig . '_' . $i; |
| 295 | 295 | } |
| 296 | 296 | } |
@@ -305,11 +305,11 @@ discard block |
||
| 305 | 305 | if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) { |
| 306 | 306 | foreach ( $section['fields'] as $key => $field ) { |
| 307 | 307 | if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) { |
| 308 | - $section['fields'][ $key ]['permissions'] = $section['permissions']; |
|
| 308 | + $section['fields'][$key]['permissions'] = $section['permissions']; |
|
| 309 | 309 | } |
| 310 | 310 | |
| 311 | 311 | if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) { |
| 312 | - $section['fields'][ $key ]['add_visibility'] = $section['add_visibility']; |
|
| 312 | + $section['fields'][$key]['add_visibility'] = $section['add_visibility']; |
|
| 313 | 313 | } |
| 314 | 314 | } |
| 315 | 315 | } |
@@ -320,9 +320,9 @@ discard block |
||
| 320 | 320 | unset( $section['fields'] ); |
| 321 | 321 | } |
| 322 | 322 | |
| 323 | - self::$sections[ $opt_name ][ $section['id'] ] = $section; |
|
| 323 | + self::$sections[$opt_name][$section['id']] = $section; |
|
| 324 | 324 | } else { |
| 325 | - 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' ); |
|
| 325 | + 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' ); |
|
| 326 | 326 | } |
| 327 | 327 | } |
| 328 | 328 | |
@@ -384,7 +384,7 @@ discard block |
||
| 384 | 384 | self::check_opt_name( $opt_name ); |
| 385 | 385 | |
| 386 | 386 | if ( ! empty( $opt_name ) && ! empty( $id ) ) { |
| 387 | - return self::$fields[ $opt_name ][ $id ] ?? false; |
|
| 387 | + return self::$fields[$opt_name][$id] ?? false; |
|
| 388 | 388 | } |
| 389 | 389 | |
| 390 | 390 | return false; |
@@ -404,7 +404,7 @@ discard block |
||
| 404 | 404 | $field['priority'] = self::get_priority( $opt_name, 'fields' ); |
| 405 | 405 | } |
| 406 | 406 | |
| 407 | - self::$fields[ $opt_name ][ $field['id'] ] = $field; |
|
| 407 | + self::$fields[$opt_name][$field['id']] = $field; |
|
| 408 | 408 | } |
| 409 | 409 | } |
| 410 | 410 | |
@@ -418,8 +418,8 @@ discard block |
||
| 418 | 418 | self::check_opt_name( $opt_name ); |
| 419 | 419 | |
| 420 | 420 | if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) { |
| 421 | - self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array(); |
|
| 422 | - self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] ); |
|
| 421 | + self::$args[$opt_name] = self::$args[$opt_name] ?? array(); |
|
| 422 | + self::$args[$opt_name] = wp_parse_args( $args, self::$args[$opt_name] ); |
|
| 423 | 423 | } |
| 424 | 424 | } |
| 425 | 425 | |
@@ -440,11 +440,11 @@ discard block |
||
| 440 | 440 | $term['id'] = 'term'; |
| 441 | 441 | } |
| 442 | 442 | |
| 443 | - if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 443 | + if ( isset( self::$terms[$opt_name][$term['id']] ) ) { |
|
| 444 | 444 | $orig = $term['id']; |
| 445 | 445 | $i = 0; |
| 446 | 446 | |
| 447 | - while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) { |
|
| 447 | + while ( isset( self::$terms[$opt_name][$term['id']] ) ) { |
|
| 448 | 448 | $term['id'] = $orig . '_' . $i; |
| 449 | 449 | } |
| 450 | 450 | } |
@@ -455,11 +455,11 @@ discard block |
||
| 455 | 455 | if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) { |
| 456 | 456 | foreach ( $term['sections'] as $key => $section ) { |
| 457 | 457 | if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) { |
| 458 | - $term['sections'][ $key ]['permissions'] = $term['permissions']; |
|
| 458 | + $term['sections'][$key]['permissions'] = $term['permissions']; |
|
| 459 | 459 | } |
| 460 | 460 | |
| 461 | 461 | if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) { |
| 462 | - $term['sections'][ $key ]['add_visibility'] = $term['add_visibility']; |
|
| 462 | + $term['sections'][$key]['add_visibility'] = $term['add_visibility']; |
|
| 463 | 463 | } |
| 464 | 464 | } |
| 465 | 465 | } |
@@ -470,9 +470,9 @@ discard block |
||
| 470 | 470 | unset( $term['sections'] ); |
| 471 | 471 | } |
| 472 | 472 | |
| 473 | - self::$terms[ $opt_name ][ $term['id'] ] = $term; |
|
| 473 | + self::$terms[$opt_name][$term['id']] = $term; |
|
| 474 | 474 | } else { |
| 475 | - self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 475 | + self::$errors[$opt_name]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' ); |
|
| 476 | 476 | } |
| 477 | 477 | } |
| 478 | 478 | |
@@ -486,8 +486,8 @@ discard block |
||
| 486 | 486 | public static function get_terms( string $opt_name = '' ) { |
| 487 | 487 | self::check_opt_name( $opt_name ); |
| 488 | 488 | |
| 489 | - if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) { |
|
| 490 | - return self::$terms[ $opt_name ]; |
|
| 489 | + if ( ! empty( $opt_name ) && ! empty( self::$terms[$opt_name] ) ) { |
|
| 490 | + return self::$terms[$opt_name]; |
|
| 491 | 491 | } |
| 492 | 492 | |
| 493 | 493 | return false; |
@@ -502,8 +502,8 @@ discard block |
||
| 502 | 502 | * @return mixed |
| 503 | 503 | */ |
| 504 | 504 | public static function get_priority( string $opt_name, string $type ) { |
| 505 | - $priority = self::$priority[ $opt_name ][ $type ]; |
|
| 506 | - self::$priority[ $opt_name ][ $type ] += 1; |
|
| 505 | + $priority = self::$priority[$opt_name][$type]; |
|
| 506 | + self::$priority[$opt_name][$type] += 1; |
|
| 507 | 507 | |
| 508 | 508 | return $priority; |
| 509 | 509 | } |
@@ -518,34 +518,34 @@ discard block |
||
| 518 | 518 | return; |
| 519 | 519 | } |
| 520 | 520 | |
| 521 | - if ( ! isset( self::$terms[ $opt_name ] ) ) { |
|
| 522 | - self::$terms[ $opt_name ] = array(); |
|
| 521 | + if ( ! isset( self::$terms[$opt_name] ) ) { |
|
| 522 | + self::$terms[$opt_name] = array(); |
|
| 523 | 523 | } |
| 524 | 524 | |
| 525 | - if ( ! isset( self::$priority[ $opt_name ] ) ) { |
|
| 526 | - self::$priority[ $opt_name ]['args'] = 1; |
|
| 525 | + if ( ! isset( self::$priority[$opt_name] ) ) { |
|
| 526 | + self::$priority[$opt_name]['args'] = 1; |
|
| 527 | 527 | } |
| 528 | 528 | |
| 529 | - if ( ! isset( self::$sections[ $opt_name ] ) ) { |
|
| 530 | - self::$sections[ $opt_name ] = array(); |
|
| 531 | - self::$priority[ $opt_name ]['sections'] = 1; |
|
| 529 | + if ( ! isset( self::$sections[$opt_name] ) ) { |
|
| 530 | + self::$sections[$opt_name] = array(); |
|
| 531 | + self::$priority[$opt_name]['sections'] = 1; |
|
| 532 | 532 | } |
| 533 | 533 | |
| 534 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 535 | - self::$fields[ $opt_name ] = array(); |
|
| 536 | - self::$priority[ $opt_name ]['fields'] = 1; |
|
| 534 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 535 | + self::$fields[$opt_name] = array(); |
|
| 536 | + self::$priority[$opt_name]['fields'] = 1; |
|
| 537 | 537 | } |
| 538 | 538 | |
| 539 | - if ( ! isset( self::$errors[ $opt_name ] ) ) { |
|
| 540 | - self::$errors[ $opt_name ] = array(); |
|
| 539 | + if ( ! isset( self::$errors[$opt_name] ) ) { |
|
| 540 | + self::$errors[$opt_name] = array(); |
|
| 541 | 541 | } |
| 542 | 542 | |
| 543 | - if ( ! isset( self::$init[ $opt_name ] ) ) { |
|
| 544 | - self::$init[ $opt_name ] = false; |
|
| 543 | + if ( ! isset( self::$init[$opt_name] ) ) { |
|
| 544 | + self::$init[$opt_name] = false; |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | - if ( ! isset( self::$args[ $opt_name ] ) ) { |
|
| 548 | - self::$args[ $opt_name ] = false; |
|
| 547 | + if ( ! isset( self::$args[$opt_name] ) ) { |
|
| 548 | + self::$args[$opt_name] = false; |
|
| 549 | 549 | } |
| 550 | 550 | } |
| 551 | 551 | |
@@ -561,15 +561,15 @@ discard block |
||
| 561 | 561 | return; |
| 562 | 562 | } |
| 563 | 563 | |
| 564 | - if ( ! isset( self::$fields[ $opt_name ] ) ) { |
|
| 564 | + if ( ! isset( self::$fields[$opt_name] ) ) { |
|
| 565 | 565 | return array(); |
| 566 | 566 | } |
| 567 | 567 | |
| 568 | 568 | return array_map( |
| 569 | - function ( $field ) { |
|
| 569 | + function( $field ) { |
|
| 570 | 570 | return $field['default'] ?? ''; |
| 571 | 571 | }, |
| 572 | - self::$fields[ $opt_name ] |
|
| 572 | + self::$fields[$opt_name] |
|
| 573 | 573 | ); |
| 574 | 574 | } |
| 575 | 575 | |
@@ -609,7 +609,7 @@ discard block |
||
| 609 | 609 | $value = $value[0]; |
| 610 | 610 | } |
| 611 | 611 | |
| 612 | - $meta[ $key ] = maybe_unserialize( $value ); |
|
| 612 | + $meta[$key] = maybe_unserialize( $value ); |
|
| 613 | 613 | } |
| 614 | 614 | } |
| 615 | 615 | |
@@ -619,8 +619,8 @@ discard block |
||
| 619 | 619 | if ( $single ) { |
| 620 | 620 | $default_value = ''; |
| 621 | 621 | |
| 622 | - if ( isset( $defaults[ $key ] ) ) { |
|
| 623 | - $default_value = $defaults[ $key ]; |
|
| 622 | + if ( isset( $defaults[$key] ) ) { |
|
| 623 | + $default_value = $defaults[$key]; |
|
| 624 | 624 | } |
| 625 | 625 | |
| 626 | 626 | if ( is_array( $meta ) ) { |