@@ -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. |
@@ -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 ) ) { |
@@ -55,7 +55,7 @@ discard block |
||
| 55 | 55 | * |
| 56 | 56 | * @var array|null |
| 57 | 57 | */ |
| 58 | - private static ?array $post_values = array(); |
|
| 58 | + private static ? array $post_values = array(); |
|
| 59 | 59 | |
| 60 | 60 | /** |
| 61 | 61 | * Options array. |
@@ -316,10 +316,10 @@ discard block |
||
| 316 | 316 | foreach ( $the_data as $key => $value ) { |
| 317 | 317 | if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
| 318 | 318 | foreach ( $value as $k => $v ) { |
| 319 | - $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 319 | + $decode = ( array ) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | 320 | $v = $decode; |
| 321 | - $dumb_array[ $k ] = $v; |
|
| 322 | - $the_data[ $key ] = $dumb_array; |
|
| 321 | + $dumb_array[$k] = $v; |
|
| 322 | + $the_data[$key] = $dumb_array; |
|
| 323 | 323 | } |
| 324 | 324 | } |
| 325 | 325 | } |
@@ -343,10 +343,10 @@ discard block |
||
| 343 | 343 | foreach ( self::$post_values as $key => $value ) { |
| 344 | 344 | if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
| 345 | 345 | $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
| 346 | - $data[ $key ] = $value; |
|
| 346 | + $data[$key] = $value; |
|
| 347 | 347 | |
| 348 | - $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | - $this->parent->options[ $key ] = $value; |
|
| 348 | + $GLOBALS[$this->parent->args['global_variable']][$key] = $value; |
|
| 349 | + $this->parent->options[$key] = $value; |
|
| 350 | 350 | } |
| 351 | 351 | } |
| 352 | 352 | } |
@@ -362,7 +362,7 @@ discard block |
||
| 362 | 362 | */ |
| 363 | 363 | public function render( object $control ) { |
| 364 | 364 | $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
| 365 | - $field = $this->options[ $field_id ]; |
|
| 365 | + $field = $this->options[$field_id]; |
|
| 366 | 366 | |
| 367 | 367 | if ( ! empty( $field['compiler'] ) ) { |
| 368 | 368 | echo '<tr class="compiler">'; |
@@ -370,7 +370,7 @@ discard block |
||
| 370 | 370 | echo '<tr>'; |
| 371 | 371 | } |
| 372 | 372 | |
| 373 | - echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 373 | + echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[$field['id']] ) . '</th>'; |
|
| 374 | 374 | echo '<td>'; |
| 375 | 375 | |
| 376 | 376 | $field['name'] = $field['id']; |
@@ -414,8 +414,8 @@ discard block |
||
| 414 | 414 | do_action( 'redux/extension/customizer/control/includes' ); |
| 415 | 415 | |
| 416 | 416 | $order = array( |
| 417 | - 'heading' => - 500, |
|
| 418 | - 'option' => - 500, |
|
| 417 | + 'heading' => -500, |
|
| 418 | + 'option' => -500, |
|
| 419 | 419 | ); |
| 420 | 420 | |
| 421 | 421 | $panel = ''; |
@@ -454,7 +454,7 @@ discard block |
||
| 454 | 454 | $parent_section_id = null; |
| 455 | 455 | $new_parent = true; |
| 456 | 456 | } |
| 457 | - if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 457 | + if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[$parent_section_id]['customizer'] ) && false === $this->parent->sections[$parent_section_id]['customizer'] ) ) { |
|
| 458 | 458 | continue; |
| 459 | 459 | } |
| 460 | 460 | |
@@ -487,7 +487,7 @@ discard block |
||
| 487 | 487 | } |
| 488 | 488 | $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
| 489 | 489 | |
| 490 | - if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 490 | + if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[( $key + 1 )]['subsection'] ) && $this->parent->sections[( $key + 1 )]['subsection'] ) { |
|
| 491 | 491 | $this->add_panel( |
| 492 | 492 | $this->parent->args['opt_name'] . '-' . $section['id'], |
| 493 | 493 | array( |
@@ -550,7 +550,7 @@ discard block |
||
| 550 | 550 | continue; |
| 551 | 551 | } |
| 552 | 552 | |
| 553 | - $this->options[ $option['id'] ] = $option; |
|
| 553 | + $this->options[$option['id']] = $option; |
|
| 554 | 554 | add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
| 555 | 555 | |
| 556 | 556 | $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
@@ -561,7 +561,7 @@ discard block |
||
| 561 | 561 | ++$order['option']; |
| 562 | 562 | } |
| 563 | 563 | |
| 564 | - if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 564 | + if ( ! empty( $this->options_defaults[$option['id']] ) ) { |
|
| 565 | 565 | $option['default'] = $this->options_defaults['option']['id']; |
| 566 | 566 | } |
| 567 | 567 | |
@@ -634,12 +634,12 @@ discard block |
||
| 634 | 634 | ) |
| 635 | 635 | ); |
| 636 | 636 | |
| 637 | - $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | - if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | - $section['fields'][ $skey ]['class'] = ''; |
|
| 637 | + $section['fields'][$skey]['name'] = $option['id']; |
|
| 638 | + if ( ! isset( $section['fields'][$skey]['class'] ) ) { // No errors please. |
|
| 639 | + $section['fields'][$skey]['class'] = ''; |
|
| 640 | 640 | } |
| 641 | 641 | |
| 642 | - $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 642 | + $this->controls[$section['fields'][$skey]['id']] = $section['fields'][$skey]; |
|
| 643 | 643 | } |
| 644 | 644 | } |
| 645 | 645 | } |
@@ -706,11 +706,11 @@ discard block |
||
| 706 | 706 | if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
| 707 | 707 | $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
| 708 | 708 | |
| 709 | - if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | - $this->parent->options[ $key ] = $value; |
|
| 709 | + if ( ! isset( $this->orig_options[$key] ) || $value !== $this->orig_options[$key] || ( isset( $this->orig_options[$key] ) && ! empty( $this->orig_options[$key] ) && empty( $value ) ) ) { |
|
| 710 | + $this->parent->options[$key] = $value; |
|
| 711 | 711 | $changed = true; |
| 712 | 712 | |
| 713 | - if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 713 | + if ( isset( $this->parent->compiler_fields[$key] ) ) { |
|
| 714 | 714 | $compiler = true; |
| 715 | 715 | } |
| 716 | 716 | } |
@@ -813,8 +813,8 @@ discard block |
||
| 813 | 813 | if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
| 814 | 814 | $replace = $value; |
| 815 | 815 | foreach ( $replace as $sub_array ) { |
| 816 | - $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | - $value[ $cs_array['id'] ] = $cs_array; |
|
| 816 | + $cs_array = ( array ) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | + $value[$cs_array['id']] = $cs_array; |
|
| 818 | 818 | } |
| 819 | 819 | } |
| 820 | 820 | |
@@ -14,828 +14,828 @@ |
||
| 14 | 14 | // Don't duplicate me! |
| 15 | 15 | if ( ! class_exists( 'Redux_Extension_Customizer', false ) ) { |
| 16 | 16 | |
| 17 | - /** |
|
| 18 | - * Main ReduxFramework customizer extension class |
|
| 19 | - * |
|
| 20 | - * @since 1.0.0 |
|
| 21 | - */ |
|
| 22 | - class Redux_Extension_Customizer extends Redux_Extension_Abstract { |
|
| 23 | - |
|
| 24 | - /** |
|
| 25 | - * Set extension version. |
|
| 26 | - * |
|
| 27 | - * @var string |
|
| 28 | - */ |
|
| 29 | - public static $version = '4.5.1'; |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * Set the name of the field. Ideally, this will also be your extension's name. |
|
| 33 | - * Please use underscores and NOT dashes. |
|
| 34 | - * |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - public string $field_name = 'customizer'; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * Set the friendly name of the extension. This is for display purposes. No underscores or dashes are required. |
|
| 41 | - * |
|
| 42 | - * @var string |
|
| 43 | - */ |
|
| 44 | - public string $extension_name = 'Customizer'; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * Original options. |
|
| 48 | - * |
|
| 49 | - * @var array|null |
|
| 50 | - */ |
|
| 51 | - private ?array $orig_options = array(); |
|
| 52 | - |
|
| 53 | - /** |
|
| 54 | - * Post values. |
|
| 55 | - * |
|
| 56 | - * @var array|null |
|
| 57 | - */ |
|
| 58 | - private static ?array $post_values = array(); |
|
| 59 | - |
|
| 60 | - /** |
|
| 61 | - * Options array. |
|
| 62 | - * |
|
| 63 | - * @var array|null |
|
| 64 | - */ |
|
| 65 | - public ?array $options = array(); |
|
| 66 | - |
|
| 67 | - /** |
|
| 68 | - * Controls array. |
|
| 69 | - * |
|
| 70 | - * @var array|null |
|
| 71 | - */ |
|
| 72 | - public ?array $controls = array(); |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * Before save array. |
|
| 76 | - * |
|
| 77 | - * @var array|null |
|
| 78 | - */ |
|
| 79 | - public ?array $before_save = array(); |
|
| 80 | - |
|
| 81 | - /** |
|
| 82 | - * Redux object. |
|
| 83 | - * |
|
| 84 | - * @var ReduxFramework|null |
|
| 85 | - */ |
|
| 86 | - protected ?ReduxFramework $redux; |
|
| 87 | - |
|
| 88 | - /** |
|
| 89 | - * Field array. |
|
| 90 | - * |
|
| 91 | - * @var array|null |
|
| 92 | - */ |
|
| 93 | - private ?array $redux_fields = array(); |
|
| 94 | - |
|
| 95 | - /** |
|
| 96 | - * Redux_Extension_my_extension constructor. |
|
| 97 | - * |
|
| 98 | - * @param ReduxFramework $redux ReduxFramework pointer. |
|
| 99 | - */ |
|
| 100 | - public function __construct( $redux ) { |
|
| 101 | - global $pagenow; |
|
| 102 | - global $wp_customize; |
|
| 103 | - |
|
| 104 | - parent::__construct( $redux, __FILE__ ); |
|
| 105 | - |
|
| 106 | - if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 107 | - return; |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - $this->add_field( 'customizer' ); |
|
| 111 | - |
|
| 112 | - $this->load(); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - /** |
|
| 116 | - * The customizer load code |
|
| 117 | - */ |
|
| 118 | - private function load() { |
|
| 119 | - global $pagenow, $wp_customize; |
|
| 120 | - |
|
| 121 | - if ( false === $this->parent->args['customizer'] ) { |
|
| 122 | - return; |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - // Override the Redux_Core class. |
|
| 126 | - add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) ); |
|
| 127 | - |
|
| 128 | - if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 129 | - return; |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - self::get_post_values(); |
|
| 133 | - |
|
| 134 | - if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 135 | - $this->parent->args['customizer_only'] = true; |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 139 | - add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 ); |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls. |
|
| 143 | - add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); |
|
| 144 | - |
|
| 145 | - add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save. |
|
| 146 | - |
|
| 147 | - // Add global controls CSS file. |
|
| 148 | - add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) ); |
|
| 149 | - add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) ); |
|
| 150 | - add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 ); |
|
| 151 | - |
|
| 152 | - add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 ); |
|
| 153 | - |
|
| 154 | - add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) ); |
|
| 155 | - add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) ); |
|
| 156 | - } |
|
| 157 | - |
|
| 158 | - /** |
|
| 159 | - * Add nonce HTML for AJAX. |
|
| 160 | - */ |
|
| 161 | - public function add_nonce_html() { |
|
| 162 | - $nonce = wp_create_nonce( 'redux_customer_nonce' ); |
|
| 163 | - |
|
| 164 | - ?> |
|
| 17 | + /** |
|
| 18 | + * Main ReduxFramework customizer extension class |
|
| 19 | + * |
|
| 20 | + * @since 1.0.0 |
|
| 21 | + */ |
|
| 22 | + class Redux_Extension_Customizer extends Redux_Extension_Abstract { |
|
| 23 | + |
|
| 24 | + /** |
|
| 25 | + * Set extension version. |
|
| 26 | + * |
|
| 27 | + * @var string |
|
| 28 | + */ |
|
| 29 | + public static $version = '4.5.1'; |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * Set the name of the field. Ideally, this will also be your extension's name. |
|
| 33 | + * Please use underscores and NOT dashes. |
|
| 34 | + * |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + public string $field_name = 'customizer'; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * Set the friendly name of the extension. This is for display purposes. No underscores or dashes are required. |
|
| 41 | + * |
|
| 42 | + * @var string |
|
| 43 | + */ |
|
| 44 | + public string $extension_name = 'Customizer'; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * Original options. |
|
| 48 | + * |
|
| 49 | + * @var array|null |
|
| 50 | + */ |
|
| 51 | + private ?array $orig_options = array(); |
|
| 52 | + |
|
| 53 | + /** |
|
| 54 | + * Post values. |
|
| 55 | + * |
|
| 56 | + * @var array|null |
|
| 57 | + */ |
|
| 58 | + private static ?array $post_values = array(); |
|
| 59 | + |
|
| 60 | + /** |
|
| 61 | + * Options array. |
|
| 62 | + * |
|
| 63 | + * @var array|null |
|
| 64 | + */ |
|
| 65 | + public ?array $options = array(); |
|
| 66 | + |
|
| 67 | + /** |
|
| 68 | + * Controls array. |
|
| 69 | + * |
|
| 70 | + * @var array|null |
|
| 71 | + */ |
|
| 72 | + public ?array $controls = array(); |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * Before save array. |
|
| 76 | + * |
|
| 77 | + * @var array|null |
|
| 78 | + */ |
|
| 79 | + public ?array $before_save = array(); |
|
| 80 | + |
|
| 81 | + /** |
|
| 82 | + * Redux object. |
|
| 83 | + * |
|
| 84 | + * @var ReduxFramework|null |
|
| 85 | + */ |
|
| 86 | + protected ?ReduxFramework $redux; |
|
| 87 | + |
|
| 88 | + /** |
|
| 89 | + * Field array. |
|
| 90 | + * |
|
| 91 | + * @var array|null |
|
| 92 | + */ |
|
| 93 | + private ?array $redux_fields = array(); |
|
| 94 | + |
|
| 95 | + /** |
|
| 96 | + * Redux_Extension_my_extension constructor. |
|
| 97 | + * |
|
| 98 | + * @param ReduxFramework $redux ReduxFramework pointer. |
|
| 99 | + */ |
|
| 100 | + public function __construct( $redux ) { |
|
| 101 | + global $pagenow; |
|
| 102 | + global $wp_customize; |
|
| 103 | + |
|
| 104 | + parent::__construct( $redux, __FILE__ ); |
|
| 105 | + |
|
| 106 | + if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 107 | + return; |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + $this->add_field( 'customizer' ); |
|
| 111 | + |
|
| 112 | + $this->load(); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + /** |
|
| 116 | + * The customizer load code |
|
| 117 | + */ |
|
| 118 | + private function load() { |
|
| 119 | + global $pagenow, $wp_customize; |
|
| 120 | + |
|
| 121 | + if ( false === $this->parent->args['customizer'] ) { |
|
| 122 | + return; |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + // Override the Redux_Core class. |
|
| 126 | + add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) ); |
|
| 127 | + |
|
| 128 | + if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) { |
|
| 129 | + return; |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + self::get_post_values(); |
|
| 133 | + |
|
| 134 | + if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 135 | + $this->parent->args['customizer_only'] = true; |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 139 | + add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 ); |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls. |
|
| 143 | + add_action( 'wp_head', array( $this, 'customize_preview_init' ) ); |
|
| 144 | + |
|
| 145 | + add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save. |
|
| 146 | + |
|
| 147 | + // Add global controls CSS file. |
|
| 148 | + add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) ); |
|
| 149 | + add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) ); |
|
| 150 | + add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 ); |
|
| 151 | + |
|
| 152 | + add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 ); |
|
| 153 | + |
|
| 154 | + add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) ); |
|
| 155 | + add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) ); |
|
| 156 | + } |
|
| 157 | + |
|
| 158 | + /** |
|
| 159 | + * Add nonce HTML for AJAX. |
|
| 160 | + */ |
|
| 161 | + public function add_nonce_html() { |
|
| 162 | + $nonce = wp_create_nonce( 'redux_customer_nonce' ); |
|
| 163 | + |
|
| 164 | + ?> |
|
| 165 | 165 | <div class="redux-customizer-nonce" data-nonce="<?php echo esc_attr( $nonce ); ?>"></div> |
| 166 | 166 | <?php |
| 167 | - } |
|
| 168 | - |
|
| 169 | - /** |
|
| 170 | - * AJAX callback for customizer save...to make sanitize/validate work. |
|
| 171 | - */ |
|
| 172 | - public function customizer() { |
|
| 173 | - try { |
|
| 174 | - $return_array = array(); |
|
| 175 | - |
|
| 176 | - if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) { |
|
| 177 | - $redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 178 | - |
|
| 179 | - $post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput |
|
| 180 | - |
|
| 181 | - // New method to avoid input_var nonsense. Thanks @harunbasic. |
|
| 182 | - $values = Redux_Functions_Ex::parse_str( $post_data ); |
|
| 183 | - |
|
| 184 | - $all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 185 | - |
|
| 186 | - $values = wp_parse_args( $values, $all_options ); |
|
| 187 | - |
|
| 188 | - $redux->options_class->set( $redux->options_class->validate_options( $values ) ); |
|
| 189 | - |
|
| 190 | - $redux->enqueue_class->get_warnings_and_errors_array(); |
|
| 191 | - |
|
| 192 | - $return_array = array( |
|
| 193 | - 'status' => 'success', |
|
| 194 | - 'options' => $redux->options, |
|
| 195 | - 'errors' => $redux->enqueue_class->localize_data['errors'] ?? null, |
|
| 196 | - 'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null, |
|
| 197 | - 'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null, |
|
| 198 | - ); |
|
| 199 | - } |
|
| 200 | - } catch ( Exception $e ) { |
|
| 201 | - $return_array = array( 'status' => $e->getMessage() ); |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - echo wp_json_encode( $return_array ); |
|
| 205 | - |
|
| 206 | - die; |
|
| 207 | - } |
|
| 208 | - |
|
| 209 | - /** |
|
| 210 | - * Field classes. |
|
| 211 | - * |
|
| 212 | - * @param array $option Option. |
|
| 213 | - */ |
|
| 214 | - public function create_field_classes( array $option ) { |
|
| 215 | - if ( empty( $this->redux_fields ) ) { |
|
| 216 | - $file_paths = glob( Redux_Core::$dir . 'inc/fields/*' ); |
|
| 217 | - |
|
| 218 | - foreach ( $file_paths as $file ) { |
|
| 219 | - if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 220 | - $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file ); |
|
| 221 | - } |
|
| 222 | - } |
|
| 223 | - |
|
| 224 | - $file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' ); |
|
| 225 | - |
|
| 226 | - foreach ( $file_paths as $file ) { |
|
| 227 | - if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 228 | - $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file ); |
|
| 229 | - } |
|
| 230 | - } |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 234 | - |
|
| 235 | - if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) { |
|
| 236 | - $upload_dir = Redux_Core::$upload_dir; |
|
| 237 | - |
|
| 238 | - if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 239 | - if ( ! is_dir( $upload_dir ) ) { |
|
| 240 | - Redux_Core::$filesystem->execute( 'mkdir', $upload_dir ); |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - $template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . ' class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . ' public $type = "redux-{{type}}";' . PHP_EOL . ' }' ); |
|
| 244 | - |
|
| 245 | - Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) ); |
|
| 246 | - } |
|
| 247 | - |
|
| 248 | - if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 249 | - include_once $upload_dir . $option['type'] . '.php'; |
|
| 250 | - } |
|
| 251 | - } |
|
| 252 | - } |
|
| 253 | - |
|
| 254 | - /** |
|
| 255 | - * Enqueue extension scripts/styles. |
|
| 256 | - */ |
|
| 257 | - public function enqueue_controls_css() { |
|
| 258 | - $this->parent->enqueue_class->get_warnings_and_errors_array(); |
|
| 259 | - $this->parent->enqueue_class->init(); |
|
| 260 | - |
|
| 261 | - if ( $this->parent->args['dev_mode'] ) { |
|
| 262 | - wp_enqueue_style( |
|
| 263 | - 'redux-extension-customizer', |
|
| 264 | - $this->extension_url . 'redux-extension-customizer.css', |
|
| 265 | - array(), |
|
| 266 | - self::$version |
|
| 267 | - ); |
|
| 268 | - } |
|
| 269 | - |
|
| 270 | - wp_enqueue_script( |
|
| 271 | - 'redux-extension-customizer', |
|
| 272 | - $this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js', |
|
| 273 | - array( 'jquery', 'redux-js' ), |
|
| 274 | - self::$version, |
|
| 275 | - true |
|
| 276 | - ); |
|
| 277 | - |
|
| 278 | - wp_localize_script( |
|
| 279 | - 'redux-extension-customizer', |
|
| 280 | - 'redux_customizer', |
|
| 281 | - array( |
|
| 282 | - 'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ), |
|
| 283 | - ) |
|
| 284 | - ); |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - /** |
|
| 288 | - * Enqueue panel CSS> |
|
| 289 | - */ |
|
| 290 | - public function enqueue_panel_css() {} |
|
| 291 | - |
|
| 292 | - /** |
|
| 293 | - * Remove core customizer class. |
|
| 294 | - * |
|
| 295 | - * @return string |
|
| 296 | - */ |
|
| 297 | - public function remove_core_customizer_class(): string { |
|
| 298 | - return ''; |
|
| 299 | - } |
|
| 300 | - |
|
| 301 | - /** |
|
| 302 | - * Customize preview init. |
|
| 303 | - */ |
|
| 304 | - public function customize_preview_init() { |
|
| 305 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | - do_action( 'redux/customizer/live_preview' ); |
|
| 307 | - } |
|
| 308 | - |
|
| 309 | - /** |
|
| 310 | - * Get post values. |
|
| 311 | - */ |
|
| 312 | - protected static function get_post_values() { |
|
| 313 | - if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 314 | - $the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput |
|
| 315 | - |
|
| 316 | - foreach ( $the_data as $key => $value ) { |
|
| 317 | - if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 318 | - foreach ( $value as $k => $v ) { |
|
| 319 | - $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | - $v = $decode; |
|
| 321 | - $dumb_array[ $k ] = $v; |
|
| 322 | - $the_data[ $key ] = $dumb_array; |
|
| 323 | - } |
|
| 324 | - } |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - self::$post_values = $the_data; |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - |
|
| 331 | - /** |
|
| 332 | - * Override customizer values. |
|
| 333 | - * |
|
| 334 | - * @param array $data Values. |
|
| 335 | - * |
|
| 336 | - * @return array |
|
| 337 | - */ |
|
| 338 | - public function override_values( array $data ): array { |
|
| 339 | - self::get_post_values(); |
|
| 340 | - |
|
| 341 | - if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 342 | - if ( is_array( self::$post_values ) ) { |
|
| 343 | - foreach ( self::$post_values as $key => $value ) { |
|
| 344 | - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 345 | - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 346 | - $data[ $key ] = $value; |
|
| 347 | - |
|
| 348 | - $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | - $this->parent->options[ $key ] = $value; |
|
| 350 | - } |
|
| 351 | - } |
|
| 352 | - } |
|
| 353 | - } |
|
| 354 | - |
|
| 355 | - return $data; |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Render Redux fields. |
|
| 360 | - * |
|
| 361 | - * @param object $control . |
|
| 362 | - */ |
|
| 363 | - public function render( object $control ) { |
|
| 364 | - $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
|
| 365 | - $field = $this->options[ $field_id ]; |
|
| 366 | - |
|
| 367 | - if ( ! empty( $field['compiler'] ) ) { |
|
| 368 | - echo '<tr class="compiler">'; |
|
| 369 | - } else { |
|
| 370 | - echo '<tr>'; |
|
| 371 | - } |
|
| 372 | - |
|
| 373 | - echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 374 | - echo '<td>'; |
|
| 375 | - |
|
| 376 | - $field['name'] = $field['id']; |
|
| 377 | - $this->parent->render_class->field_input( $field ); |
|
| 378 | - |
|
| 379 | - echo '</td>'; |
|
| 380 | - echo '</tr>'; |
|
| 381 | - } |
|
| 382 | - |
|
| 383 | - // All sections, settings, and controls will be added here. |
|
| 384 | - |
|
| 385 | - /** |
|
| 386 | - * Register customizer controls. |
|
| 387 | - * |
|
| 388 | - * @param WP_Customize_Manager $wp_customize . |
|
| 389 | - * |
|
| 390 | - * @throws ReflectionException Exception. |
|
| 391 | - */ |
|
| 392 | - public function register_customizer_controls( WP_Customize_Manager $wp_customize ) { |
|
| 393 | - if ( ! class_exists( 'Redux_Customizer_Section' ) ) { |
|
| 394 | - require_once __DIR__ . '/inc/class-redux-customizer-section.php'; |
|
| 395 | - |
|
| 396 | - if ( method_exists( $wp_customize, 'register_section_type' ) ) { |
|
| 397 | - $wp_customize->register_section_type( 'Redux_Customizer_Section' ); |
|
| 398 | - } |
|
| 399 | - } |
|
| 400 | - |
|
| 401 | - if ( ! class_exists( 'Redux_Customizer_Panel' ) ) { |
|
| 402 | - require_once __DIR__ . '/inc/class-redux-customizer-panel.php'; |
|
| 403 | - |
|
| 404 | - if ( method_exists( $wp_customize, 'register_panel_type' ) ) { |
|
| 405 | - $wp_customize->register_panel_type( 'Redux_Customizer_Panel' ); |
|
| 406 | - } |
|
| 407 | - } |
|
| 408 | - |
|
| 409 | - if ( ! class_exists( 'Redux_Customizer_Control' ) ) { |
|
| 410 | - require_once __DIR__ . '/inc/class-redux-customizer-control.php'; |
|
| 411 | - } |
|
| 412 | - |
|
| 413 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 414 | - do_action( 'redux/extension/customizer/control/includes' ); |
|
| 415 | - |
|
| 416 | - $order = array( |
|
| 417 | - 'heading' => - 500, |
|
| 418 | - 'option' => - 500, |
|
| 419 | - ); |
|
| 420 | - |
|
| 421 | - $panel = ''; |
|
| 422 | - |
|
| 423 | - $this->parent->args['options_api'] = false; |
|
| 424 | - $this->parent->options_class->register(); |
|
| 425 | - |
|
| 426 | - $parent_section_id = null; |
|
| 427 | - $new_parent = true; |
|
| 428 | - |
|
| 429 | - foreach ( $this->parent->sections as $key => $section ) { |
|
| 430 | - // Not a type that should go on the customizer. |
|
| 431 | - |
|
| 432 | - foreach ( $section['fields'] as $field ) { |
|
| 433 | - if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) { |
|
| 434 | - continue 2; |
|
| 435 | - } |
|
| 436 | - } |
|
| 437 | - |
|
| 438 | - if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) { |
|
| 439 | - continue; |
|
| 440 | - } |
|
| 441 | - |
|
| 442 | - // If section customizer is set to false. |
|
| 443 | - if ( isset( $section['customizer'] ) && false === $section['customizer'] ) { |
|
| 444 | - continue; |
|
| 445 | - } |
|
| 446 | - |
|
| 447 | - // if we are in a subsection and parent is set to customizer false !!! |
|
| 448 | - if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) { |
|
| 449 | - if ( $new_parent ) { |
|
| 450 | - $new_parent = false; |
|
| 451 | - $parent_section_id = ( $key - 1 ); |
|
| 452 | - } |
|
| 453 | - } else { // not a subsection reset. |
|
| 454 | - $parent_section_id = null; |
|
| 455 | - $new_parent = true; |
|
| 456 | - } |
|
| 457 | - if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 458 | - continue; |
|
| 459 | - } |
|
| 460 | - |
|
| 461 | - $section['permissions'] = $section['permissions'] ?? 'edit_theme_options'; |
|
| 462 | - |
|
| 463 | - // No errors please. |
|
| 464 | - if ( ! isset( $section['desc'] ) ) { |
|
| 465 | - $section['desc'] = ''; |
|
| 466 | - } |
|
| 467 | - |
|
| 468 | - // Fill the description if there is a subtitle. |
|
| 469 | - if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) { |
|
| 470 | - $section['desc'] = $section['subtitle']; |
|
| 471 | - } |
|
| 472 | - |
|
| 473 | - // No title is present, let's show what section is missing a title. |
|
| 474 | - if ( ! isset( $section['title'] ) ) { |
|
| 475 | - $section['title'] = ''; |
|
| 476 | - } |
|
| 477 | - |
|
| 478 | - // Let's make a section ID from the title. |
|
| 479 | - if ( empty( $section['id'] ) ) { |
|
| 480 | - $section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) ); |
|
| 481 | - } |
|
| 482 | - |
|
| 483 | - // Let's set a default priority. |
|
| 484 | - if ( empty( $section['priority'] ) ) { |
|
| 485 | - $section['priority'] = $order['heading']; |
|
| 486 | - ++$order['heading']; |
|
| 487 | - } |
|
| 488 | - $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 489 | - |
|
| 490 | - if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 491 | - $this->add_panel( |
|
| 492 | - $this->parent->args['opt_name'] . '-' . $section['id'], |
|
| 493 | - array( |
|
| 494 | - 'priority' => $section['priority'], |
|
| 495 | - 'capability' => $section['permissions'], |
|
| 496 | - 'title' => $section['title'], |
|
| 497 | - 'section' => $section, |
|
| 498 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 499 | - 'description' => '', |
|
| 500 | - ), |
|
| 501 | - $wp_customize |
|
| 502 | - ); |
|
| 503 | - |
|
| 504 | - $panel = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 505 | - |
|
| 506 | - $this->add_section( |
|
| 507 | - $section['id'], |
|
| 508 | - array( |
|
| 509 | - 'title' => $section['title'], |
|
| 510 | - 'priority' => $section['priority'], |
|
| 511 | - 'description' => $section['desc'], |
|
| 512 | - 'section' => $section, |
|
| 513 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 514 | - 'capability' => $section['permissions'], |
|
| 515 | - 'panel' => $panel, |
|
| 516 | - ), |
|
| 517 | - $wp_customize |
|
| 518 | - ); |
|
| 519 | - } else { |
|
| 520 | - if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) { |
|
| 521 | - $panel = ''; |
|
| 522 | - } |
|
| 523 | - |
|
| 524 | - $this->add_section( |
|
| 525 | - $section['id'], |
|
| 526 | - array( |
|
| 527 | - 'title' => $section['title'], |
|
| 528 | - 'priority' => $section['priority'], |
|
| 529 | - 'description' => $section['desc'], |
|
| 530 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 531 | - 'section' => $section, |
|
| 532 | - 'capability' => $section['permissions'], |
|
| 533 | - 'panel' => $panel, |
|
| 534 | - ), |
|
| 535 | - $wp_customize |
|
| 536 | - ); |
|
| 537 | - } |
|
| 538 | - |
|
| 539 | - if ( ( empty( $section['fields'] ) ) ) { |
|
| 540 | - continue; |
|
| 541 | - } |
|
| 542 | - |
|
| 543 | - foreach ( $section['fields'] as $skey => $option ) { |
|
| 544 | - |
|
| 545 | - if ( isset( $option['customizer'] ) && false === $option['customizer'] ) { |
|
| 546 | - continue; |
|
| 547 | - } |
|
| 548 | - |
|
| 549 | - if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) { |
|
| 550 | - continue; |
|
| 551 | - } |
|
| 552 | - |
|
| 553 | - $this->options[ $option['id'] ] = $option; |
|
| 554 | - add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
|
| 555 | - |
|
| 556 | - $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
|
| 557 | - |
|
| 558 | - // Change the item priority if not set. |
|
| 559 | - if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) { |
|
| 560 | - $option['priority'] = $order['option']; |
|
| 561 | - ++$order['option']; |
|
| 562 | - } |
|
| 563 | - |
|
| 564 | - if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 565 | - $option['default'] = $this->options_defaults['option']['id']; |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | - if ( ! isset( $option['default'] ) ) { |
|
| 569 | - $option['default'] = ''; |
|
| 570 | - } |
|
| 571 | - if ( ! isset( $option['title'] ) ) { |
|
| 572 | - $option['title'] = ''; |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; |
|
| 576 | - |
|
| 577 | - if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) { |
|
| 578 | - |
|
| 579 | - $wp_customize->add_setting( |
|
| 580 | - $option['id'], |
|
| 581 | - array( |
|
| 582 | - 'default' => $option['default'], |
|
| 583 | - 'transport' => 'refresh', |
|
| 584 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 585 | - 'sanitize_callback' => array( $this, 'field_validation' ), |
|
| 586 | - ) |
|
| 587 | - ); |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) { |
|
| 591 | - if ( empty( $option['args'] ) ) { |
|
| 592 | - $option['args'] = array(); |
|
| 593 | - } |
|
| 594 | - |
|
| 595 | - if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) { |
|
| 596 | - $icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php'; |
|
| 597 | - |
|
| 598 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 599 | - $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); |
|
| 600 | - |
|
| 601 | - if ( file_exists( $icons_file ) ) { |
|
| 602 | - require_once $icons_file; |
|
| 603 | - } |
|
| 604 | - } |
|
| 605 | - $option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] ); |
|
| 606 | - } |
|
| 607 | - |
|
| 608 | - $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 609 | - |
|
| 610 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 611 | - do_action( 'redux/extension/customizer/control_init', $option ); |
|
| 612 | - |
|
| 613 | - if ( ! class_exists( $class_name ) ) { |
|
| 614 | - continue; |
|
| 615 | - } |
|
| 616 | - |
|
| 617 | - $wp_customize->add_control( |
|
| 618 | - new $class_name( |
|
| 619 | - $wp_customize, |
|
| 620 | - $option['id'], |
|
| 621 | - array( |
|
| 622 | - 'label' => $option['title'], |
|
| 623 | - 'section' => $section['id'], |
|
| 624 | - 'settings' => $option['id'], |
|
| 625 | - 'type' => 'redux-' . $option['type'], |
|
| 626 | - 'field' => $option, |
|
| 627 | - 'ReduxFramework' => $this->parent, |
|
| 628 | - 'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array( |
|
| 629 | - 'Redux_Customizer_Active_Callback', |
|
| 630 | - 'evaluate', |
|
| 631 | - ) : '__return_true', |
|
| 632 | - 'priority' => $option['priority'], |
|
| 633 | - ) |
|
| 634 | - ) |
|
| 635 | - ); |
|
| 636 | - |
|
| 637 | - $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | - if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | - $section['fields'][ $skey ]['class'] = ''; |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 643 | - } |
|
| 644 | - } |
|
| 645 | - } |
|
| 646 | - |
|
| 647 | - /** |
|
| 648 | - * Add customizer section. |
|
| 649 | - * |
|
| 650 | - * @param string $id ID. |
|
| 651 | - * @param array $args Args. |
|
| 652 | - * @param WP_Customize_Manager $wp_customize . |
|
| 653 | - */ |
|
| 654 | - public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 655 | - |
|
| 656 | - if ( is_a( $id, 'WP_Customize_Section' ) ) { |
|
| 657 | - $section = $id; |
|
| 658 | - } else { |
|
| 659 | - $section = new Redux_Customizer_Section( $wp_customize, $id, $args ); |
|
| 660 | - } |
|
| 661 | - |
|
| 662 | - $wp_customize->add_section( $section, $args ); |
|
| 663 | - } |
|
| 664 | - |
|
| 665 | - /** |
|
| 666 | - * Add a customize panel. |
|
| 667 | - * |
|
| 668 | - * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. |
|
| 669 | - * @param array $args Optional. Panel arguments. Default empty array. |
|
| 670 | - * @param WP_Customize_Manager $wp_customize . |
|
| 671 | - * |
|
| 672 | - * @since 4.0.0 |
|
| 673 | - * @access public |
|
| 674 | - */ |
|
| 675 | - public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 676 | - if ( is_a( $id, 'WP_Customize_Panel' ) ) { |
|
| 677 | - $panel = $id; |
|
| 678 | - } else { |
|
| 679 | - $panel = new Redux_Customizer_Panel( $wp_customize, $id, $args ); |
|
| 680 | - } |
|
| 681 | - |
|
| 682 | - $wp_customize->add_panel( $panel, $args ); |
|
| 683 | - } |
|
| 684 | - |
|
| 685 | - /** |
|
| 686 | - * Actions to take after customizer save. |
|
| 687 | - * |
|
| 688 | - * @throws ReflectionException Exception. |
|
| 689 | - */ |
|
| 690 | - public function customizer_save_after() { |
|
| 691 | - if ( empty( $this->parent->options ) ) { |
|
| 692 | - $this->parent->get_options(); |
|
| 693 | - } |
|
| 694 | - |
|
| 695 | - if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) { |
|
| 696 | - $this->orig_options = $this->parent->options; |
|
| 697 | - } |
|
| 698 | - |
|
| 699 | - if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 700 | - $options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification |
|
| 701 | - |
|
| 702 | - $compiler = false; |
|
| 703 | - $changed = false; |
|
| 704 | - |
|
| 705 | - foreach ( $options as $key => $value ) { |
|
| 706 | - if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 707 | - $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 708 | - |
|
| 709 | - if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | - $this->parent->options[ $key ] = $value; |
|
| 711 | - $changed = true; |
|
| 712 | - |
|
| 713 | - if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 714 | - $compiler = true; |
|
| 715 | - } |
|
| 716 | - } |
|
| 717 | - } |
|
| 718 | - } |
|
| 719 | - |
|
| 720 | - if ( $changed ) { |
|
| 721 | - $this->parent->options_class->set( $this->parent->options ); |
|
| 722 | - if ( $compiler ) { |
|
| 723 | - // Have to set this to stop the output of the CSS and typography stuff. |
|
| 724 | - Redux_Core::$no_output = true; |
|
| 725 | - $this->parent->output_class->enqueue(); |
|
| 726 | - |
|
| 727 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 728 | - do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS ); |
|
| 729 | - |
|
| 730 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 731 | - do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent ); |
|
| 732 | - } |
|
| 733 | - } |
|
| 734 | - } |
|
| 735 | - } |
|
| 736 | - |
|
| 737 | - /** |
|
| 738 | - * Enqueue CSS/JS for the customizer controls |
|
| 739 | - * |
|
| 740 | - * @since 1.0.0 |
|
| 741 | - * @access public |
|
| 742 | - * @global $wp_styles |
|
| 743 | - * @return void |
|
| 744 | - */ |
|
| 745 | - public function enqueue() { |
|
| 746 | - $localize = array( |
|
| 747 | - 'save_pending' => esc_html__( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), |
|
| 748 | - 'reset_confirm' => esc_html__( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), |
|
| 749 | - 'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), |
|
| 750 | - 'opt_name' => $this->parent->args['opt_name'], |
|
| 751 | - 'field' => $this->parent->options, |
|
| 752 | - 'defaults' => $this->parent->options_defaults, |
|
| 753 | - 'folds' => Redux_Core::$folds, |
|
| 754 | - ); |
|
| 755 | - |
|
| 756 | - // Values used by the javascript. |
|
| 757 | - wp_localize_script( 'redux-js', 'redux_opts', $localize ); |
|
| 758 | - |
|
| 759 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 760 | - do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] ); |
|
| 761 | - |
|
| 762 | - foreach ( $this->parent->sections as $section ) { |
|
| 763 | - if ( isset( $section['fields'] ) ) { |
|
| 764 | - foreach ( $section['fields'] as $field ) { |
|
| 765 | - if ( isset( $field['type'] ) ) { |
|
| 766 | - $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 767 | - |
|
| 768 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 769 | - |
|
| 770 | - if ( false === $field_class ) { |
|
| 771 | - |
|
| 772 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 773 | - $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class ); |
|
| 774 | - |
|
| 775 | - if ( $class_file ) { |
|
| 776 | - require_once $class_file; |
|
| 777 | - |
|
| 778 | - $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 779 | - |
|
| 780 | - } |
|
| 781 | - } |
|
| 782 | - |
|
| 783 | - if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { |
|
| 784 | - $enqueue = new $field_class( '', '', $this ); |
|
| 785 | - $enqueue->enqueue(); |
|
| 786 | - } |
|
| 787 | - } |
|
| 788 | - } |
|
| 789 | - } |
|
| 790 | - } |
|
| 791 | - } |
|
| 792 | - |
|
| 793 | - /** |
|
| 794 | - * Register Option for use |
|
| 795 | - * |
|
| 796 | - * @since 1.0.0 |
|
| 797 | - * @access public |
|
| 798 | - * @return void |
|
| 799 | - */ |
|
| 800 | - public function register_setting() { |
|
| 801 | - } |
|
| 802 | - |
|
| 803 | - /** |
|
| 804 | - * Validate the options before insertion |
|
| 805 | - * |
|
| 806 | - * @param array|string $value The options array. |
|
| 807 | - * |
|
| 808 | - * @return array|string $value |
|
| 809 | - * @since 3.0.0 |
|
| 810 | - * @access public |
|
| 811 | - */ |
|
| 812 | - public function field_validation( $value ) { |
|
| 813 | - if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 814 | - $replace = $value; |
|
| 815 | - foreach ( $replace as $sub_array ) { |
|
| 816 | - $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | - $value[ $cs_array['id'] ] = $cs_array; |
|
| 818 | - } |
|
| 819 | - } |
|
| 820 | - |
|
| 821 | - return $value; |
|
| 822 | - } |
|
| 823 | - } |
|
| 824 | - |
|
| 825 | - if ( ! function_exists( 'redux_customizer_custom_validation' ) ) { |
|
| 826 | - /** |
|
| 827 | - * Custom validation. |
|
| 828 | - * |
|
| 829 | - * @param mixed $field Field. |
|
| 830 | - * |
|
| 831 | - * @return mixed |
|
| 832 | - */ |
|
| 833 | - function redux_customizer_custom_validation( $field ) { |
|
| 834 | - return $field; |
|
| 835 | - } |
|
| 836 | - } |
|
| 167 | + } |
|
| 168 | + |
|
| 169 | + /** |
|
| 170 | + * AJAX callback for customizer save...to make sanitize/validate work. |
|
| 171 | + */ |
|
| 172 | + public function customizer() { |
|
| 173 | + try { |
|
| 174 | + $return_array = array(); |
|
| 175 | + |
|
| 176 | + if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) { |
|
| 177 | + $redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 178 | + |
|
| 179 | + $post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput |
|
| 180 | + |
|
| 181 | + // New method to avoid input_var nonsense. Thanks @harunbasic. |
|
| 182 | + $values = Redux_Functions_Ex::parse_str( $post_data ); |
|
| 183 | + |
|
| 184 | + $all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) ); |
|
| 185 | + |
|
| 186 | + $values = wp_parse_args( $values, $all_options ); |
|
| 187 | + |
|
| 188 | + $redux->options_class->set( $redux->options_class->validate_options( $values ) ); |
|
| 189 | + |
|
| 190 | + $redux->enqueue_class->get_warnings_and_errors_array(); |
|
| 191 | + |
|
| 192 | + $return_array = array( |
|
| 193 | + 'status' => 'success', |
|
| 194 | + 'options' => $redux->options, |
|
| 195 | + 'errors' => $redux->enqueue_class->localize_data['errors'] ?? null, |
|
| 196 | + 'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null, |
|
| 197 | + 'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null, |
|
| 198 | + ); |
|
| 199 | + } |
|
| 200 | + } catch ( Exception $e ) { |
|
| 201 | + $return_array = array( 'status' => $e->getMessage() ); |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + echo wp_json_encode( $return_array ); |
|
| 205 | + |
|
| 206 | + die; |
|
| 207 | + } |
|
| 208 | + |
|
| 209 | + /** |
|
| 210 | + * Field classes. |
|
| 211 | + * |
|
| 212 | + * @param array $option Option. |
|
| 213 | + */ |
|
| 214 | + public function create_field_classes( array $option ) { |
|
| 215 | + if ( empty( $this->redux_fields ) ) { |
|
| 216 | + $file_paths = glob( Redux_Core::$dir . 'inc/fields/*' ); |
|
| 217 | + |
|
| 218 | + foreach ( $file_paths as $file ) { |
|
| 219 | + if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 220 | + $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file ); |
|
| 221 | + } |
|
| 222 | + } |
|
| 223 | + |
|
| 224 | + $file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' ); |
|
| 225 | + |
|
| 226 | + foreach ( $file_paths as $file ) { |
|
| 227 | + if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) { |
|
| 228 | + $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file ); |
|
| 229 | + } |
|
| 230 | + } |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 234 | + |
|
| 235 | + if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) { |
|
| 236 | + $upload_dir = Redux_Core::$upload_dir; |
|
| 237 | + |
|
| 238 | + if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 239 | + if ( ! is_dir( $upload_dir ) ) { |
|
| 240 | + Redux_Core::$filesystem->execute( 'mkdir', $upload_dir ); |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + $template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . ' class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . ' public $type = "redux-{{type}}";' . PHP_EOL . ' }' ); |
|
| 244 | + |
|
| 245 | + Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) ); |
|
| 246 | + } |
|
| 247 | + |
|
| 248 | + if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) { |
|
| 249 | + include_once $upload_dir . $option['type'] . '.php'; |
|
| 250 | + } |
|
| 251 | + } |
|
| 252 | + } |
|
| 253 | + |
|
| 254 | + /** |
|
| 255 | + * Enqueue extension scripts/styles. |
|
| 256 | + */ |
|
| 257 | + public function enqueue_controls_css() { |
|
| 258 | + $this->parent->enqueue_class->get_warnings_and_errors_array(); |
|
| 259 | + $this->parent->enqueue_class->init(); |
|
| 260 | + |
|
| 261 | + if ( $this->parent->args['dev_mode'] ) { |
|
| 262 | + wp_enqueue_style( |
|
| 263 | + 'redux-extension-customizer', |
|
| 264 | + $this->extension_url . 'redux-extension-customizer.css', |
|
| 265 | + array(), |
|
| 266 | + self::$version |
|
| 267 | + ); |
|
| 268 | + } |
|
| 269 | + |
|
| 270 | + wp_enqueue_script( |
|
| 271 | + 'redux-extension-customizer', |
|
| 272 | + $this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js', |
|
| 273 | + array( 'jquery', 'redux-js' ), |
|
| 274 | + self::$version, |
|
| 275 | + true |
|
| 276 | + ); |
|
| 277 | + |
|
| 278 | + wp_localize_script( |
|
| 279 | + 'redux-extension-customizer', |
|
| 280 | + 'redux_customizer', |
|
| 281 | + array( |
|
| 282 | + 'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ), |
|
| 283 | + ) |
|
| 284 | + ); |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + /** |
|
| 288 | + * Enqueue panel CSS> |
|
| 289 | + */ |
|
| 290 | + public function enqueue_panel_css() {} |
|
| 291 | + |
|
| 292 | + /** |
|
| 293 | + * Remove core customizer class. |
|
| 294 | + * |
|
| 295 | + * @return string |
|
| 296 | + */ |
|
| 297 | + public function remove_core_customizer_class(): string { |
|
| 298 | + return ''; |
|
| 299 | + } |
|
| 300 | + |
|
| 301 | + /** |
|
| 302 | + * Customize preview init. |
|
| 303 | + */ |
|
| 304 | + public function customize_preview_init() { |
|
| 305 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 306 | + do_action( 'redux/customizer/live_preview' ); |
|
| 307 | + } |
|
| 308 | + |
|
| 309 | + /** |
|
| 310 | + * Get post values. |
|
| 311 | + */ |
|
| 312 | + protected static function get_post_values() { |
|
| 313 | + if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 314 | + $the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput |
|
| 315 | + |
|
| 316 | + foreach ( $the_data as $key => $value ) { |
|
| 317 | + if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 318 | + foreach ( $value as $k => $v ) { |
|
| 319 | + $decode = (array) json_decode( rawurldecode( $v['data'] ) ); |
|
| 320 | + $v = $decode; |
|
| 321 | + $dumb_array[ $k ] = $v; |
|
| 322 | + $the_data[ $key ] = $dumb_array; |
|
| 323 | + } |
|
| 324 | + } |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + self::$post_values = $the_data; |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + |
|
| 331 | + /** |
|
| 332 | + * Override customizer values. |
|
| 333 | + * |
|
| 334 | + * @param array $data Values. |
|
| 335 | + * |
|
| 336 | + * @return array |
|
| 337 | + */ |
|
| 338 | + public function override_values( array $data ): array { |
|
| 339 | + self::get_post_values(); |
|
| 340 | + |
|
| 341 | + if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 342 | + if ( is_array( self::$post_values ) ) { |
|
| 343 | + foreach ( self::$post_values as $key => $value ) { |
|
| 344 | + if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 345 | + $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 346 | + $data[ $key ] = $value; |
|
| 347 | + |
|
| 348 | + $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value; |
|
| 349 | + $this->parent->options[ $key ] = $value; |
|
| 350 | + } |
|
| 351 | + } |
|
| 352 | + } |
|
| 353 | + } |
|
| 354 | + |
|
| 355 | + return $data; |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Render Redux fields. |
|
| 360 | + * |
|
| 361 | + * @param object $control . |
|
| 362 | + */ |
|
| 363 | + public function render( object $control ) { |
|
| 364 | + $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id ); |
|
| 365 | + $field = $this->options[ $field_id ]; |
|
| 366 | + |
|
| 367 | + if ( ! empty( $field['compiler'] ) ) { |
|
| 368 | + echo '<tr class="compiler">'; |
|
| 369 | + } else { |
|
| 370 | + echo '<tr>'; |
|
| 371 | + } |
|
| 372 | + |
|
| 373 | + echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>'; |
|
| 374 | + echo '<td>'; |
|
| 375 | + |
|
| 376 | + $field['name'] = $field['id']; |
|
| 377 | + $this->parent->render_class->field_input( $field ); |
|
| 378 | + |
|
| 379 | + echo '</td>'; |
|
| 380 | + echo '</tr>'; |
|
| 381 | + } |
|
| 382 | + |
|
| 383 | + // All sections, settings, and controls will be added here. |
|
| 384 | + |
|
| 385 | + /** |
|
| 386 | + * Register customizer controls. |
|
| 387 | + * |
|
| 388 | + * @param WP_Customize_Manager $wp_customize . |
|
| 389 | + * |
|
| 390 | + * @throws ReflectionException Exception. |
|
| 391 | + */ |
|
| 392 | + public function register_customizer_controls( WP_Customize_Manager $wp_customize ) { |
|
| 393 | + if ( ! class_exists( 'Redux_Customizer_Section' ) ) { |
|
| 394 | + require_once __DIR__ . '/inc/class-redux-customizer-section.php'; |
|
| 395 | + |
|
| 396 | + if ( method_exists( $wp_customize, 'register_section_type' ) ) { |
|
| 397 | + $wp_customize->register_section_type( 'Redux_Customizer_Section' ); |
|
| 398 | + } |
|
| 399 | + } |
|
| 400 | + |
|
| 401 | + if ( ! class_exists( 'Redux_Customizer_Panel' ) ) { |
|
| 402 | + require_once __DIR__ . '/inc/class-redux-customizer-panel.php'; |
|
| 403 | + |
|
| 404 | + if ( method_exists( $wp_customize, 'register_panel_type' ) ) { |
|
| 405 | + $wp_customize->register_panel_type( 'Redux_Customizer_Panel' ); |
|
| 406 | + } |
|
| 407 | + } |
|
| 408 | + |
|
| 409 | + if ( ! class_exists( 'Redux_Customizer_Control' ) ) { |
|
| 410 | + require_once __DIR__ . '/inc/class-redux-customizer-control.php'; |
|
| 411 | + } |
|
| 412 | + |
|
| 413 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 414 | + do_action( 'redux/extension/customizer/control/includes' ); |
|
| 415 | + |
|
| 416 | + $order = array( |
|
| 417 | + 'heading' => - 500, |
|
| 418 | + 'option' => - 500, |
|
| 419 | + ); |
|
| 420 | + |
|
| 421 | + $panel = ''; |
|
| 422 | + |
|
| 423 | + $this->parent->args['options_api'] = false; |
|
| 424 | + $this->parent->options_class->register(); |
|
| 425 | + |
|
| 426 | + $parent_section_id = null; |
|
| 427 | + $new_parent = true; |
|
| 428 | + |
|
| 429 | + foreach ( $this->parent->sections as $key => $section ) { |
|
| 430 | + // Not a type that should go on the customizer. |
|
| 431 | + |
|
| 432 | + foreach ( $section['fields'] as $field ) { |
|
| 433 | + if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) { |
|
| 434 | + continue 2; |
|
| 435 | + } |
|
| 436 | + } |
|
| 437 | + |
|
| 438 | + if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) { |
|
| 439 | + continue; |
|
| 440 | + } |
|
| 441 | + |
|
| 442 | + // If section customizer is set to false. |
|
| 443 | + if ( isset( $section['customizer'] ) && false === $section['customizer'] ) { |
|
| 444 | + continue; |
|
| 445 | + } |
|
| 446 | + |
|
| 447 | + // if we are in a subsection and parent is set to customizer false !!! |
|
| 448 | + if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) { |
|
| 449 | + if ( $new_parent ) { |
|
| 450 | + $new_parent = false; |
|
| 451 | + $parent_section_id = ( $key - 1 ); |
|
| 452 | + } |
|
| 453 | + } else { // not a subsection reset. |
|
| 454 | + $parent_section_id = null; |
|
| 455 | + $new_parent = true; |
|
| 456 | + } |
|
| 457 | + if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) { |
|
| 458 | + continue; |
|
| 459 | + } |
|
| 460 | + |
|
| 461 | + $section['permissions'] = $section['permissions'] ?? 'edit_theme_options'; |
|
| 462 | + |
|
| 463 | + // No errors please. |
|
| 464 | + if ( ! isset( $section['desc'] ) ) { |
|
| 465 | + $section['desc'] = ''; |
|
| 466 | + } |
|
| 467 | + |
|
| 468 | + // Fill the description if there is a subtitle. |
|
| 469 | + if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) { |
|
| 470 | + $section['desc'] = $section['subtitle']; |
|
| 471 | + } |
|
| 472 | + |
|
| 473 | + // No title is present, let's show what section is missing a title. |
|
| 474 | + if ( ! isset( $section['title'] ) ) { |
|
| 475 | + $section['title'] = ''; |
|
| 476 | + } |
|
| 477 | + |
|
| 478 | + // Let's make a section ID from the title. |
|
| 479 | + if ( empty( $section['id'] ) ) { |
|
| 480 | + $section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) ); |
|
| 481 | + } |
|
| 482 | + |
|
| 483 | + // Let's set a default priority. |
|
| 484 | + if ( empty( $section['priority'] ) ) { |
|
| 485 | + $section['priority'] = $order['heading']; |
|
| 486 | + ++$order['heading']; |
|
| 487 | + } |
|
| 488 | + $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 489 | + |
|
| 490 | + if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) { |
|
| 491 | + $this->add_panel( |
|
| 492 | + $this->parent->args['opt_name'] . '-' . $section['id'], |
|
| 493 | + array( |
|
| 494 | + 'priority' => $section['priority'], |
|
| 495 | + 'capability' => $section['permissions'], |
|
| 496 | + 'title' => $section['title'], |
|
| 497 | + 'section' => $section, |
|
| 498 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 499 | + 'description' => '', |
|
| 500 | + ), |
|
| 501 | + $wp_customize |
|
| 502 | + ); |
|
| 503 | + |
|
| 504 | + $panel = $this->parent->args['opt_name'] . '-' . $section['id']; |
|
| 505 | + |
|
| 506 | + $this->add_section( |
|
| 507 | + $section['id'], |
|
| 508 | + array( |
|
| 509 | + 'title' => $section['title'], |
|
| 510 | + 'priority' => $section['priority'], |
|
| 511 | + 'description' => $section['desc'], |
|
| 512 | + 'section' => $section, |
|
| 513 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 514 | + 'capability' => $section['permissions'], |
|
| 515 | + 'panel' => $panel, |
|
| 516 | + ), |
|
| 517 | + $wp_customize |
|
| 518 | + ); |
|
| 519 | + } else { |
|
| 520 | + if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) { |
|
| 521 | + $panel = ''; |
|
| 522 | + } |
|
| 523 | + |
|
| 524 | + $this->add_section( |
|
| 525 | + $section['id'], |
|
| 526 | + array( |
|
| 527 | + 'title' => $section['title'], |
|
| 528 | + 'priority' => $section['priority'], |
|
| 529 | + 'description' => $section['desc'], |
|
| 530 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 531 | + 'section' => $section, |
|
| 532 | + 'capability' => $section['permissions'], |
|
| 533 | + 'panel' => $panel, |
|
| 534 | + ), |
|
| 535 | + $wp_customize |
|
| 536 | + ); |
|
| 537 | + } |
|
| 538 | + |
|
| 539 | + if ( ( empty( $section['fields'] ) ) ) { |
|
| 540 | + continue; |
|
| 541 | + } |
|
| 542 | + |
|
| 543 | + foreach ( $section['fields'] as $skey => $option ) { |
|
| 544 | + |
|
| 545 | + if ( isset( $option['customizer'] ) && false === $option['customizer'] ) { |
|
| 546 | + continue; |
|
| 547 | + } |
|
| 548 | + |
|
| 549 | + if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) { |
|
| 550 | + continue; |
|
| 551 | + } |
|
| 552 | + |
|
| 553 | + $this->options[ $option['id'] ] = $option; |
|
| 554 | + add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) ); |
|
| 555 | + |
|
| 556 | + $option['permissions'] = $option['permissions'] ?? 'edit_theme_options'; |
|
| 557 | + |
|
| 558 | + // Change the item priority if not set. |
|
| 559 | + if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) { |
|
| 560 | + $option['priority'] = $order['option']; |
|
| 561 | + ++$order['option']; |
|
| 562 | + } |
|
| 563 | + |
|
| 564 | + if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) { |
|
| 565 | + $option['default'] = $this->options_defaults['option']['id']; |
|
| 566 | + } |
|
| 567 | + |
|
| 568 | + if ( ! isset( $option['default'] ) ) { |
|
| 569 | + $option['default'] = ''; |
|
| 570 | + } |
|
| 571 | + if ( ! isset( $option['title'] ) ) { |
|
| 572 | + $option['title'] = ''; |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']'; |
|
| 576 | + |
|
| 577 | + if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) { |
|
| 578 | + |
|
| 579 | + $wp_customize->add_setting( |
|
| 580 | + $option['id'], |
|
| 581 | + array( |
|
| 582 | + 'default' => $option['default'], |
|
| 583 | + 'transport' => 'refresh', |
|
| 584 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 585 | + 'sanitize_callback' => array( $this, 'field_validation' ), |
|
| 586 | + ) |
|
| 587 | + ); |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) { |
|
| 591 | + if ( empty( $option['args'] ) ) { |
|
| 592 | + $option['args'] = array(); |
|
| 593 | + } |
|
| 594 | + |
|
| 595 | + if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) { |
|
| 596 | + $icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php'; |
|
| 597 | + |
|
| 598 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 599 | + $icons_file = apply_filters( 'redux-font-icons-file', $icons_file ); |
|
| 600 | + |
|
| 601 | + if ( file_exists( $icons_file ) ) { |
|
| 602 | + require_once $icons_file; |
|
| 603 | + } |
|
| 604 | + } |
|
| 605 | + $option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] ); |
|
| 606 | + } |
|
| 607 | + |
|
| 608 | + $class_name = 'Redux_Customizer_Control_' . $option['type']; |
|
| 609 | + |
|
| 610 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 611 | + do_action( 'redux/extension/customizer/control_init', $option ); |
|
| 612 | + |
|
| 613 | + if ( ! class_exists( $class_name ) ) { |
|
| 614 | + continue; |
|
| 615 | + } |
|
| 616 | + |
|
| 617 | + $wp_customize->add_control( |
|
| 618 | + new $class_name( |
|
| 619 | + $wp_customize, |
|
| 620 | + $option['id'], |
|
| 621 | + array( |
|
| 622 | + 'label' => $option['title'], |
|
| 623 | + 'section' => $section['id'], |
|
| 624 | + 'settings' => $option['id'], |
|
| 625 | + 'type' => 'redux-' . $option['type'], |
|
| 626 | + 'field' => $option, |
|
| 627 | + 'ReduxFramework' => $this->parent, |
|
| 628 | + 'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array( |
|
| 629 | + 'Redux_Customizer_Active_Callback', |
|
| 630 | + 'evaluate', |
|
| 631 | + ) : '__return_true', |
|
| 632 | + 'priority' => $option['priority'], |
|
| 633 | + ) |
|
| 634 | + ) |
|
| 635 | + ); |
|
| 636 | + |
|
| 637 | + $section['fields'][ $skey ]['name'] = $option['id']; |
|
| 638 | + if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please. |
|
| 639 | + $section['fields'][ $skey ]['class'] = ''; |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ]; |
|
| 643 | + } |
|
| 644 | + } |
|
| 645 | + } |
|
| 646 | + |
|
| 647 | + /** |
|
| 648 | + * Add customizer section. |
|
| 649 | + * |
|
| 650 | + * @param string $id ID. |
|
| 651 | + * @param array $args Args. |
|
| 652 | + * @param WP_Customize_Manager $wp_customize . |
|
| 653 | + */ |
|
| 654 | + public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 655 | + |
|
| 656 | + if ( is_a( $id, 'WP_Customize_Section' ) ) { |
|
| 657 | + $section = $id; |
|
| 658 | + } else { |
|
| 659 | + $section = new Redux_Customizer_Section( $wp_customize, $id, $args ); |
|
| 660 | + } |
|
| 661 | + |
|
| 662 | + $wp_customize->add_section( $section, $args ); |
|
| 663 | + } |
|
| 664 | + |
|
| 665 | + /** |
|
| 666 | + * Add a customize panel. |
|
| 667 | + * |
|
| 668 | + * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. |
|
| 669 | + * @param array $args Optional. Panel arguments. Default empty array. |
|
| 670 | + * @param WP_Customize_Manager $wp_customize . |
|
| 671 | + * |
|
| 672 | + * @since 4.0.0 |
|
| 673 | + * @access public |
|
| 674 | + */ |
|
| 675 | + public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) { |
|
| 676 | + if ( is_a( $id, 'WP_Customize_Panel' ) ) { |
|
| 677 | + $panel = $id; |
|
| 678 | + } else { |
|
| 679 | + $panel = new Redux_Customizer_Panel( $wp_customize, $id, $args ); |
|
| 680 | + } |
|
| 681 | + |
|
| 682 | + $wp_customize->add_panel( $panel, $args ); |
|
| 683 | + } |
|
| 684 | + |
|
| 685 | + /** |
|
| 686 | + * Actions to take after customizer save. |
|
| 687 | + * |
|
| 688 | + * @throws ReflectionException Exception. |
|
| 689 | + */ |
|
| 690 | + public function customizer_save_after() { |
|
| 691 | + if ( empty( $this->parent->options ) ) { |
|
| 692 | + $this->parent->get_options(); |
|
| 693 | + } |
|
| 694 | + |
|
| 695 | + if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) { |
|
| 696 | + $this->orig_options = $this->parent->options; |
|
| 697 | + } |
|
| 698 | + |
|
| 699 | + if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification |
|
| 700 | + $options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification |
|
| 701 | + |
|
| 702 | + $compiler = false; |
|
| 703 | + $changed = false; |
|
| 704 | + |
|
| 705 | + foreach ( $options as $key => $value ) { |
|
| 706 | + if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) { |
|
| 707 | + $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) ); |
|
| 708 | + |
|
| 709 | + if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) { |
|
| 710 | + $this->parent->options[ $key ] = $value; |
|
| 711 | + $changed = true; |
|
| 712 | + |
|
| 713 | + if ( isset( $this->parent->compiler_fields[ $key ] ) ) { |
|
| 714 | + $compiler = true; |
|
| 715 | + } |
|
| 716 | + } |
|
| 717 | + } |
|
| 718 | + } |
|
| 719 | + |
|
| 720 | + if ( $changed ) { |
|
| 721 | + $this->parent->options_class->set( $this->parent->options ); |
|
| 722 | + if ( $compiler ) { |
|
| 723 | + // Have to set this to stop the output of the CSS and typography stuff. |
|
| 724 | + Redux_Core::$no_output = true; |
|
| 725 | + $this->parent->output_class->enqueue(); |
|
| 726 | + |
|
| 727 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 728 | + do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS ); |
|
| 729 | + |
|
| 730 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 731 | + do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent ); |
|
| 732 | + } |
|
| 733 | + } |
|
| 734 | + } |
|
| 735 | + } |
|
| 736 | + |
|
| 737 | + /** |
|
| 738 | + * Enqueue CSS/JS for the customizer controls |
|
| 739 | + * |
|
| 740 | + * @since 1.0.0 |
|
| 741 | + * @access public |
|
| 742 | + * @global $wp_styles |
|
| 743 | + * @return void |
|
| 744 | + */ |
|
| 745 | + public function enqueue() { |
|
| 746 | + $localize = array( |
|
| 747 | + 'save_pending' => esc_html__( 'You have changes that are not saved. Would you like to save them now?', 'redux-framework' ), |
|
| 748 | + 'reset_confirm' => esc_html__( 'Are you sure? Resetting will lose all custom values.', 'redux-framework' ), |
|
| 749 | + 'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset. Would you like to proceed?', 'redux-framework' ), |
|
| 750 | + 'opt_name' => $this->parent->args['opt_name'], |
|
| 751 | + 'field' => $this->parent->options, |
|
| 752 | + 'defaults' => $this->parent->options_defaults, |
|
| 753 | + 'folds' => Redux_Core::$folds, |
|
| 754 | + ); |
|
| 755 | + |
|
| 756 | + // Values used by the javascript. |
|
| 757 | + wp_localize_script( 'redux-js', 'redux_opts', $localize ); |
|
| 758 | + |
|
| 759 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 760 | + do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] ); |
|
| 761 | + |
|
| 762 | + foreach ( $this->parent->sections as $section ) { |
|
| 763 | + if ( isset( $section['fields'] ) ) { |
|
| 764 | + foreach ( $section['fields'] as $field ) { |
|
| 765 | + if ( isset( $field['type'] ) ) { |
|
| 766 | + $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] ); |
|
| 767 | + |
|
| 768 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 769 | + |
|
| 770 | + if ( false === $field_class ) { |
|
| 771 | + |
|
| 772 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 773 | + $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class ); |
|
| 774 | + |
|
| 775 | + if ( $class_file ) { |
|
| 776 | + require_once $class_file; |
|
| 777 | + |
|
| 778 | + $field_class = Redux_Functions::class_exists_ex( $field_classes ); |
|
| 779 | + |
|
| 780 | + } |
|
| 781 | + } |
|
| 782 | + |
|
| 783 | + if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) { |
|
| 784 | + $enqueue = new $field_class( '', '', $this ); |
|
| 785 | + $enqueue->enqueue(); |
|
| 786 | + } |
|
| 787 | + } |
|
| 788 | + } |
|
| 789 | + } |
|
| 790 | + } |
|
| 791 | + } |
|
| 792 | + |
|
| 793 | + /** |
|
| 794 | + * Register Option for use |
|
| 795 | + * |
|
| 796 | + * @since 1.0.0 |
|
| 797 | + * @access public |
|
| 798 | + * @return void |
|
| 799 | + */ |
|
| 800 | + public function register_setting() { |
|
| 801 | + } |
|
| 802 | + |
|
| 803 | + /** |
|
| 804 | + * Validate the options before insertion |
|
| 805 | + * |
|
| 806 | + * @param array|string $value The options array. |
|
| 807 | + * |
|
| 808 | + * @return array|string $value |
|
| 809 | + * @since 3.0.0 |
|
| 810 | + * @access public |
|
| 811 | + */ |
|
| 812 | + public function field_validation( $value ) { |
|
| 813 | + if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) { |
|
| 814 | + $replace = $value; |
|
| 815 | + foreach ( $replace as $sub_array ) { |
|
| 816 | + $cs_array = (array) json_decode( rawurldecode( $sub_array['data'] ) ); |
|
| 817 | + $value[ $cs_array['id'] ] = $cs_array; |
|
| 818 | + } |
|
| 819 | + } |
|
| 820 | + |
|
| 821 | + return $value; |
|
| 822 | + } |
|
| 823 | + } |
|
| 824 | + |
|
| 825 | + if ( ! function_exists( 'redux_customizer_custom_validation' ) ) { |
|
| 826 | + /** |
|
| 827 | + * Custom validation. |
|
| 828 | + * |
|
| 829 | + * @param mixed $field Field. |
|
| 830 | + * |
|
| 831 | + * @return mixed |
|
| 832 | + */ |
|
| 833 | + function redux_customizer_custom_validation( $field ) { |
|
| 834 | + return $field; |
|
| 835 | + } |
|
| 836 | + } |
|
| 837 | 837 | } |
| 838 | 838 | |
| 839 | 839 | if ( ! class_exists( 'ReduxFramework_extension_customizer' ) ) { |
| 840 | - class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' ); |
|
| 840 | + class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' ); |
|
| 841 | 841 | } |
@@ -10,40 +10,40 @@ discard block |
||
| 10 | 10 | |
| 11 | 11 | if ( ! class_exists( 'Redux_Customizer_Control', false ) ) { |
| 12 | 12 | |
| 13 | - /** |
|
| 14 | - * Class Redux_Customizer_Control |
|
| 15 | - */ |
|
| 16 | - class Redux_Customizer_Control extends WP_Customize_Control { |
|
| 13 | + /** |
|
| 14 | + * Class Redux_Customizer_Control |
|
| 15 | + */ |
|
| 16 | + class Redux_Customizer_Control extends WP_Customize_Control { |
|
| 17 | 17 | |
| 18 | - /** |
|
| 19 | - * Redux ID. |
|
| 20 | - * |
|
| 21 | - * @var string |
|
| 22 | - */ |
|
| 23 | - public string $redux_id = ''; |
|
| 18 | + /** |
|
| 19 | + * Redux ID. |
|
| 20 | + * |
|
| 21 | + * @var string |
|
| 22 | + */ |
|
| 23 | + public string $redux_id = ''; |
|
| 24 | 24 | |
| 25 | - /** |
|
| 26 | - * Field render. |
|
| 27 | - */ |
|
| 28 | - public function render() { |
|
| 25 | + /** |
|
| 26 | + * Field render. |
|
| 27 | + */ |
|
| 28 | + public function render() { |
|
| 29 | 29 | |
| 30 | - $this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) ); |
|
| 31 | - $class = 'customize-control redux-group-tab redux-field customize-control-' . $this->type; |
|
| 32 | - $opt_name_arr = explode( '[', $this->id ); |
|
| 33 | - $opt_name = $opt_name_arr[0]; |
|
| 34 | - $field_id = str_replace( ']', '', $opt_name_arr[1] ); |
|
| 30 | + $this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) ); |
|
| 31 | + $class = 'customize-control redux-group-tab redux-field customize-control-' . $this->type; |
|
| 32 | + $opt_name_arr = explode( '[', $this->id ); |
|
| 33 | + $opt_name = $opt_name_arr[0]; |
|
| 34 | + $field_id = str_replace( ']', '', $opt_name_arr[1] ); |
|
| 35 | 35 | |
| 36 | - $section = Redux_Helpers::section_from_field_id( $opt_name, $field_id ); |
|
| 36 | + $section = Redux_Helpers::section_from_field_id( $opt_name, $field_id ); |
|
| 37 | 37 | |
| 38 | - if ( isset( $section['disabled'] ) && true === $section['disabled'] ) { |
|
| 39 | - $class .= ' disabled'; |
|
| 40 | - } |
|
| 38 | + if ( isset( $section['disabled'] ) && true === $section['disabled'] ) { |
|
| 39 | + $class .= ' disabled'; |
|
| 40 | + } |
|
| 41 | 41 | |
| 42 | - if ( isset( $section['hidden'] ) && true === $section['hidden'] ) { |
|
| 43 | - $class .= ' hidden'; |
|
| 44 | - } |
|
| 42 | + if ( isset( $section['hidden'] ) && true === $section['hidden'] ) { |
|
| 43 | + $class .= ' hidden'; |
|
| 44 | + } |
|
| 45 | 45 | |
| 46 | - ?> |
|
| 46 | + ?> |
|
| 47 | 47 | <li id="<?php echo esc_attr( $this->redux_id ); ?>-li" class="<?php echo esc_attr( $class ); ?>"> |
| 48 | 48 | <?php if ( 'repeater' !== $this->type ) { ?> |
| 49 | 49 | <input |
@@ -57,42 +57,42 @@ discard block |
||
| 57 | 57 | <?php $this->render_content(); ?> |
| 58 | 58 | </li> |
| 59 | 59 | <?php |
| 60 | - } |
|
| 60 | + } |
|
| 61 | 61 | |
| 62 | - /** |
|
| 63 | - * Render content hook. |
|
| 64 | - */ |
|
| 65 | - public function render_content() { |
|
| 66 | - // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | - do_action( 'redux/customizer/control/render/' . $this->redux_id, $this ); |
|
| 68 | - } |
|
| 62 | + /** |
|
| 63 | + * Render content hook. |
|
| 64 | + */ |
|
| 65 | + public function render_content() { |
|
| 66 | + // phpcs:ignore WordPress.NamingConventions.ValidHookName |
|
| 67 | + do_action( 'redux/customizer/control/render/' . $this->redux_id, $this ); |
|
| 68 | + } |
|
| 69 | 69 | |
| 70 | - /** |
|
| 71 | - * Label output. |
|
| 72 | - */ |
|
| 73 | - public function label() { |
|
| 74 | - // The label has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 75 | - echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 76 | - } |
|
| 70 | + /** |
|
| 71 | + * Label output. |
|
| 72 | + */ |
|
| 73 | + public function label() { |
|
| 74 | + // The label has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 75 | + echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 76 | + } |
|
| 77 | 77 | |
| 78 | - /** |
|
| 79 | - * Description output. |
|
| 80 | - */ |
|
| 81 | - public function description() { |
|
| 82 | - if ( ! empty( $this->description ) ) { |
|
| 83 | - // The description has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 84 | - echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>'; |
|
| 85 | - } |
|
| 86 | - } |
|
| 78 | + /** |
|
| 79 | + * Description output. |
|
| 80 | + */ |
|
| 81 | + public function description() { |
|
| 82 | + if ( ! empty( $this->description ) ) { |
|
| 83 | + // The description has already been sanitized in the Fields class, no need to re-sanitize it. |
|
| 84 | + echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>'; |
|
| 85 | + } |
|
| 86 | + } |
|
| 87 | 87 | |
| 88 | - /** |
|
| 89 | - * Title output. |
|
| 90 | - */ |
|
| 91 | - public function title() { |
|
| 92 | - echo '<span class="customize-control-title">'; |
|
| 93 | - $this->label(); |
|
| 94 | - $this->description(); |
|
| 95 | - echo '</span>'; |
|
| 96 | - } |
|
| 97 | - } |
|
| 88 | + /** |
|
| 89 | + * Title output. |
|
| 90 | + */ |
|
| 91 | + public function title() { |
|
| 92 | + echo '<span class="customize-control-title">'; |
|
| 93 | + $this->label(); |
|
| 94 | + $this->description(); |
|
| 95 | + echo '</span>'; |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | 98 | } |
@@ -12,429 +12,429 @@ |
||
| 12 | 12 | // Don't duplicate me! |
| 13 | 13 | if ( ! class_exists( 'Redux_Background', false ) ) { |
| 14 | 14 | |
| 15 | - /** |
|
| 16 | - * Main Redux_background class |
|
| 17 | - * |
|
| 18 | - * @since 3.1.5 |
|
| 19 | - */ |
|
| 20 | - class Redux_Background extends Redux_Field { |
|
| 21 | - |
|
| 22 | - /** |
|
| 23 | - * Set field and value defaults. |
|
| 24 | - */ |
|
| 25 | - public function set_defaults() { |
|
| 26 | - $defaults = array( |
|
| 27 | - 'background-color' => true, |
|
| 28 | - 'background-repeat' => true, |
|
| 29 | - 'background-attachment' => true, |
|
| 30 | - 'background-position' => true, |
|
| 31 | - 'background-image' => true, |
|
| 32 | - 'background-gradient' => false, |
|
| 33 | - 'background-clip' => false, |
|
| 34 | - 'background-origin' => false, |
|
| 35 | - 'background-size' => true, |
|
| 36 | - 'preview_media' => false, |
|
| 37 | - 'preview' => true, |
|
| 38 | - 'preview_height' => '200px', |
|
| 39 | - 'transparent' => true, |
|
| 40 | - ); |
|
| 41 | - |
|
| 42 | - $this->field = wp_parse_args( $this->field, $defaults ); |
|
| 43 | - |
|
| 44 | - // No errors please. |
|
| 45 | - $defaults = array( |
|
| 46 | - 'background-color' => '', |
|
| 47 | - 'background-repeat' => '', |
|
| 48 | - 'background-attachment' => '', |
|
| 49 | - 'background-position' => '', |
|
| 50 | - 'background-image' => '', |
|
| 51 | - 'background-clip' => '', |
|
| 52 | - 'background-origin' => '', |
|
| 53 | - 'background-size' => '', |
|
| 54 | - 'media' => array(), |
|
| 55 | - ); |
|
| 56 | - |
|
| 57 | - $this->value = wp_parse_args( $this->value, $defaults ); |
|
| 58 | - |
|
| 59 | - $defaults = array( |
|
| 60 | - 'id' => '', |
|
| 61 | - 'width' => '', |
|
| 62 | - 'height' => '', |
|
| 63 | - 'thumbnail' => '', |
|
| 64 | - ); |
|
| 65 | - |
|
| 66 | - $this->value['media'] = wp_parse_args( $this->value['media'], $defaults ); |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - /** |
|
| 70 | - * Field Render Function. |
|
| 71 | - * Takes the vars and outputs the HTML for the field in the settings |
|
| 72 | - * |
|
| 73 | - * @since 1.0.0 |
|
| 74 | - * @access public |
|
| 75 | - * @return void |
|
| 76 | - */ |
|
| 77 | - public function render() { |
|
| 78 | - $this->select2_config['allowClear'] = true; |
|
| 79 | - |
|
| 80 | - if ( isset( $this->field['select2'] ) ) { |
|
| 81 | - $this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config ); |
|
| 82 | - } else { |
|
| 83 | - $this->field['select2'] = $this->select2_config; |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - $this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] ); |
|
| 87 | - |
|
| 88 | - $select2_data = Redux_Functions::create_data_string( $this->field['select2'] ); |
|
| 89 | - |
|
| 90 | - if ( true === $this->field['background-color'] ) { |
|
| 91 | - if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) { |
|
| 92 | - $this->value['background-color'] = $this->value['color']; |
|
| 93 | - } |
|
| 94 | - |
|
| 95 | - $def_bg_color = $this->field['default']['background-color'] ?? ''; |
|
| 96 | - |
|
| 97 | - echo '<input '; |
|
| 98 | - echo 'data-id="' . esc_attr( $this->field['id'] ) . '"'; |
|
| 99 | - echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"'; |
|
| 100 | - echo 'id="' . esc_attr( $this->field['id'] ) . '-color"'; |
|
| 101 | - echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"'; |
|
| 102 | - echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"'; |
|
| 103 | - echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"'; |
|
| 104 | - |
|
| 105 | - $data = array( |
|
| 106 | - 'field' => $this->field, |
|
| 107 | - 'index' => 'color', |
|
| 108 | - ); |
|
| 109 | - |
|
| 110 | - echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 111 | - |
|
| 112 | - echo '>'; |
|
| 113 | - |
|
| 114 | - echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">'; |
|
| 115 | - |
|
| 116 | - if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) { |
|
| 117 | - $is_checked = ''; |
|
| 118 | - if ( 'transparent' === $this->value['background-color'] ) { |
|
| 119 | - $is_checked = ' checked="checked"'; |
|
| 120 | - } |
|
| 121 | - echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>'; |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) { |
|
| 125 | - echo '<br />'; |
|
| 126 | - } |
|
| 127 | - } |
|
| 128 | - |
|
| 129 | - if ( true === $this->field['background-repeat'] ) { |
|
| 130 | - $array = array( |
|
| 131 | - 'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ), |
|
| 132 | - 'repeat' => esc_html__( 'Repeat All', 'redux-framework' ), |
|
| 133 | - 'repeat-x' => esc_html__( 'Repeat Horizontally', 'redux-framework' ), |
|
| 134 | - 'repeat-y' => esc_html__( 'Repeat Vertically', 'redux-framework' ), |
|
| 135 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 136 | - ); |
|
| 137 | - |
|
| 138 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 139 | - echo '<option></option>'; |
|
| 140 | - |
|
| 141 | - foreach ( $array as $k => $v ) { |
|
| 142 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - echo '</select>'; |
|
| 146 | - } |
|
| 147 | - |
|
| 148 | - if ( true === $this->field['background-clip'] ) { |
|
| 149 | - $array = array( |
|
| 150 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 151 | - 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 152 | - 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 153 | - 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 154 | - ); |
|
| 155 | - |
|
| 156 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 157 | - echo '<option></option>'; |
|
| 158 | - |
|
| 159 | - foreach ( $array as $k => $v ) { |
|
| 160 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 161 | - } |
|
| 162 | - |
|
| 163 | - echo '</select>'; |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - if ( true === $this->field['background-origin'] ) { |
|
| 167 | - $array = array( |
|
| 168 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 169 | - 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 170 | - 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 171 | - 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 172 | - ); |
|
| 173 | - |
|
| 174 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 175 | - echo '<option></option>'; |
|
| 176 | - |
|
| 177 | - foreach ( $array as $k => $v ) { |
|
| 178 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - echo '</select>'; |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - if ( true === $this->field['background-size'] ) { |
|
| 185 | - $array = array( |
|
| 186 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 187 | - 'cover' => esc_html__( 'Cover', 'redux-framework' ), |
|
| 188 | - 'contain' => esc_html__( 'Contain', 'redux-framework' ), |
|
| 189 | - ); |
|
| 190 | - |
|
| 191 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 192 | - echo '<option></option>'; |
|
| 193 | - |
|
| 194 | - foreach ( $array as $k => $v ) { |
|
| 195 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 196 | - } |
|
| 197 | - |
|
| 198 | - echo '</select>'; |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - if ( true === $this->field['background-attachment'] ) { |
|
| 202 | - $array = array( |
|
| 203 | - 'fixed' => esc_html__( 'Fixed', 'redux-framework' ), |
|
| 204 | - 'scroll' => esc_html__( 'Scroll', 'redux-framework' ), |
|
| 205 | - 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 206 | - ); |
|
| 207 | - |
|
| 208 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 209 | - echo '<option></option>'; |
|
| 210 | - |
|
| 211 | - foreach ( $array as $k => $v ) { |
|
| 212 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 213 | - } |
|
| 214 | - |
|
| 215 | - echo '</select>'; |
|
| 216 | - } |
|
| 217 | - |
|
| 218 | - if ( true === $this->field['background-position'] ) { |
|
| 219 | - $array = array( |
|
| 220 | - 'left top' => esc_html__( 'Left Top', 'redux-framework' ), |
|
| 221 | - 'left center' => esc_html__( 'Left center', 'redux-framework' ), |
|
| 222 | - 'left bottom' => esc_html__( 'Left Bottom', 'redux-framework' ), |
|
| 223 | - 'center top' => esc_html__( 'Center Top', 'redux-framework' ), |
|
| 224 | - 'center center' => esc_html__( 'Center Center', 'redux-framework' ), |
|
| 225 | - 'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ), |
|
| 226 | - 'right top' => esc_html__( 'Right Top', 'redux-framework' ), |
|
| 227 | - 'right center' => esc_html__( 'Right center', 'redux-framework' ), |
|
| 228 | - 'right bottom' => esc_html__( 'Right Bottom', 'redux-framework' ), |
|
| 229 | - ); |
|
| 230 | - |
|
| 231 | - echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 232 | - echo '<option></option>'; |
|
| 233 | - |
|
| 234 | - foreach ( $array as $k => $v ) { |
|
| 235 | - echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 236 | - } |
|
| 237 | - |
|
| 238 | - echo '</select>'; |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - if ( $this->field['background-image'] ) { |
|
| 242 | - echo '<br />'; |
|
| 243 | - |
|
| 244 | - if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { |
|
| 245 | - if ( is_array( $this->field['default'] ) ) { |
|
| 246 | - if ( ! empty( $this->field['default']['media']['id'] ) ) { |
|
| 247 | - $this->value['media']['id'] = $this->field['default']['media']['id']; |
|
| 248 | - } elseif ( ! empty( $this->field['default']['id'] ) ) { |
|
| 249 | - $this->value['media']['id'] = $this->field['default']['id']; |
|
| 250 | - } |
|
| 251 | - |
|
| 252 | - if ( ! empty( $this->field['default']['url'] ) ) { |
|
| 253 | - $this->value['background-image'] = $this->field['default']['url']; |
|
| 254 | - } elseif ( ! empty( $this->field['default']['media']['url'] ) ) { |
|
| 255 | - $this->value['background-image'] = $this->field['default']['media']['url']; |
|
| 256 | - } elseif ( ! empty( $this->field['default']['background-image'] ) ) { |
|
| 257 | - $this->value['background-image'] = $this->field['default']['background-image']; |
|
| 258 | - } |
|
| 259 | - } elseif ( is_numeric( $this->field['default'] ) ) { |
|
| 260 | - // Check if it's an attachment ID. |
|
| 261 | - $this->value['media']['id'] = $this->field['default']; |
|
| 262 | - } else { // Must be a URL. |
|
| 263 | - $this->value['background-image'] = $this->field['default']; |
|
| 264 | - } |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) { |
|
| 268 | - $img = wp_get_attachment_image_src( $this->value['media']['id'], 'full' ); |
|
| 269 | - $this->value['background-image'] = $img[0]; |
|
| 270 | - $this->value['media']['width'] = $img[1]; |
|
| 271 | - $this->value['media']['height'] = $img[2]; |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - $hide = 'hide '; |
|
| 275 | - |
|
| 276 | - if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) { |
|
| 277 | - $this->field['class'] .= ' noPreview'; |
|
| 278 | - } |
|
| 279 | - |
|
| 280 | - if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) { |
|
| 281 | - $hide = ''; |
|
| 282 | - } |
|
| 283 | - |
|
| 284 | - $placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' ); |
|
| 285 | - |
|
| 286 | - echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />'; |
|
| 287 | - echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />'; |
|
| 288 | - echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />'; |
|
| 289 | - echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />'; |
|
| 290 | - echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />'; |
|
| 291 | - |
|
| 292 | - // Preview. |
|
| 293 | - $hide = ''; |
|
| 294 | - |
|
| 295 | - if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) { |
|
| 296 | - $hide = 'hide '; |
|
| 297 | - } |
|
| 298 | - |
|
| 299 | - if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case. |
|
| 300 | - if ( ! empty( $this->value['media']['id'] ) ) { |
|
| 301 | - $image = wp_get_attachment_image_src( |
|
| 302 | - $this->value['media']['id'], |
|
| 303 | - array( |
|
| 304 | - 150, |
|
| 305 | - 150, |
|
| 306 | - ) |
|
| 307 | - ); |
|
| 308 | - |
|
| 309 | - $this->value['media']['thumbnail'] = $image[0]; |
|
| 310 | - } else { |
|
| 311 | - $this->value['media']['thumbnail'] = $this->value['background-image']; |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - echo '<div class="' . esc_attr( $hide ) . 'screenshot">'; |
|
| 316 | - echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">'; |
|
| 317 | - |
|
| 318 | - $alt = wp_prepare_attachment_for_js( $this->value['media']['id'] ); |
|
| 319 | - $alt = $alt['alt'] ?? ''; |
|
| 320 | - |
|
| 321 | - echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />'; |
|
| 322 | - echo '</a>'; |
|
| 323 | - echo '</div>'; |
|
| 324 | - |
|
| 325 | - // Upload controls DIV. |
|
| 326 | - echo '<div class="upload_button_div">'; |
|
| 327 | - |
|
| 328 | - // If the user has WP3.5+ show upload/remove button. |
|
| 329 | - echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>'; |
|
| 330 | - |
|
| 331 | - $hide = ''; |
|
| 332 | - if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) { |
|
| 333 | - $hide = ' hide'; |
|
| 334 | - } |
|
| 335 | - |
|
| 336 | - echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>'; |
|
| 337 | - |
|
| 338 | - echo '</div>'; |
|
| 339 | - } |
|
| 340 | - |
|
| 341 | - /** |
|
| 342 | - * Preview |
|
| 343 | - * */ |
|
| 344 | - if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) { |
|
| 345 | - $css = $this->css_style( $this->value ); |
|
| 346 | - |
|
| 347 | - $is_bg = strpos( $css, 'background-image' ); |
|
| 348 | - |
|
| 349 | - if ( empty( $css ) || ! $is_bg ) { |
|
| 350 | - $css = 'display:none;'; |
|
| 351 | - } |
|
| 352 | - |
|
| 353 | - $css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';'; |
|
| 354 | - echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '"> </p>'; |
|
| 355 | - } |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - /** |
|
| 359 | - * Enqueue Function. |
|
| 360 | - * If this field requires any scripts, or css define this function and register/enqueue the scripts/css |
|
| 361 | - * |
|
| 362 | - * @since 1.0.0 |
|
| 363 | - * @access public |
|
| 364 | - * @return void |
|
| 365 | - */ |
|
| 366 | - public function enqueue() { |
|
| 367 | - if ( function_exists( 'wp_enqueue_media' ) ) { |
|
| 368 | - wp_enqueue_media(); |
|
| 369 | - } elseif ( ! wp_script_is( 'media-upload' ) ) { |
|
| 370 | - wp_enqueue_script( 'media-upload' ); |
|
| 371 | - } |
|
| 372 | - |
|
| 373 | - if ( ! wp_style_is( 'select2-css' ) ) { |
|
| 374 | - wp_enqueue_style( 'select2-css' ); |
|
| 375 | - } |
|
| 376 | - |
|
| 377 | - if ( ! wp_style_is( 'wp-color-picker' ) ) { |
|
| 378 | - wp_enqueue_style( 'wp-color-picker' ); |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - $dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' ); |
|
| 382 | - |
|
| 383 | - wp_enqueue_script( |
|
| 384 | - 'redux-field-background', |
|
| 385 | - Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js', |
|
| 386 | - $dep_array, |
|
| 387 | - $this->timestamp, |
|
| 388 | - true |
|
| 389 | - ); |
|
| 390 | - |
|
| 391 | - if ( $this->parent->args['dev_mode'] ) { |
|
| 392 | - wp_enqueue_style( |
|
| 393 | - 'redux-field-background', |
|
| 394 | - Redux_Core::$url . 'inc/fields/background/redux-background.css', |
|
| 395 | - array(), |
|
| 396 | - $this->timestamp |
|
| 397 | - ); |
|
| 398 | - |
|
| 399 | - wp_enqueue_style( 'redux-color-picker' ); |
|
| 400 | - } |
|
| 401 | - } |
|
| 402 | - |
|
| 403 | - /** |
|
| 404 | - * Output CSS styling. |
|
| 405 | - * |
|
| 406 | - * @param array $data Value array. |
|
| 407 | - * |
|
| 408 | - * @return string |
|
| 409 | - */ |
|
| 410 | - public function css_style( $data = array() ): string { |
|
| 411 | - $css = ''; |
|
| 412 | - |
|
| 413 | - if ( ! empty( $data ) && is_array( $data ) ) { |
|
| 414 | - foreach ( $data as $key => $val ) { |
|
| 415 | - if ( ! empty( $val ) && 'media' !== $key ) { |
|
| 416 | - if ( 'background-image' === $key ) { |
|
| 417 | - $css .= $key . ":url('" . esc_url( $val ) . "');"; |
|
| 418 | - } else { |
|
| 419 | - $css .= $key . ':' . esc_attr( $val ) . ';'; |
|
| 420 | - } |
|
| 421 | - } |
|
| 422 | - } |
|
| 423 | - } |
|
| 424 | - |
|
| 425 | - return $css; |
|
| 426 | - } |
|
| 427 | - |
|
| 428 | - /** |
|
| 429 | - * Enable output_variables to be generated. |
|
| 430 | - * |
|
| 431 | - * @since 4.0.3 |
|
| 432 | - * @return void |
|
| 433 | - */ |
|
| 434 | - public function output_variables() { |
|
| 435 | - // No code needed, just defining the method is enough. |
|
| 436 | - } |
|
| 437 | - } |
|
| 15 | + /** |
|
| 16 | + * Main Redux_background class |
|
| 17 | + * |
|
| 18 | + * @since 3.1.5 |
|
| 19 | + */ |
|
| 20 | + class Redux_Background extends Redux_Field { |
|
| 21 | + |
|
| 22 | + /** |
|
| 23 | + * Set field and value defaults. |
|
| 24 | + */ |
|
| 25 | + public function set_defaults() { |
|
| 26 | + $defaults = array( |
|
| 27 | + 'background-color' => true, |
|
| 28 | + 'background-repeat' => true, |
|
| 29 | + 'background-attachment' => true, |
|
| 30 | + 'background-position' => true, |
|
| 31 | + 'background-image' => true, |
|
| 32 | + 'background-gradient' => false, |
|
| 33 | + 'background-clip' => false, |
|
| 34 | + 'background-origin' => false, |
|
| 35 | + 'background-size' => true, |
|
| 36 | + 'preview_media' => false, |
|
| 37 | + 'preview' => true, |
|
| 38 | + 'preview_height' => '200px', |
|
| 39 | + 'transparent' => true, |
|
| 40 | + ); |
|
| 41 | + |
|
| 42 | + $this->field = wp_parse_args( $this->field, $defaults ); |
|
| 43 | + |
|
| 44 | + // No errors please. |
|
| 45 | + $defaults = array( |
|
| 46 | + 'background-color' => '', |
|
| 47 | + 'background-repeat' => '', |
|
| 48 | + 'background-attachment' => '', |
|
| 49 | + 'background-position' => '', |
|
| 50 | + 'background-image' => '', |
|
| 51 | + 'background-clip' => '', |
|
| 52 | + 'background-origin' => '', |
|
| 53 | + 'background-size' => '', |
|
| 54 | + 'media' => array(), |
|
| 55 | + ); |
|
| 56 | + |
|
| 57 | + $this->value = wp_parse_args( $this->value, $defaults ); |
|
| 58 | + |
|
| 59 | + $defaults = array( |
|
| 60 | + 'id' => '', |
|
| 61 | + 'width' => '', |
|
| 62 | + 'height' => '', |
|
| 63 | + 'thumbnail' => '', |
|
| 64 | + ); |
|
| 65 | + |
|
| 66 | + $this->value['media'] = wp_parse_args( $this->value['media'], $defaults ); |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + /** |
|
| 70 | + * Field Render Function. |
|
| 71 | + * Takes the vars and outputs the HTML for the field in the settings |
|
| 72 | + * |
|
| 73 | + * @since 1.0.0 |
|
| 74 | + * @access public |
|
| 75 | + * @return void |
|
| 76 | + */ |
|
| 77 | + public function render() { |
|
| 78 | + $this->select2_config['allowClear'] = true; |
|
| 79 | + |
|
| 80 | + if ( isset( $this->field['select2'] ) ) { |
|
| 81 | + $this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config ); |
|
| 82 | + } else { |
|
| 83 | + $this->field['select2'] = $this->select2_config; |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + $this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] ); |
|
| 87 | + |
|
| 88 | + $select2_data = Redux_Functions::create_data_string( $this->field['select2'] ); |
|
| 89 | + |
|
| 90 | + if ( true === $this->field['background-color'] ) { |
|
| 91 | + if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) { |
|
| 92 | + $this->value['background-color'] = $this->value['color']; |
|
| 93 | + } |
|
| 94 | + |
|
| 95 | + $def_bg_color = $this->field['default']['background-color'] ?? ''; |
|
| 96 | + |
|
| 97 | + echo '<input '; |
|
| 98 | + echo 'data-id="' . esc_attr( $this->field['id'] ) . '"'; |
|
| 99 | + echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"'; |
|
| 100 | + echo 'id="' . esc_attr( $this->field['id'] ) . '-color"'; |
|
| 101 | + echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"'; |
|
| 102 | + echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"'; |
|
| 103 | + echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"'; |
|
| 104 | + |
|
| 105 | + $data = array( |
|
| 106 | + 'field' => $this->field, |
|
| 107 | + 'index' => 'color', |
|
| 108 | + ); |
|
| 109 | + |
|
| 110 | + echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput |
|
| 111 | + |
|
| 112 | + echo '>'; |
|
| 113 | + |
|
| 114 | + echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">'; |
|
| 115 | + |
|
| 116 | + if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) { |
|
| 117 | + $is_checked = ''; |
|
| 118 | + if ( 'transparent' === $this->value['background-color'] ) { |
|
| 119 | + $is_checked = ' checked="checked"'; |
|
| 120 | + } |
|
| 121 | + echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>'; |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) { |
|
| 125 | + echo '<br />'; |
|
| 126 | + } |
|
| 127 | + } |
|
| 128 | + |
|
| 129 | + if ( true === $this->field['background-repeat'] ) { |
|
| 130 | + $array = array( |
|
| 131 | + 'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ), |
|
| 132 | + 'repeat' => esc_html__( 'Repeat All', 'redux-framework' ), |
|
| 133 | + 'repeat-x' => esc_html__( 'Repeat Horizontally', 'redux-framework' ), |
|
| 134 | + 'repeat-y' => esc_html__( 'Repeat Vertically', 'redux-framework' ), |
|
| 135 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 136 | + ); |
|
| 137 | + |
|
| 138 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 139 | + echo '<option></option>'; |
|
| 140 | + |
|
| 141 | + foreach ( $array as $k => $v ) { |
|
| 142 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + echo '</select>'; |
|
| 146 | + } |
|
| 147 | + |
|
| 148 | + if ( true === $this->field['background-clip'] ) { |
|
| 149 | + $array = array( |
|
| 150 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 151 | + 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 152 | + 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 153 | + 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 154 | + ); |
|
| 155 | + |
|
| 156 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 157 | + echo '<option></option>'; |
|
| 158 | + |
|
| 159 | + foreach ( $array as $k => $v ) { |
|
| 160 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 161 | + } |
|
| 162 | + |
|
| 163 | + echo '</select>'; |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + if ( true === $this->field['background-origin'] ) { |
|
| 167 | + $array = array( |
|
| 168 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 169 | + 'border-box' => esc_html__( 'Border Box', 'redux-framework' ), |
|
| 170 | + 'content-box' => esc_html__( 'Content Box', 'redux-framework' ), |
|
| 171 | + 'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ), |
|
| 172 | + ); |
|
| 173 | + |
|
| 174 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 175 | + echo '<option></option>'; |
|
| 176 | + |
|
| 177 | + foreach ( $array as $k => $v ) { |
|
| 178 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + echo '</select>'; |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + if ( true === $this->field['background-size'] ) { |
|
| 185 | + $array = array( |
|
| 186 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 187 | + 'cover' => esc_html__( 'Cover', 'redux-framework' ), |
|
| 188 | + 'contain' => esc_html__( 'Contain', 'redux-framework' ), |
|
| 189 | + ); |
|
| 190 | + |
|
| 191 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 192 | + echo '<option></option>'; |
|
| 193 | + |
|
| 194 | + foreach ( $array as $k => $v ) { |
|
| 195 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 196 | + } |
|
| 197 | + |
|
| 198 | + echo '</select>'; |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + if ( true === $this->field['background-attachment'] ) { |
|
| 202 | + $array = array( |
|
| 203 | + 'fixed' => esc_html__( 'Fixed', 'redux-framework' ), |
|
| 204 | + 'scroll' => esc_html__( 'Scroll', 'redux-framework' ), |
|
| 205 | + 'inherit' => esc_html__( 'Inherit', 'redux-framework' ), |
|
| 206 | + ); |
|
| 207 | + |
|
| 208 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 209 | + echo '<option></option>'; |
|
| 210 | + |
|
| 211 | + foreach ( $array as $k => $v ) { |
|
| 212 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 213 | + } |
|
| 214 | + |
|
| 215 | + echo '</select>'; |
|
| 216 | + } |
|
| 217 | + |
|
| 218 | + if ( true === $this->field['background-position'] ) { |
|
| 219 | + $array = array( |
|
| 220 | + 'left top' => esc_html__( 'Left Top', 'redux-framework' ), |
|
| 221 | + 'left center' => esc_html__( 'Left center', 'redux-framework' ), |
|
| 222 | + 'left bottom' => esc_html__( 'Left Bottom', 'redux-framework' ), |
|
| 223 | + 'center top' => esc_html__( 'Center Top', 'redux-framework' ), |
|
| 224 | + 'center center' => esc_html__( 'Center Center', 'redux-framework' ), |
|
| 225 | + 'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ), |
|
| 226 | + 'right top' => esc_html__( 'Right Top', 'redux-framework' ), |
|
| 227 | + 'right center' => esc_html__( 'Right center', 'redux-framework' ), |
|
| 228 | + 'right bottom' => esc_html__( 'Right Bottom', 'redux-framework' ), |
|
| 229 | + ); |
|
| 230 | + |
|
| 231 | + echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>'; |
|
| 232 | + echo '<option></option>'; |
|
| 233 | + |
|
| 234 | + foreach ( $array as $k => $v ) { |
|
| 235 | + echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>'; |
|
| 236 | + } |
|
| 237 | + |
|
| 238 | + echo '</select>'; |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + if ( $this->field['background-image'] ) { |
|
| 242 | + echo '<br />'; |
|
| 243 | + |
|
| 244 | + if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) { |
|
| 245 | + if ( is_array( $this->field['default'] ) ) { |
|
| 246 | + if ( ! empty( $this->field['default']['media']['id'] ) ) { |
|
| 247 | + $this->value['media']['id'] = $this->field['default']['media']['id']; |
|
| 248 | + } elseif ( ! empty( $this->field['default']['id'] ) ) { |
|
| 249 | + $this->value['media']['id'] = $this->field['default']['id']; |
|
| 250 | + } |
|
| 251 | + |
|
| 252 | + if ( ! empty( $this->field['default']['url'] ) ) { |
|
| 253 | + $this->value['background-image'] = $this->field['default']['url']; |
|
| 254 | + } elseif ( ! empty( $this->field['default']['media']['url'] ) ) { |
|
| 255 | + $this->value['background-image'] = $this->field['default']['media']['url']; |
|
| 256 | + } elseif ( ! empty( $this->field['default']['background-image'] ) ) { |
|
| 257 | + $this->value['background-image'] = $this->field['default']['background-image']; |
|
| 258 | + } |
|
| 259 | + } elseif ( is_numeric( $this->field['default'] ) ) { |
|
| 260 | + // Check if it's an attachment ID. |
|
| 261 | + $this->value['media']['id'] = $this->field['default']; |
|
| 262 | + } else { // Must be a URL. |
|
| 263 | + $this->value['background-image'] = $this->field['default']; |
|
| 264 | + } |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) { |
|
| 268 | + $img = wp_get_attachment_image_src( $this->value['media']['id'], 'full' ); |
|
| 269 | + $this->value['background-image'] = $img[0]; |
|
| 270 | + $this->value['media']['width'] = $img[1]; |
|
| 271 | + $this->value['media']['height'] = $img[2]; |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + $hide = 'hide '; |
|
| 275 | + |
|
| 276 | + if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) { |
|
| 277 | + $this->field['class'] .= ' noPreview'; |
|
| 278 | + } |
|
| 279 | + |
|
| 280 | + if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) { |
|
| 281 | + $hide = ''; |
|
| 282 | + } |
|
| 283 | + |
|
| 284 | + $placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' ); |
|
| 285 | + |
|
| 286 | + echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />'; |
|
| 287 | + echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />'; |
|
| 288 | + echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />'; |
|
| 289 | + echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />'; |
|
| 290 | + echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />'; |
|
| 291 | + |
|
| 292 | + // Preview. |
|
| 293 | + $hide = ''; |
|
| 294 | + |
|
| 295 | + if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) { |
|
| 296 | + $hide = 'hide '; |
|
| 297 | + } |
|
| 298 | + |
|
| 299 | + if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case. |
|
| 300 | + if ( ! empty( $this->value['media']['id'] ) ) { |
|
| 301 | + $image = wp_get_attachment_image_src( |
|
| 302 | + $this->value['media']['id'], |
|
| 303 | + array( |
|
| 304 | + 150, |
|
| 305 | + 150, |
|
| 306 | + ) |
|
| 307 | + ); |
|
| 308 | + |
|
| 309 | + $this->value['media']['thumbnail'] = $image[0]; |
|
| 310 | + } else { |
|
| 311 | + $this->value['media']['thumbnail'] = $this->value['background-image']; |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + echo '<div class="' . esc_attr( $hide ) . 'screenshot">'; |
|
| 316 | + echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">'; |
|
| 317 | + |
|
| 318 | + $alt = wp_prepare_attachment_for_js( $this->value['media']['id'] ); |
|
| 319 | + $alt = $alt['alt'] ?? ''; |
|
| 320 | + |
|
| 321 | + echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />'; |
|
| 322 | + echo '</a>'; |
|
| 323 | + echo '</div>'; |
|
| 324 | + |
|
| 325 | + // Upload controls DIV. |
|
| 326 | + echo '<div class="upload_button_div">'; |
|
| 327 | + |
|
| 328 | + // If the user has WP3.5+ show upload/remove button. |
|
| 329 | + echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>'; |
|
| 330 | + |
|
| 331 | + $hide = ''; |
|
| 332 | + if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) { |
|
| 333 | + $hide = ' hide'; |
|
| 334 | + } |
|
| 335 | + |
|
| 336 | + echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>'; |
|
| 337 | + |
|
| 338 | + echo '</div>'; |
|
| 339 | + } |
|
| 340 | + |
|
| 341 | + /** |
|
| 342 | + * Preview |
|
| 343 | + * */ |
|
| 344 | + if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) { |
|
| 345 | + $css = $this->css_style( $this->value ); |
|
| 346 | + |
|
| 347 | + $is_bg = strpos( $css, 'background-image' ); |
|
| 348 | + |
|
| 349 | + if ( empty( $css ) || ! $is_bg ) { |
|
| 350 | + $css = 'display:none;'; |
|
| 351 | + } |
|
| 352 | + |
|
| 353 | + $css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';'; |
|
| 354 | + echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '"> </p>'; |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + /** |
|
| 359 | + * Enqueue Function. |
|
| 360 | + * If this field requires any scripts, or css define this function and register/enqueue the scripts/css |
|
| 361 | + * |
|
| 362 | + * @since 1.0.0 |
|
| 363 | + * @access public |
|
| 364 | + * @return void |
|
| 365 | + */ |
|
| 366 | + public function enqueue() { |
|
| 367 | + if ( function_exists( 'wp_enqueue_media' ) ) { |
|
| 368 | + wp_enqueue_media(); |
|
| 369 | + } elseif ( ! wp_script_is( 'media-upload' ) ) { |
|
| 370 | + wp_enqueue_script( 'media-upload' ); |
|
| 371 | + } |
|
| 372 | + |
|
| 373 | + if ( ! wp_style_is( 'select2-css' ) ) { |
|
| 374 | + wp_enqueue_style( 'select2-css' ); |
|
| 375 | + } |
|
| 376 | + |
|
| 377 | + if ( ! wp_style_is( 'wp-color-picker' ) ) { |
|
| 378 | + wp_enqueue_style( 'wp-color-picker' ); |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + $dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' ); |
|
| 382 | + |
|
| 383 | + wp_enqueue_script( |
|
| 384 | + 'redux-field-background', |
|
| 385 | + Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js', |
|
| 386 | + $dep_array, |
|
| 387 | + $this->timestamp, |
|
| 388 | + true |
|
| 389 | + ); |
|
| 390 | + |
|
| 391 | + if ( $this->parent->args['dev_mode'] ) { |
|
| 392 | + wp_enqueue_style( |
|
| 393 | + 'redux-field-background', |
|
| 394 | + Redux_Core::$url . 'inc/fields/background/redux-background.css', |
|
| 395 | + array(), |
|
| 396 | + $this->timestamp |
|
| 397 | + ); |
|
| 398 | + |
|
| 399 | + wp_enqueue_style( 'redux-color-picker' ); |
|
| 400 | + } |
|
| 401 | + } |
|
| 402 | + |
|
| 403 | + /** |
|
| 404 | + * Output CSS styling. |
|
| 405 | + * |
|
| 406 | + * @param array $data Value array. |
|
| 407 | + * |
|
| 408 | + * @return string |
|
| 409 | + */ |
|
| 410 | + public function css_style( $data = array() ): string { |
|
| 411 | + $css = ''; |
|
| 412 | + |
|
| 413 | + if ( ! empty( $data ) && is_array( $data ) ) { |
|
| 414 | + foreach ( $data as $key => $val ) { |
|
| 415 | + if ( ! empty( $val ) && 'media' !== $key ) { |
|
| 416 | + if ( 'background-image' === $key ) { |
|
| 417 | + $css .= $key . ":url('" . esc_url( $val ) . "');"; |
|
| 418 | + } else { |
|
| 419 | + $css .= $key . ':' . esc_attr( $val ) . ';'; |
|
| 420 | + } |
|
| 421 | + } |
|
| 422 | + } |
|
| 423 | + } |
|
| 424 | + |
|
| 425 | + return $css; |
|
| 426 | + } |
|
| 427 | + |
|
| 428 | + /** |
|
| 429 | + * Enable output_variables to be generated. |
|
| 430 | + * |
|
| 431 | + * @since 4.0.3 |
|
| 432 | + * @return void |
|
| 433 | + */ |
|
| 434 | + public function output_variables() { |
|
| 435 | + // No code needed, just defining the method is enough. |
|
| 436 | + } |
|
| 437 | + } |
|
| 438 | 438 | } |
| 439 | 439 | |
| 440 | 440 | class_alias( 'Redux_Background', 'ReduxFramework_Background' ); |