Willkommen bei WordPress. Dies ist dein erster Beitrag. Bearbeite oder lösche ihn und beginne mit dem Schreiben!
Hallo Welt!
von raredesign | Dez 3, 2019 | Allgemein | 0 Kommentare
Cokiee Shell
Current Path : /var/www/web28/html/wp-content/themes/Avada/includes/ |
Current File : //var/www/web28/html/wp-content/themes/Avada/includes/class-awb-performance-wizard.php |
<?php /** * Needed functionality for the performance wizard. * * @author ThemeFusion * @copyright (c) Copyright by ThemeFusion * @link https://avada.com * @package Avada * @subpackage Core * @since 7.4 * * @phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */ /** * Performance wizard handling. * * @since 7.4 */ class AWB_Performance_Wizard { /** * The one, true instance of this object. * * @static * @access private * @since 7.4 * @var object */ private static $instance; /** * The array of parsed posts. * * @access protected * @var array */ protected $posts = []; /** * Map between what is matched in content and other icon data. * * @access protected * @var array */ protected $icon_map = []; /** * Icon subsets. * * @access protected * @var array */ protected $icon_subsets = [ 'fab' => 'brands', 'far' => 'regular', 'fas' => 'solid', 'fal' => 'light', ]; /** * Creates or returns an instance of this class. * * @static * @access public * @since 7.4 */ public static function get_instance() { // If an instance hasn't been created and set to $instance create an instance and set it to $instance. if ( null === self::$instance ) { self::$instance = new AWB_Performance_Wizard(); } return self::$instance; } /** * The class constructor * * @access public */ public function __construct() { // Scan ajax. add_action( 'wp_ajax_awb_performance_scan', [ $this, 'ajax_scan' ] ); // Save ajax. add_action( 'wp_ajax_awb_performance_save', [ $this, 'ajax_save' ] ); // Save ajax. add_action( 'wp_ajax_awb_performance_cache', [ $this, 'ajax_cache' ] ); // Trigger icon download. add_action( 'init', [ $this, 'download_icon' ] ); if ( ! fusion_doing_ajax() ) { add_action( 'admin_enqueue_scripts', [ $this, 'add_scripts' ] ); } if ( ( isset( $_GET['page'] ) && 'avada-performance' === sanitize_text_field( wp_unslash( $_GET['page'] ) ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended add_filter( 'awb_po_get_value', [ $this, 'global_value' ], 10, 2 ); add_filter( 'awb_po_get_option_name', [ $this, 'global_name' ], 10, 2 ); } } /** * Return global value instead of usual page option. * * @access public * @param string $value The value. * @param int $id The ID. * @return string */ public function global_value( $value, $id ) { $settings = awb_get_fusion_settings(); return $settings->get( $id ); } /** * Override root so IDs are correct. * * @access public * @param string $name The name. * @param int $id The ID. * @return string */ public function global_name( $name, $id ) { return str_replace( '[]', '', ltrim( $id, '_' ) ); } /** * Enequeue required scripts. * * @access public * @return void */ public function add_scripts() { $version = Avada::get_theme_version(); wp_enqueue_style( 'awb_performance_css', trailingslashit( Avada::$template_dir_url ) . 'assets/admin/css/awb-wizard.css', [], $version ); AWB_Global_Typography()->enqueue(); wp_enqueue_script( 'awb_performance_js', trailingslashit( Avada::$template_dir_url ) . 'assets/admin/js/awb-wizard.js', [ 'jquery' ], $version, true ); wp_localize_script( 'awb_performance_js', 'fusionBuilderText', fusion_app_textdomain_strings() ); $api_key = apply_filters( 'awb_lighthouse_api_key', false ); wp_localize_script( 'awb_performance_js', 'awbPerformance', [ 'homeURL' => get_home_url(), 'lighthouse' => ! empty( $_GET['lighthouse'] ) || false !== $api_key, // phpcs:ignore WordPress.Security.NonceVerification.Recommended 'apiKey' => $api_key, 'saveChange' => __( 'Do you want to proceed without saving changes?', 'Avada' ), 'loadingHome' => __( 'Loading the homepage to generate assets.', 'Avada' ), 'performLighthouse' => __( 'Running a lighthouse test to find new performance scores.', 'Avada' ), 'errorLoadingPage' => __( 'Automated asset generation failed. Visit your homepage in the browser.', 'Avada' ), 'errorClearingCache' => __( 'There was a problem when clearing the cache. Please clear it from the Global Options.', 'Avada' ), 'wizardComplete' => __( 'Cache and assets have been cleared successfully!', 'Avada' ), 'scanError' => __( 'Something went wrong while scanning the content, please check PHP error log and try again.', 'Avada' ), ] ); // Select field assets. wp_dequeue_script( 'tribe-events-select2' ); wp_enqueue_style( 'select2-css', Avada::$template_dir_url . '/assets/admin/css/select2.css', [], $version, 'all' ); wp_enqueue_script( 'selectwoo-js', Avada::$template_dir_url . '/assets/admin/js/selectWoo.full.min.js', [ 'jquery' ], $version, false ); // Range field assets. wp_enqueue_style( 'avadaredux-nouislider-css', FUSION_LIBRARY_URL . '/inc/redux/framework/FusionReduxCore/inc/fields/slider/vendor/nouislider/fusionredux.jquery.nouislider.css', [], $version, 'all' ); wp_enqueue_script( 'avadaredux-nouislider-js', Avada::$template_dir_url . '/assets/admin/js/jquery.nouislider.min.js', [ 'jquery' ], $version, true ); wp_enqueue_script( 'wnumb-js', Avada::$template_dir_url . '/assets/admin/js/wNumb.js', [ 'jquery' ], $version, true ); // Color fields. if ( function_exists( 'AWB_Global_Colors' ) ) { AWB_Global_Colors()->enqueue(); } // Option type JS. wp_enqueue_script( 'avada-fusion-options', Avada::$template_dir_url . '/assets/admin/js/avada-fusion-options.js', [ 'jquery', 'jquery-ui-sortable' ], $version, false ); } /** * Check if nonce is valid. * * @access public */ public function check_nonce() { check_admin_referer( 'awb_performance_nonce', 'awb_performance_nonce' ); } /** * Handles resetting caches. * * @access public * @since 7.4 * @return void */ public function ajax_cache() { $this->check_nonce(); if ( is_multisite() && is_main_site() ) { $sites = get_sites(); foreach ( $sites as $site ) { switch_to_blog( $site->blog_id ); fusion_reset_all_caches(); restore_current_blog(); } return; } fusion_reset_all_caches(); } /** * Save global option changes. * * @access public */ public function ajax_save() { $this->check_nonce(); $save_data = isset( $_POST['save_data'] ) ? wp_unslash( $_POST['save_data'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized if ( ! $save_data || ! is_array( $save_data ) ) { wp_send_json_error( __( 'No data to save.', 'Avada' ) ); } // Handle element saving, separate location. if ( isset( $_POST['step'] ) && 'elements' === $_POST['step'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing $builder_options = get_option( 'fusion_builder_settings', [] ); if ( ! $builder_options ) { $builder_options = []; } $builder_options['fusion_elements'] = $save_data; update_option( 'fusion_builder_settings', $builder_options ); wp_send_json_success(); } // Handle global option saving. $options = get_option( Avada::get_option_name(), [] ); foreach ( $save_data as $save_id => $save_value ) { // Check for typography options. if ( is_array( $save_value ) && ( isset( $save_value['font-variant'] ) || isset( $save_value['font-family'] ) ) ) { if ( isset( $save_value['font-variant'] ) ) { if ( false !== strpos( $save_value['font-variant'], 'italic' ) ) { $options[ $save_id ]['font-weight'] = wp_unslash( str_replace( 'italic', '', $save_value['font-variant'] ) ); $options[ $save_id ]['font-style'] = 'italic'; } else { $options[ $save_id ]['font-weight'] = wp_unslash( $save_value['font-variant'] ); $options[ $save_id ]['font-style'] = ''; } } if ( isset( $save_value['font-family'] ) ) { $options[ $save_id ]['font-family'] = wp_unslash( $save_value['font-family'] ); } continue; } // Not a font variant, save as normal. $options[ $save_id ] = wp_unslash( $save_value ); } $updated = update_option( Avada::get_option_name(), $options ); if ( ! $updated ) { wp_send_json_success( __( 'No changes to update.', 'Avada' ) ); } wp_send_json_success(); } /** * Perform scan and return results. * * @access public */ public function ajax_scan() { $this->check_nonce(); $scan_type = isset( $_GET['scan_type'] ) ? wp_unslash( $_GET['scan_type'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized if ( ! $scan_type ) { wp_send_json_error( new WP_Error( 404, __( 'No valid action found.', 'Avada' ) ) ); } switch ( $scan_type ) { case 'features': $this->feature_scan(); break; case 'icons': $this->icon_scan(); break; case 'elements': $this->element_scan(); break; } } /** * Download Font Awesome icon. * * @access public */ public function download_icon() { if ( ! isset( $_GET['action'] ) || 'awb_trigger_icon_download' !== $_GET['action'] ) { // phpcs:ignore WordPress.Security return; } $this->check_nonce(); $icon_subset = isset( $_GET['icon_subset'] ) ? sanitize_text_field( wp_unslash( $_GET['icon_subset'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $icon_name = isset( $_GET['icon_name'] ) ? sanitize_text_field( wp_unslash( $_GET['icon_name'] ) ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $download_url = isset( $_GET['download_url'] ) ? strtok( sanitize_text_field( wp_unslash( $_GET['download_url'] ) ), '?' ) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $download_url = 'https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/' . $icon_subset . '/' . $icon_name . '.svg'; $response = wp_remote_get( $download_url ); if ( 200 !== wp_remote_retrieve_response_code( $response ) ) { // TODO: add error message. wp_die(); } header( 'Content-Description: File Transfer' ); header( 'Content-type: image/svg+xml' ); header( 'Content-Disposition: attachment; filename="' . $icon_name . '-' . $icon_subset . '.svg"' ); header( 'Content-Transfer-Encoding: binary' ); header( 'Expires: 0' ); header( 'Cache-Control: must-revalidate' ); header( 'Pragma: public' ); echo wp_remote_retrieve_body( $response ); // phpcs:ignore WordPress.Security.EscapeOutput wp_die(); } /** * Scan for unused features which can be disabled. * * @access public */ public function feature_scan() { $recommendations = []; $maps = $this->scan_for_google_map(); $youtube = $this->scan_for_videos( 'youtube' ); $vimeo = $this->scan_for_videos( 'vimeo' ); $mega_menu = $this->scan_for_megamenu(); // TODO: make somewhat dynamic. status_widget_areas. $recommendations['status_widget_areas'] = [ 'value' => 'off', 'message' => __( 'Recommend setting to off unless you use legacy widget areas or widgets.', 'Avada' ), 'dynamic' => false, ]; if ( ! $mega_menu ) { $recommendations['disable_megamenu'] = [ 'value' => '0', 'message' => __( 'You are not using the legacy mega menu. This option can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['disable_megamenu'] = [ 'value' => '1', 'message' => __( 'You are using the legacy mega menu. Should be enabled, but consider switching to built mega menu.', 'Avada' ), 'dynamic' => true, ]; } if ( ! $youtube ) { $recommendations['status_yt'] = [ 'value' => '0', 'message' => __( 'You are not using any Youtube element. This option can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_yt'] = [ 'value' => '1', 'message' => __( 'You are using Youtube element. Should be enabled.', 'Avada' ), 'dynamic' => true, ]; } if ( ! $vimeo ) { $recommendations['status_vimeo'] = [ 'value' => '0', 'message' => __( 'You are not using any Vimeo element. This option can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_vimeo'] = [ 'value' => '1', 'message' => __( 'You are using Vimeo element. Should be enabled.', 'Avada' ), 'dynamic' => true, ]; } if ( ! $maps ) { $recommendations['status_gmap'] = [ 'value' => '0', 'message' => __( 'You are not using any Google Map element or template. This option can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_gmap'] = [ 'value' => '1', 'message' => __( 'You are using Google Map element or template. Should be enabled.', 'Avada' ), 'dynamic' => true, ]; } // TODO: make somewhat dynamic. button_presets. $recommendations['button_presets'] = [ 'value' => '0', 'message' => __( 'Recommend disabling unless you are using the button color presets in many areas.', 'Avada' ), 'dynamic' => true, ]; // TODO: make somewhat dynamic. load_block_styles. $recommendations['load_block_styles'] = [ 'value' => 'off', 'message' => __( 'Recommend setting to off unless you use the Gutenberg editor.', 'Avada' ), 'dynamic' => false, ]; // TODO: make somewhat dynamic. emojis_disabled. $recommendations['emojis_disabled'] = [ 'value' => 'disabled', 'message' => __( 'Recommend setting to disabled unless you specifically want them for comments.', 'Avada' ), 'dynamic' => false, ]; // avada_rev_styles. if ( ! class_exists( 'RevSliderFront' ) ) { $recommendations['avada_rev_styles'] = [ 'value' => '0', 'message' => __( 'The Slider Revolution plugin is not active, styles can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['avada_rev_styles'] = [ 'value' => '1', 'message' => __( 'The Slider Revolution plugin is currently active, only disable if you don\'t want the extra Avada styling.', 'Avada' ), 'dynamic' => true, ]; } // status_eslider. $elastic_sliders = new WP_Query( [ 'post_type' => 'themefusion_elastic' ] ); if ( ! $elastic_sliders->have_posts() ) { $recommendations['status_eslider'] = [ 'value' => '0', 'message' => __( 'No elastic sliders found, should be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_eslider'] = [ 'value' => '1', 'message' => __( 'Elastic sliders found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } // status_fusion_slider. $avada_sliders = new WP_Query( [ 'post_type' => 'slide' ] ); if ( ! $avada_sliders->have_posts() ) { $recommendations['status_fusion_slider'] = [ 'value' => '0', 'message' => __( 'No Avada sliders found, should be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_fusion_slider'] = [ 'value' => '1', 'message' => __( 'Avada sliders found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } // status_fusion_forms. $avada_forms = new WP_Query( [ 'post_type' => 'fusion_form' ] ); if ( ! $avada_forms->have_posts() ) { $recommendations['status_fusion_forms'] = [ 'value' => '0', 'message' => __( 'No Avada forms found, can be disabled. Alternatively if you haven\'t tried them yet, give them a go.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_fusion_forms'] = [ 'value' => '1', 'message' => __( 'Avada forms found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } // status_awb_Off_Canvas. $avada_off_canvas = new WP_Query( [ 'post_type' => 'awb_off_canvas' ] ); if ( ! $avada_off_canvas->have_posts() ) { $recommendations['status_awb_Off_Canvas'] = [ 'value' => '0', 'message' => __( 'No Avada off canvas found, can be disabled. Alternatively if you haven\'t tried them yet, give them a go.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_awb_Off_Canvas'] = [ 'value' => '1', 'message' => __( 'Avada off canvas found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } // status_fusion_portfolio. $avada_portfolios = new WP_Query( [ 'post_type' => 'avada_portfolio' ] ); if ( ! $avada_portfolios->have_posts() ) { $recommendations['status_fusion_portfolio'] = [ 'value' => '0', 'message' => __( 'No portfolio posts found, can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_fusion_portfolio'] = [ 'value' => '1', 'message' => __( 'Portfolio posts found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } // status_fusion_faqs. $avada_faqs = new WP_Query( [ 'post_type' => 'avada_faq' ] ); if ( ! $avada_faqs->have_posts() ) { $recommendations['status_fusion_faqs'] = [ 'value' => '0', 'message' => __( 'No FAQ posts found, can be disabled.', 'Avada' ), 'dynamic' => true, ]; } else { $recommendations['status_fusion_faqs'] = [ 'value' => '1', 'message' => __( 'FAQ posts found, only disable if you are not using them.', 'Avada' ), 'dynamic' => true, ]; } wp_send_json_success( $recommendations ); } /** * AJAX callback method, used to get used icons table. * * @access public */ public function icon_scan() { $found_icons = $this->scan_for_icons(); $full_icons = []; $fa_4_class = ' class="awb-fa-legacy-icon"'; ob_start(); foreach ( $found_icons as $found_icon ) : ?> <tr> <td> <?php $edit_link = ''; $edit_title = ''; if ( isset( $found_icon['data']['post_type'] ) ) { $edit_title = $found_icon['data']['post_title']; if ( 'nav_menu_item' !== $found_icon['data']['post_type'] ) { $edit_link = admin_url( 'post.php?post=' . $found_icon['data']['post_id'] . '&action=edit' ); } elseif ( 'nav_menu_item' === $found_icon['data']['post_type'] ) { $nav_terms = wp_get_object_terms( $found_icon['data']['post_id'], 'nav_menu' ); if ( ! is_wp_error( $nav_terms ) && isset( $nav_terms[0] ) ) { $edit_link = admin_url( 'nav-menus.php?action=edit&menu=' . $nav_terms[0]->term_id ); } // Check if menu item points to a page and didnt have post title saved. if ( '' === $edit_title && '' !== get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ) ) { if ( 'post_type' === get_post_meta( $found_icon['data']['post_id'], '_menu_item_type', true ) ) { $edit_title = get_the_title( get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ) ); } if ( 'taxonomy' === get_post_meta( $found_icon['data']['post_id'], '_menu_item_type', true ) ) { $term = get_term( get_post_meta( $found_icon['data']['post_id'], '_menu_item_object_id', true ), get_post_meta( $found_icon['data']['post_id'], '_menu_item_object', true ) ); if ( ! is_wp_error( $term ) ) { $edit_title = $term->name; } } } } } elseif ( isset( $found_icon['widget'] ) ) { $edit_title = $found_icon['widget']['widget_type'] . ' - ' . $found_icon['widget']['widget_area']; $edit_link = admin_url( 'widgets.php' ); } ?> <a href="<?php echo esc_url_raw( $edit_link ); ?>" target="_blank"> <?php echo esc_html( $edit_title ); ?> </a> </td> <td> <?php if ( isset( $found_icon['post_content']['icons']['matches'] ) ) { $full_icons = array_merge( $full_icons, $found_icon['post_content']['icons']['matches'] ); foreach ( array_unique( $found_icon['post_content']['icons']['matches'] ) as $key => $icon ) { $css_class = ''; if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) { $css_class = $fa_4_class; } echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput } } elseif ( isset( $found_icon['widget']['icons']['matches'] ) ) { $full_icons = array_merge( $full_icons, $found_icon['widget']['icons']['matches'] ); foreach ( array_unique( $found_icon['widget']['icons']['matches'] ) as $key => $icon ) { $css_class = ''; if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) { $css_class = $fa_4_class; } echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput } } ?> </td> <td> <?php if ( isset( $found_icon['post_meta']['icons']['matches'] ) ) { $full_icons = array_merge( $full_icons, $found_icon['post_meta']['icons']['matches'] ); foreach ( array_unique( $found_icon['post_meta']['icons']['matches'] ) as $key => $icon ) { $css_class = ''; if ( isset( $this->icon_map[ $icon ] ) && true === $this->icon_map[ $icon ]['is_fa4_icon'] ) { $css_class = $fa_4_class; } echo '<span' . $css_class . '>' . esc_html( $icon ) . '</span>'; // phpcs:ignore WordPress.Security.EscapeOutput } } ?> </td> <td></td> </tr> <?php endforeach; $full_icon_markup = ''; foreach ( array_unique( $full_icons ) as $icon ) { $data_download = ''; if ( isset( $this->icon_map[ $icon ] ) ) { $icon_link_subset = isset( $this->icon_subsets[ $this->icon_map[ $icon ]['fa5_subset'] ] ) ? $this->icon_subsets[ $this->icon_map[ $icon ]['fa5_subset'] ] : 'solid'; $icon_name = $this->icon_map[ $icon ]['fa5_name']; $icon_download_link = esc_url_raw( admin_url( 'admin-ajax.php?action=awb_trigger_icon_download&icon_subset=' . $icon_link_subset . '&icon_name=' . $icon_name . '&awb_performance_nonce=' . wp_create_nonce( 'awb_performance_nonce' ) ) ); $data_download = ' href="' . $icon_download_link . '" target="_blank"'; } $full_icon_markup .= '<a' . $data_download . ' class="awb-download-icon-link">' . esc_html( $icon ) . '</a>'; } if ( '' !== $full_icon_markup ) { echo '<tr class="full-list"><td><strong>' . __( 'Full List', 'Avada' ) . '<strong></td><td colspan="3">' . $full_icon_markup . '</td></tr>'; // phpcs:ignore WordPress.Security.EscapeOutput } $return_data = [ 'markup' => ob_get_clean(), 'recommendations' => [], ]; $used_subsets = []; foreach ( [ 'fab', 'far', 'fas', 'fal' ] as $subset ) { if ( false !== strpos( $full_icon_markup, ' ' . $subset ) || false !== strpos( $full_icon_markup, $subset . ' ' ) ) { $used_subsets[] = $subset; } } $labels = [ 'fab' => esc_html__( 'Brands', 'Avada' ), 'far' => esc_html__( 'Regular', 'Avada' ), 'fas' => esc_html__( 'Solid', 'Avada' ), 'fal' => esc_html__( 'Light', 'Avada' ), ]; $icon_message = __( 'No Font Awesome icons found being used. Recommend disabling all.', 'Avada' ); if ( ! empty( $used_subsets ) ) { foreach ( $used_subsets as $used_subset ) { $used_subset_labels[] = $labels[ $used_subset ]; } /* translators: Used subset labels. */ $icon_message = sprintf( __( 'Content has been scanned for icons, recommend selecting %s.', 'Avada' ), implode( ', ', $used_subset_labels ) ); } $return_data['recommendations']['status_fontawesome'] = [ 'value' => $used_subsets, 'message' => $icon_message, 'dynamic' => true, ]; // TODO: scan for old icons. $return_data['recommendations']['fontawesome_v4_compatibility'] = [ 'value' => '0', 'message' => __( 'Recommended to disable this and update any old icon references by editing the pages/menus.', 'Avada' ), 'dynamic' => true, ]; wp_send_json_success( $return_data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } /** * Check all elements on content. * * @access public * @since 7.4 * @return void */ public function element_scan() { global $all_fusion_builder_elements; $elements = []; // No elements found, return empty. if ( empty( $all_fusion_builder_elements ) ) { wp_send_json_success( $elements ); die(); } $content = $this->get_content(); foreach ( $all_fusion_builder_elements as $module ) { if ( empty( $module['hide_from_builder'] ) ) { if ( false === strpos( $content, $module['shortcode'] ) ) { $elements[ $module['shortcode'] ] = true; } } } // Add some more checks here at some point. unset( $elements['fusion_alert'] ); unset( $elements['fusion_tooltip'] ); unset( $elements['fusion_separator'] ); $dependencies = [ 'fusion_post_cards' => [ 'fusion_tb_post_card_archives', ], 'fusion_woo_product_grid' => [ 'fusion_tb_woo_archives', ], 'fusion_blog' => [ 'fusion_tb_archives', ], 'fusion_button' => [ 'fusion_tagline', 'fusion_form_submit', ], 'fusion_accordion' => [ 'fusion_faq', ], 'fusion_popover' => [ 'fusion_image_hotspots', ], 'fusion_images' => [ 'fusion_tb_woo_related', 'fusion_tb_related', ], ]; foreach ( $dependencies as $needed => $needs ) { // If a needed element is being set to be disabled, check if that is safe. if ( isset( $elements[ $needed ] ) ) { foreach ( $needs as $need ) { // If the element is not disabled, then dont disable the needed one. if ( ! isset( $elements[ $need ] ) ) { unset( $elements[ $needed ] ); } } } } wp_send_json_success( $elements ); } /** * Scans content for Google Map usage. * * @access public * @since 7.4 * @return boolean */ public function scan_for_google_map() { $maps_count = 0; // Scan XML content (posts). $this->parse_xml(); foreach ( $this->posts as $post ) { if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) { continue; } // Get only stuff we actually use. $post_data = [ 'post_id' => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '', 'post_type' => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '', ]; if ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] && false !== strpos( $post['data']['post_content'], 'fusion_map' ) ) { $maps_count++; // No need to check further. break; } if ( isset( $post['data']['post_type'] ) && isset( $post['data']['post_id'] ) && 'page' === $post['data']['post_type'] && 0 === $maps_count ) { $meta = get_post_meta( $post['data']['post_id'], '_wp_page_template', true ); if ( 'contact.php' === $meta ) { $maps_count++; // No need to check further. break; } } } // Scan widgets if not found so far. if ( 0 === $maps_count ) { $all_widgets = wp_get_sidebars_widgets(); $widgets = []; foreach ( $all_widgets as $widget_area => $widget_array ) { foreach ( $widget_array as $widget_key ) { $widget = []; $widget['type'] = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) ); $widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) ); $widget['value'] = get_option( 'widget_' . $widget['type'] ); $widget['value'] = $widget['value'][ $widget['type-index'] ]; $widgets[] = $widget; if ( false !== strpos( maybe_serialize( $widget['value'] ), 'fusion_map' ) ) { $maps_count++; // No need to check further. break; } } } } return 0 < $maps_count ? true : false; } /** * Scan content for Youtube usage. * * @access public * @since 7.4 * @param string $type The video type. * @return boolean */ public function scan_for_videos( $type ) { $regex_pattern_container = get_shortcode_regex( [ 'fusion_builder_container' ] ); $count = 0; // Scan XML content (posts). $this->parse_xml(); foreach ( $this->posts as $post ) { if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) { continue; } // Get only stuff we actually use. $post_data = [ 'post_id' => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '', 'post_type' => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '', ]; if ( ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] ) || 'slide' === $post['data']['post_type'] ) { preg_match_all( "/$regex_pattern_container/s", $post['data']['post_content'], $matches ); if ( isset( $matches[3] ) && ! empty( $matches[3] ) ) { foreach ( $matches[3] as $match ) { $atts = shortcode_parse_atts( $match ); if ( ! empty( $atts['video_url'] ) ) { $video = fusion_builder_get_video_provider( $atts['video_url'] ); if ( $type === $video['type'] ) { $count++; // No need to check further. break 2; } } } } if ( 0 === $count ) { if ( false !== strpos( $post['data']['post_content'], 'fusion_' . $type ) ) { $count++; // No need to check further. break; } } // Scan Fusion Slides. if ( 0 === $count && 'slide' === $post_data['post_type'] ) { $metadata = wp_parse_args( fusion_data()->post_meta( $post_data['post_id'] )->get_all_meta() ); if ( $type === $metadata['type'] && '' !== $metadata[ $type . '_id' ] ) { $count++; // No need to check further. break; } } } } // Scan widgets if not found so far. if ( 0 === $count ) { $all_widgets = wp_get_sidebars_widgets(); $widgets = []; foreach ( $all_widgets as $widget_area => $widget_array ) { foreach ( $widget_array as $widget_key ) { $widget = []; $widget['type'] = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) ); $widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) ); $widget['value'] = get_option( 'widget_' . $widget['type'] ); $widget['value'] = $widget['value'][ $widget['type-index'] ]; $widgets[] = $widget; preg_match_all( "/$regex_pattern_container/s", maybe_serialize( $widget['value'] ), $matches ); if ( isset( $matches[3] ) && ! empty( $matches[3] ) ) { foreach ( $matches[3] as $match ) { $atts = shortcode_parse_atts( $match ); if ( ! empty( $atts['video_url'] ) ) { $video = fusion_builder_get_video_provider( $atts['video_url'] ); if ( $type === $video['type'] ) { $count++; // No need to check further. break 2; } } } } if ( 0 === $count ) { if ( false !== strpos( maybe_serialize( $widget['value'] ), 'fusion_' . $type ) ) { $count++; // No need to check further. break; } } } } } return 0 < $count ? true : false; } /** * Scan content for mega menu usage. * * @access public * @since 7.4 * @return boolean */ public function scan_for_megamenu() { $mega_menu_count = 0; // Scan XML content (posts). $this->parse_xml(); foreach ( $this->posts as $post ) { if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) { continue; } // Menu items have empty post_content. if ( 'nav_menu_item' === $post['data']['post_type'] && isset( $post['meta'] ) && is_array( $post['meta'] ) ) { foreach ( $post['meta'] as $meta ) { if ( '_menu_item_fusion_megamenu' === $meta['key'] ) { $values = maybe_unserialize( $meta['value'] ); if ( 'enabled' === $values['status'] ) { $mega_menu_count++; break 2; } } } } } return 0 < $mega_menu_count ? true : false; } /** * Method used to scan site content (posts for now) for used FA icons. */ public function scan_for_icons() { // Search for icons in following formats: "fa-gem fas", "far fa-gem". // Or (missing icon subset): "fa-gem". $regex_pattern = '/(fa[srbl]?)?\s?(fa-.[^\s"\']*)\s?(fa[srbl]?)?/'; $found_icons = []; // Scan XML content (posts). $this->parse_xml(); foreach ( $this->posts as $post ) { if ( 'publish' !== $post['data']['post_status'] && 'draft' !== $post['data']['post_status'] ) { continue; } // Get only stuff we actually use. $post_data = [ 'post_id' => isset( $post['data']['post_id'] ) ? $post['data']['post_id'] : '', 'post_title' => isset( $post['data']['post_title'] ) ? $post['data']['post_title'] : '', 'post_type' => isset( $post['data']['post_type'] ) ? $post['data']['post_type'] : '', ]; if ( isset( $post['data']['post_content'] ) && '' !== $post['data']['post_content'] ) { preg_match_all( $regex_pattern, $post['data']['post_content'], $matches ); /** * $matches[0] - full match * $matches[1] - subset, if it was before the icon code * $matches[2] - icon code * $matches[3] - subset, if it was after the icon code */ if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) { $this->update_icon_map_array( $matches ); $found_icons[] = [ 'post_content' => [ 'icons' => [ 'matches' => $matches[0], 'icon_code' => $matches[2], ], ], 'data' => $post_data, ]; } } // Menu items have empty post_content. if ( 'nav_menu_item' === $post['data']['post_type'] && isset( $post['meta'] ) && is_array( $post['meta'] ) ) { foreach ( $post['meta'] as $meta ) { if ( '_menu_item_fusion_megamenu' === $meta['key'] ) { preg_match_all( $regex_pattern, $meta['value'], $matches ); if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) { $this->update_icon_map_array( $matches ); $found_icons[] = [ 'post_meta' => [ 'meta_key' => $meta['key'], // phpcs:ignore WordPress.DB.SlowDBQuery 'icons' => [ 'matches' => $matches[0], 'icon_code' => $matches[1], ], ], 'data' => $post_data, ]; } } } } } // Scan widgets. $all_widgets = wp_get_sidebars_widgets(); $widgets = []; foreach ( $all_widgets as $widget_area => $widget_array ) { foreach ( $widget_array as $widget_key ) { $widget = []; $widget['type'] = trim( substr( $widget_key, 0, strrpos( $widget_key, '-' ) ) ); $widget['type-index'] = trim( substr( $widget_key, strrpos( $widget_key, '-' ) + 1 ) ); $widget['value'] = get_option( 'widget_' . $widget['type'] ); $widget['value'] = $widget['value'][ $widget['type-index'] ]; $widgets[] = $widget; preg_match_all( $regex_pattern, maybe_serialize( $widget['value'] ), $matches ); if ( isset( $matches[0] ) && ! empty( $matches[0] ) ) { $this->update_icon_map_array( $matches ); $found_icons[] = [ 'widget' => [ 'widget_type' => $widget['type'], 'widget_area' => $widget_area, 'icons' => [ 'matches' => $matches[0], 'icon_code' => $matches[1], ], ], 'data' => $widget, ]; } } } return $found_icons; } /** * Update icon map array. * * @access public * @param array $matches The matches array. * @return void */ protected function update_icon_map_array( $matches ) { $shims = $this->get_icon_shims(); if ( isset( $matches[0] ) && is_array( $matches[0] ) ) { $count = count( $matches[1] ); for ( $i = 0; $i < $count; $i++ ) { // Skip if we have already processed this icon (match). if ( isset( $this->icon_map[ $matches[0][ $i ] ] ) ) { continue; } $icon_code = $matches[2][ $i ]; $icon_subset = ''; $is_fa4_icon = false; // Set icon subsets. if ( isset( $matches[1][ $i ] ) && ! empty( $matches[1][ $i ] ) ) { $icon_subset = $matches[1][ $i ]; } elseif ( isset( $matches[3][ $i ] ) && ! empty( $matches[3][ $i ] ) ) { $icon_subset = $matches[3][ $i ]; } // It might be, we need to check if icon name or subset was changed. if ( isset( $shims[ $icon_code ] ) && ( '' === $icon_subset || 'fa' === $icon_subset ) ) { // Icon name changed. if ( null !== $shims[ $icon_code ][2] && 'fa-' . $shims[ $icon_code ][2] !== $icon_code ) { $is_fa4_icon = true; } // Icon subset changed. if ( null !== $shims[ $icon_code ][1] && $icon_subset !== $shims[ $icon_code ][1] ) { $is_fa4_icon = true; } } // Set defaulf subset if it is still empty. if ( '' === $icon_subset ) { $icon_subset = 'fas'; } // Finally update map array. if ( true === $is_fa4_icon ) { $this->icon_map[ $matches[0][ $i ] ] = [ 'is_fa4_icon' => $is_fa4_icon, 'fa5_name' => isset( $shims[ $icon_code ][2] ) ? $shims[ $icon_code ][2] : null, 'fa5_subset' => isset( $shims[ $icon_code ][1] ) ? $shims[ $icon_code ][1] : 'fas', ]; } else { $this->icon_map[ $matches[0][ $i ] ] = [ 'is_fa4_icon' => $is_fa4_icon, 'fa5_name' => substr( $icon_code, 3 ), 'fa5_subset' => $icon_subset, ]; } } } } /** * Get site XML contents. */ public function get_content() { if ( ! function_exists( 'export_wp' ) ) { include ABSPATH . '/wp-admin/includes/export.php'; } // Mark non builder post types as not exportable. global $wp_post_types; if ( ! empty( $wp_post_types ) && class_exists( 'FusionBuilder' ) ) { foreach ( $wp_post_types as $key => $post_type ) { if ( ! in_array( $key, FusionBuilder::allowed_post_types(), true ) ) { $wp_post_types[ $key ]->can_export = false; } } } // Skip things we don't need. add_filter( 'wxr_export_skip_commentmeta', '__return_true' ); add_filter( 'wxr_export_skip_termmeta', '__return_true' ); ob_start(); export_wp(); // Prevent starting file download. header_remove( 'Content-Description' ); header_remove( 'Content-Disposition' ); header_remove( 'Content-Type' ); return ob_get_clean(); } /** * Parsing site's XML content. */ public function parse_xml() { // Early exit if already parsed. if ( is_array( $this->posts ) && 0 < count( $this->posts ) ) { return; } $xml_string = $this->get_content(); $reader = new XMLReader(); $reader->xml( $xml_string ); while ( $reader->read() ) { if ( XMLReader::ELEMENT !== $reader->nodeType ) { continue; } switch ( $reader->name ) { case 'item': $node = $reader->expand(); $parsed = $this->parse_post_node( $node ); if ( is_wp_error( $parsed ) ) { // Skip the rest of this post. $reader->next(); break; } $this->posts[] = $parsed; // Handled everything in this node, move on to the next. $reader->next(); break; } } } /** * Parse a post node into post data. * * @param DOMElement $node Parent node of post data (typically `item`). * @return array|WP_Error Post data array on success, error otherwise. */ protected function parse_post_node( $node ) { $data = []; $meta = []; $comments = []; $terms = []; foreach ( $node->childNodes as $child ) { // We only care about child elements. if ( XML_ELEMENT_NODE !== $child->nodeType ) { continue; } switch ( $child->tagName ) { case 'wp:post_type': $data['post_type'] = $child->textContent; break; case 'title': $data['post_title'] = $child->textContent; break; case 'guid': $data['guid'] = $child->textContent; break; case 'dc:creator': $data['post_author'] = $child->textContent; break; case 'content:encoded': $data['post_content'] = $child->textContent; break; case 'excerpt:encoded': $data['post_excerpt'] = $child->textContent; break; case 'wp:post_id': $data['post_id'] = $child->textContent; break; case 'wp:post_date': $data['post_date'] = $child->textContent; break; case 'wp:post_date_gmt': $data['post_date_gmt'] = $child->textContent; break; case 'wp:comment_status': $data['comment_status'] = $child->textContent; break; case 'wp:ping_status': $data['ping_status'] = $child->textContent; break; case 'wp:post_name': $data['post_name'] = $child->textContent; break; case 'wp:status': $data['post_status'] = $child->textContent; if ( 'auto-draft' === $data['post_status'] ) { // Bail now. return new WP_Error( 'wxr_importer.post.cannot_import_draft', __( 'Cannot import auto-draft posts', 'Avada' ), $data ); } break; case 'wp:post_parent': $data['post_parent'] = $child->textContent; break; case 'wp:menu_order': $data['menu_order'] = $child->textContent; break; case 'wp:post_password': $data['post_password'] = $child->textContent; break; case 'wp:is_sticky': $data['is_sticky'] = $child->textContent; break; case 'wp:attachment_url': $data['attachment_url'] = $child->textContent; break; case 'wp:postmeta': $meta_item = $this->parse_meta_node( $child ); if ( ! empty( $meta_item ) ) { $meta[] = $meta_item; } break; } } return compact( 'data', 'meta' ); } /** * Parse a meta node into meta data. * * @param DOMElement $node Parent node of meta data (typically `wp:postmeta` or `wp:commentmeta`). * @return array|null Meta data array on success, or null on error. */ protected function parse_meta_node( $node ) { foreach ( $node->childNodes as $child ) { // We only care about child elements. if ( XML_ELEMENT_NODE !== $child->nodeType ) { continue; } switch ( $child->tagName ) { case 'wp:meta_key': $key = $child->textContent; break; case 'wp:meta_value': $value = $child->textContent; break; } } if ( empty( $key ) || empty( $value ) ) { return null; } return compact( 'key', 'value' ); } /** * Render header specifically for wizard. * * @param string $screen_classes Classes for page. * @return void */ public function render_header( $screen_classes ) { ?> <div class="<?php echo esc_html( $screen_classes ); ?>"> <header class="avada-db-header-main"> <div class="avada-db-header-main-container"> <a class="avada-db-logo" href="<?php echo esc_url( admin_url( 'admin.php?page=avada' ) ); ?>" aria-label="<?php esc_attr_e( 'Link to Avada dashboard', 'Avada' ); ?>"> <i class="avada-db-logo-icon fusiona-avada-logo"></i> <div class="heading"><?php esc_html_e( 'Performance Wizard', 'Avada' ); ?></div> </a> <div class="wizard-hero-header"> <a class="button button-primary" target="_blank" href="https://developers.google.com/speed/pagespeed/insights/?url=<?php echo rawurlencode( trailingslashit( get_home_url() ) ); ?>"><?php esc_html_e( 'Run PageSpeed Insights', 'Avada' ); ?></a> </div> </div> </header> <header class="avada-db-header-sticky avada-db-card awb-wizard-steps"> <ol> <li class="awb-wizard-link active" data-id="1"><span class="awb-wizard-link-text"><?php esc_html_e( 'Start', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="2"><span class="awb-wizard-link-text"><?php esc_html_e( 'Features', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="3"><span class="awb-wizard-link-text"><?php esc_html_e( 'Icons', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="4"><span class="awb-wizard-link-text"><?php esc_html_e( 'Fonts', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="5"><span class="awb-wizard-link-text"><?php esc_html_e( 'Elements', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="6"><span class="awb-wizard-link-text"><?php esc_html_e( 'Optimization', 'Avada' ); ?></span></li> <li class="awb-wizard-link" data-id="7"><span class="awb-wizard-link-text"><?php esc_html_e( 'Finish', 'Avada' ); ?></span></li> </ol> </header> <div class="avada-db-demos-notices"><h1></h1> <?php do_action( 'avada_dashboard_notices' ); ?></div> <?php } /** * Get FA 4 icon shims. * * @return array */ public function get_icon_shims() { return [ 'fa-glass' => [ 'glass', null, 'glass-martini' ], 'fa-meetup' => [ 'meetup', 'fab', null ], 'fa-star-o' => [ 'star-o', 'far', 'star' ], 'fa-remove' => [ 'remove', null, 'times' ], 'fa-close' => [ 'close', null, 'times' ], 'fa-gear' => [ 'gear', null, 'cog' ], 'fa-trash-o' => [ 'trash-o', 'far', 'trash-alt' ], 'fa-file-o' => [ 'file-o', 'far', 'file' ], 'fa-clock-o' => [ 'clock-o', 'far', 'clock' ], 'fa-arrow-circle-o-down' => [ 'arrow-circle-o-down', 'far', 'arrow-alt-circle-down' ], 'fa-arrow-circle-o-up' => [ 'arrow-circle-o-up', 'far', 'arrow-alt-circle-up' ], 'fa-play-circle-o' => [ 'play-circle-o', 'far', 'play-circle' ], 'fa-repeat' => [ 'repeat', null, 'redo' ], 'fa-rotate-right' => [ 'rotate-right', null, 'redo' ], 'fa-refresh' => [ 'refresh', null, 'sync' ], 'fa-list-alt' => [ 'list-alt', 'far', null ], 'fa-dedent' => [ 'dedent', null, 'outdent' ], 'fa-video-camera' => [ 'video-camera', null, 'video' ], 'fa-picture-o' => [ 'picture-o', 'far', 'image' ], 'fa-photo' => [ 'photo', 'far', 'image' ], 'fa-image' => [ 'image', 'far', 'image' ], 'fa-pencil' => [ 'pencil', null, 'pencil-alt' ], 'fa-map-marker' => [ 'map-marker', null, 'map-marker-alt' ], 'fa-pencil-square-o' => [ 'pencil-square-o', 'far', 'edit' ], 'fa-share-square-o' => [ 'share-square-o', 'far', 'share-square' ], 'fa-check-square-o' => [ 'check-square-o', 'far', 'check-square' ], 'fa-arrows' => [ 'arrows', null, 'arrows-alt' ], 'fa-times-circle-o' => [ 'times-circle-o', 'far', 'times-circle' ], 'fa-check-circle-o' => [ 'check-circle-o', 'far', 'check-circle' ], 'fa-mail-forward' => [ 'mail-forward', null, 'share' ], 'fa-expand' => [ 'expand', null, 'expand-alt' ], 'fa-compress' => [ 'compress', null, 'compress-alt' ], 'fa-eye' => [ 'eye', 'far', null ], 'fa-eye-slash' => [ 'eye-slash', 'far', null ], 'fa-warning' => [ 'warning', null, 'exclamation-triangle' ], 'fa-calendar' => [ 'calendar', null, 'calendar-alt' ], 'fa-arrows-v' => [ 'arrows-v', null, 'arrows-alt-v' ], 'fa-arrows-h' => [ 'arrows-h', null, 'arrows-alt-h' ], 'fa-bar-chart' => [ 'bar-chart', 'far', 'chart-bar' ], 'fa-bar-chart-o' => [ 'bar-chart-o', 'far', 'chart-bar' ], 'fa-twitter-square' => [ 'twitter-square', 'fab', null ], 'fa-facebook-square' => [ 'facebook-square', 'fab', null ], 'fa-gears' => [ 'gears', null, 'cogs' ], 'fa-thumbs-o-up' => [ 'thumbs-o-up', 'far', 'thumbs-up' ], 'fa-thumbs-o-down' => [ 'thumbs-o-down', 'far', 'thumbs-down' ], 'fa-heart-o' => [ 'heart-o', 'far', 'heart' ], 'fa-sign-out' => [ 'sign-out', null, 'sign-out-alt' ], 'fa-linkedin-square' => [ 'linkedin-square', 'fab', 'linkedin' ], 'fa-thumb-tack' => [ 'thumb-tack', null, 'thumbtack' ], 'fa-external-link' => [ 'external-link', null, 'external-link-alt' ], 'fa-sign-in' => [ 'sign-in', null, 'sign-in-alt' ], 'fa-github-square' => [ 'github-square', 'fab', null ], 'fa-lemon-o' => [ 'lemon-o', 'far', 'lemon' ], 'fa-square-o' => [ 'square-o', 'far', 'square' ], 'fa-bookmark-o' => [ 'bookmark-o', 'far', 'bookmark' ], 'fa-twitter' => [ 'twitter', 'fab', null ], 'fa-facebook' => [ 'facebook', 'fab', 'facebook-f' ], 'fa-facebook-f' => [ 'facebook-f', 'fab', 'facebook-f' ], 'fa-github' => [ 'github', 'fab', null ], 'fa-credit-card' => [ 'credit-card', 'far', null ], 'fa-feed' => [ 'feed', null, 'rss' ], 'fa-hdd-o' => [ 'hdd-o', 'far', 'hdd' ], 'fa-hand-o-right' => [ 'hand-o-right', 'far', 'hand-point-right' ], 'fa-hand-o-left' => [ 'hand-o-left', 'far', 'hand-point-left' ], 'fa-hand-o-up' => [ 'hand-o-up', 'far', 'hand-point-up' ], 'fa-hand-o-down' => [ 'hand-o-down', 'far', 'hand-point-down' ], 'fa-arrows-alt' => [ 'arrows-alt', null, 'expand-arrows-alt' ], 'fa-group' => [ 'group', null, 'users' ], 'fa-chain' => [ 'chain', null, 'link' ], 'fa-scissors' => [ 'scissors', null, 'cut' ], 'fa-files-o' => [ 'files-o', 'far', 'copy' ], 'fa-floppy-o' => [ 'floppy-o', 'far', 'save' ], 'fa-navicon' => [ 'navicon', null, 'bars' ], 'fa-reorder' => [ 'reorder', null, 'bars' ], 'fa-pinterest' => [ 'pinterest', 'fab', null ], 'fa-pinterest-square' => [ 'pinterest-square', 'fab', null ], 'fa-google-plus-square' => [ 'google-plus-square', 'fab', null ], 'fa-google-plus' => [ 'google-plus', 'fab', 'google-plus-g' ], 'fa-money' => [ 'money', 'far', 'money-bill-alt' ], 'fa-unsorted' => [ 'unsorted', null, 'sort' ], 'fa-sort-desc' => [ 'sort-desc', null, 'sort-down' ], 'fa-sort-asc' => [ 'sort-asc', null, 'sort-up' ], 'fa-linkedin' => [ 'linkedin', 'fab', 'linkedin-in' ], 'fa-rotate-left' => [ 'rotate-left', null, 'undo' ], 'fa-legal' => [ 'legal', null, 'gavel' ], 'fa-tachometer' => [ 'tachometer', null, 'tachometer-alt' ], 'fa-dashboard' => [ 'dashboard', null, 'tachometer-alt' ], 'fa-comment-o' => [ 'comment-o', 'far', 'comment' ], 'fa-comments-o' => [ 'comments-o', 'far', 'comments' ], 'fa-flash' => [ 'flash', null, 'bolt' ], 'fa-clipboard' => [ 'clipboard', 'far', null ], 'fa-paste' => [ 'paste', 'far', 'clipboard' ], 'fa-lightbulb-o' => [ 'lightbulb-o', 'far', 'lightbulb' ], 'fa-exchange' => [ 'exchange', null, 'exchange-alt' ], 'fa-cloud-download' => [ 'cloud-download', null, 'cloud-download-alt' ], 'fa-cloud-upload' => [ 'cloud-upload', null, 'cloud-upload-alt' ], 'fa-bell-o' => [ 'bell-o', 'far', 'bell' ], 'fa-cutlery' => [ 'cutlery', null, 'utensils' ], 'fa-file-text-o' => [ 'file-text-o', 'far', 'file-alt' ], 'fa-building-o' => [ 'building-o', 'far', 'building' ], 'fa-hospital-o' => [ 'hospital-o', 'far', 'hospital' ], 'fa-tablet' => [ 'tablet', null, 'tablet-alt' ], 'fa-mobile' => [ 'mobile', null, 'mobile-alt' ], 'fa-mobile-phone' => [ 'mobile-phone', null, 'mobile-alt' ], 'fa-circle-o' => [ 'circle-o', 'far', 'circle' ], 'fa-mail-reply' => [ 'mail-reply', null, 'reply' ], 'fa-github-alt' => [ 'github-alt', 'fab', null ], 'fa-folder-o' => [ 'folder-o', 'far', 'folder' ], 'fa-folder-open-o' => [ 'folder-open-o', 'far', 'folder-open' ], 'fa-smile-o' => [ 'smile-o', 'far', 'smile' ], 'fa-frown-o' => [ 'frown-o', 'far', 'frown' ], 'fa-meh-o' => [ 'meh-o', 'far', 'meh' ], 'fa-keyboard-o' => [ 'keyboard-o', 'far', 'keyboard' ], 'fa-flag-o' => [ 'flag-o', 'far', 'flag' ], 'fa-mail-reply-all' => [ 'mail-reply-all', null, 'reply-all' ], 'fa-star-half-o' => [ 'star-half-o', 'far', 'star-half' ], 'fa-star-half-empty' => [ 'star-half-empty', 'far', 'star-half' ], 'fa-star-half-full' => [ 'star-half-full', 'far', 'star-half' ], 'fa-code-fork' => [ 'code-fork', null, 'code-branch' ], 'fa-chain-broken' => [ 'chain-broken', null, 'unlink' ], 'fa-shield' => [ 'shield', null, 'shield-alt' ], 'fa-calendar-o' => [ 'calendar-o', 'far', 'calendar' ], 'fa-maxcdn' => [ 'maxcdn', 'fab', null ], 'fa-html5' => [ 'html5', 'fab', null ], 'fa-css3' => [ 'css3', 'fab', null ], 'fa-ticket' => [ 'ticket', null, 'ticket-alt' ], 'fa-minus-square-o' => [ 'minus-square-o', 'far', 'minus-square' ], 'fa-level-up' => [ 'level-up', null, 'level-up-alt' ], 'fa-level-down' => [ 'level-down', null, 'level-down-alt' ], 'fa-pencil-square' => [ 'pencil-square', null, 'pen-square' ], 'fa-external-link-square' => [ 'external-link-square', null, 'external-link-square-alt' ], 'fa-compass' => [ 'compass', 'far', null ], 'fa-caret-square-o-down' => [ 'caret-square-o-down', 'far', 'caret-square-down' ], 'fa-toggle-down' => [ 'toggle-down', 'far', 'caret-square-down' ], 'fa-caret-square-o-up' => [ 'caret-square-o-up', 'far', 'caret-square-up' ], 'fa-toggle-up' => [ 'toggle-up', 'far', 'caret-square-up' ], 'fa-caret-square-o-right' => [ 'caret-square-o-right', 'far', 'caret-square-right' ], 'fa-toggle-right' => [ 'toggle-right', 'far', 'caret-square-right' ], 'fa-eur' => [ 'eur', null, 'euro-sign' ], 'fa-euro' => [ 'euro', null, 'euro-sign' ], 'fa-gbp' => [ 'gbp', null, 'pound-sign' ], 'fa-usd' => [ 'usd', null, 'dollar-sign' ], 'fa-dollar' => [ 'dollar', null, 'dollar-sign' ], 'fa-inr' => [ 'inr', null, 'rupee-sign' ], 'fa-rupee' => [ 'rupee', null, 'rupee-sign' ], 'fa-jpy' => [ 'jpy', null, 'yen-sign' ], 'fa-cny' => [ 'cny', null, 'yen-sign' ], 'fa-rmb' => [ 'rmb', null, 'yen-sign' ], 'fa-yen' => [ 'yen', null, 'yen-sign' ], 'fa-rub' => [ 'rub', null, 'ruble-sign' ], 'fa-ruble' => [ 'ruble', null, 'ruble-sign' ], 'fa-rouble' => [ 'rouble', null, 'ruble-sign' ], 'fa-krw' => [ 'krw', null, 'won-sign' ], 'fa-won' => [ 'won', null, 'won-sign' ], 'fa-btc' => [ 'btc', 'fab', null ], 'fa-bitcoin' => [ 'bitcoin', 'fab', 'btc' ], 'fa-file-text' => [ 'file-text', null, 'file-alt' ], 'fa-sort-alpha-asc' => [ 'sort-alpha-asc', null, 'sort-alpha-down' ], 'fa-sort-alpha-desc' => [ 'sort-alpha-desc', null, 'sort-alpha-down-alt' ], 'fa-sort-amount-asc' => [ 'sort-amount-asc', null, 'sort-amount-down' ], 'fa-sort-amount-desc' => [ 'sort-amount-desc', null, 'sort-amount-down-alt' ], 'fa-sort-numeric-asc' => [ 'sort-numeric-asc', null, 'sort-numeric-down' ], 'fa-sort-numeric-desc' => [ 'sort-numeric-desc', null, 'sort-numeric-down-alt' ], 'fa-youtube-square' => [ 'youtube-square', 'fab', null ], 'fa-youtube' => [ 'youtube', 'fab', null ], 'fa-xing' => [ 'xing', 'fab', null ], 'fa-xing-square' => [ 'xing-square', 'fab', null ], 'fa-youtube-play' => [ 'youtube-play', 'fab', 'youtube' ], 'fa-dropbox' => [ 'dropbox', 'fab', null ], 'fa-stack-overflow' => [ 'stack-overflow', 'fab', null ], 'fa-instagram' => [ 'instagram', 'fab', null ], 'fa-flickr' => [ 'flickr', 'fab', null ], 'fa-adn' => [ 'adn', 'fab', null ], 'fa-bitbucket' => [ 'bitbucket', 'fab', null ], 'fa-bitbucket-square' => [ 'bitbucket-square', 'fab', 'bitbucket' ], 'fa-tumblr' => [ 'tumblr', 'fab', null ], 'fa-tumblr-square' => [ 'tumblr-square', 'fab', null ], 'fa-long-arrow-down' => [ 'long-arrow-down', null, 'long-arrow-alt-down' ], 'fa-long-arrow-up' => [ 'long-arrow-up', null, 'long-arrow-alt-up' ], 'fa-long-arrow-left' => [ 'long-arrow-left', null, 'long-arrow-alt-left' ], 'fa-long-arrow-right' => [ 'long-arrow-right', null, 'long-arrow-alt-right' ], 'fa-apple' => [ 'apple', 'fab', null ], 'fa-windows' => [ 'windows', 'fab', null ], 'fa-android' => [ 'android', 'fab', null ], 'fa-linux' => [ 'linux', 'fab', null ], 'fa-dribbble' => [ 'dribbble', 'fab', null ], 'fa-skype' => [ 'skype', 'fab', null ], 'fa-foursquare' => [ 'foursquare', 'fab', null ], 'fa-trello' => [ 'trello', 'fab', null ], 'fa-gratipay' => [ 'gratipay', 'fab', null ], 'fa-gittip' => [ 'gittip', 'fab', 'gratipay' ], 'fa-sun-o' => [ 'sun-o', 'far', 'sun' ], 'fa-moon-o' => [ 'moon-o', 'far', 'moon' ], 'fa-vk' => [ 'vk', 'fab', null ], 'fa-weibo' => [ 'weibo', 'fab', null ], 'fa-renren' => [ 'renren', 'fab', null ], 'fa-pagelines' => [ 'pagelines', 'fab', null ], 'fa-stack-exchange' => [ 'stack-exchange', 'fab', null ], 'fa-arrow-circle-o-right' => [ 'arrow-circle-o-right', 'far', 'arrow-alt-circle-right' ], 'fa-arrow-circle-o-left' => [ 'arrow-circle-o-left', 'far', 'arrow-alt-circle-left' ], 'fa-caret-square-o-left' => [ 'caret-square-o-left', 'far', 'caret-square-left' ], 'fa-toggle-left' => [ 'toggle-left', 'far', 'caret-square-left' ], 'fa-dot-circle-o' => [ 'dot-circle-o', 'far', 'dot-circle' ], 'fa-vimeo-square' => [ 'vimeo-square', 'fab', null ], 'fa-try' => [ 'try', null, 'lira-sign' ], 'fa-turkish-lira' => [ 'turkish-lira', null, 'lira-sign' ], 'fa-plus-square-o' => [ 'plus-square-o', 'far', 'plus-square' ], 'fa-slack' => [ 'slack', 'fab', null ], 'fa-wordpress' => [ 'wordpress', 'fab', null ], 'fa-openid' => [ 'openid', 'fab', null ], 'fa-institution' => [ 'institution', null, 'university' ], 'fa-bank' => [ 'bank', null, 'university' ], 'fa-mortar-board' => [ 'mortar-board', null, 'graduation-cap' ], 'fa-yahoo' => [ 'yahoo', 'fab', null ], 'fa-google' => [ 'google', 'fab', null ], 'fa-reddit' => [ 'reddit', 'fab', null ], 'fa-reddit-square' => [ 'reddit-square', 'fab', null ], 'fa-stumbleupon-circle' => [ 'stumbleupon-circle', 'fab', null ], 'fa-stumbleupon' => [ 'stumbleupon', 'fab', null ], 'fa-delicious' => [ 'delicious', 'fab', null ], 'fa-digg' => [ 'digg', 'fab', null ], 'fa-pied-piper-pp' => [ 'pied-piper-pp', 'fab', null ], 'fa-pied-piper-alt' => [ 'pied-piper-alt', 'fab', null ], 'fa-drupal' => [ 'drupal', 'fab', null ], 'fa-joomla' => [ 'joomla', 'fab', null ], 'fa-spoon' => [ 'spoon', null, 'utensil-spoon' ], 'fa-behance' => [ 'behance', 'fab', null ], 'fa-behance-square' => [ 'behance-square', 'fab', null ], 'fa-steam' => [ 'steam', 'fab', null ], 'fa-steam-square' => [ 'steam-square', 'fab', null ], 'fa-automobile' => [ 'automobile', null, 'car' ], 'fa-envelope-o' => [ 'envelope-o', 'far', 'envelope' ], 'fa-spotify' => [ 'spotify', 'fab', null ], 'fa-deviantart' => [ 'deviantart', 'fab', null ], 'fa-soundcloud' => [ 'soundcloud', 'fab', null ], 'fa-file-pdf-o' => [ 'file-pdf-o', 'far', 'file-pdf' ], 'fa-file-word-o' => [ 'file-word-o', 'far', 'file-word' ], 'fa-file-excel-o' => [ 'file-excel-o', 'far', 'file-excel' ], 'fa-file-powerpoint-o' => [ 'file-powerpoint-o', 'far', 'file-powerpoint' ], 'fa-file-image-o' => [ 'file-image-o', 'far', 'file-image' ], 'fa-file-photo-o' => [ 'file-photo-o', 'far', 'file-image' ], 'fa-file-picture-o' => [ 'file-picture-o', 'far', 'file-image' ], 'fa-file-archive-o' => [ 'file-archive-o', 'far', 'file-archive' ], 'fa-file-zip-o' => [ 'file-zip-o', 'far', 'file-archive' ], 'fa-file-audio-o' => [ 'file-audio-o', 'far', 'file-audio' ], 'fa-file-sound-o' => [ 'file-sound-o', 'far', 'file-audio' ], 'fa-file-video-o' => [ 'file-video-o', 'far', 'file-video' ], 'fa-file-movie-o' => [ 'file-movie-o', 'far', 'file-video' ], 'fa-file-code-o' => [ 'file-code-o', 'far', 'file-code' ], 'fa-vine' => [ 'vine', 'fab', null ], 'fa-codepen' => [ 'codepen', 'fab', null ], 'fa-jsfiddle' => [ 'jsfiddle', 'fab', null ], 'fa-life-ring' => [ 'life-ring', 'far', null ], 'fa-life-bouy' => [ 'life-bouy', 'far', 'life-ring' ], 'fa-life-buoy' => [ 'life-buoy', 'far', 'life-ring' ], 'fa-life-saver' => [ 'life-saver', 'far', 'life-ring' ], 'fa-support' => [ 'support', 'far', 'life-ring' ], 'fa-circle-o-notch' => [ 'circle-o-notch', null, 'circle-notch' ], 'fa-rebel' => [ 'rebel', 'fab', null ], 'fa-ra' => [ 'ra', 'fab', 'rebel' ], 'fa-resistance' => [ 'resistance', 'fab', 'rebel' ], 'fa-empire' => [ 'empire', 'fab', null ], 'fa-ge' => [ 'ge', 'fab', 'empire' ], 'fa-git-square' => [ 'git-square', 'fab', null ], 'fa-git' => [ 'git', 'fab', null ], 'fa-hacker-news' => [ 'hacker-news', 'fab', null ], 'fa-y-combinator-square' => [ 'y-combinator-square', 'fab', 'hacker-news' ], 'fa-yc-square' => [ 'yc-square', 'fab', 'hacker-news' ], 'fa-tencent-weibo' => [ 'tencent-weibo', 'fab', null ], 'fa-qq' => [ 'qq', 'fab', null ], 'fa-weixin' => [ 'weixin', 'fab', null ], 'fa-wechat' => [ 'wechat', 'fab', 'weixin' ], 'fa-send' => [ 'send', null, 'paper-plane' ], 'fa-paper-plane-o' => [ 'paper-plane-o', 'far', 'paper-plane' ], 'fa-send-o' => [ 'send-o', 'far', 'paper-plane' ], 'fa-circle-thin' => [ 'circle-thin', 'far', 'circle' ], 'fa-header' => [ 'header', null, 'heading' ], 'fa-sliders' => [ 'sliders', null, 'sliders-h' ], 'fa-futbol-o' => [ 'futbol-o', 'far', 'futbol' ], 'fa-soccer-ball-o' => [ 'soccer-ball-o', 'far', 'futbol' ], 'fa-slideshare' => [ 'slideshare', 'fab', null ], 'fa-twitch' => [ 'twitch', 'fab', null ], 'fa-yelp' => [ 'yelp', 'fab', null ], 'fa-newspaper-o' => [ 'newspaper-o', 'far', 'newspaper' ], 'fa-paypal' => [ 'paypal', 'fab', null ], 'fa-google-wallet' => [ 'google-wallet', 'fab', null ], 'fa-cc-visa' => [ 'cc-visa', 'fab', null ], 'fa-cc-mastercard' => [ 'cc-mastercard', 'fab', null ], 'fa-cc-discover' => [ 'cc-discover', 'fab', null ], 'fa-cc-amex' => [ 'cc-amex', 'fab', null ], 'fa-cc-paypal' => [ 'cc-paypal', 'fab', null ], 'fa-cc-stripe' => [ 'cc-stripe', 'fab', null ], 'fa-bell-slash-o' => [ 'bell-slash-o', 'far', 'bell-slash' ], 'fa-trash' => [ 'trash', null, 'trash-alt' ], 'fa-copyright' => [ 'copyright', 'far', null ], 'fa-eyedropper' => [ 'eyedropper', null, 'eye-dropper' ], 'fa-area-chart' => [ 'area-chart', null, 'chart-area' ], 'fa-pie-chart' => [ 'pie-chart', null, 'chart-pie' ], 'fa-line-chart' => [ 'line-chart', null, 'chart-line' ], 'fa-lastfm' => [ 'lastfm', 'fab', null ], 'fa-lastfm-square' => [ 'lastfm-square', 'fab', null ], 'fa-ioxhost' => [ 'ioxhost', 'fab', null ], 'fa-angellist' => [ 'angellist', 'fab', null ], 'fa-cc' => [ 'cc', 'far', 'closed-captioning' ], 'fa-ils' => [ 'ils', null, 'shekel-sign' ], 'fa-shekel' => [ 'shekel', null, 'shekel-sign' ], 'fa-sheqel' => [ 'sheqel', null, 'shekel-sign' ], 'fa-meanpath' => [ 'meanpath', 'fab', 'font-awesome' ], 'fa-buysellads' => [ 'buysellads', 'fab', null ], 'fa-connectdevelop' => [ 'connectdevelop', 'fab', null ], 'fa-dashcube' => [ 'dashcube', 'fab', null ], 'fa-forumbee' => [ 'forumbee', 'fab', null ], 'fa-leanpub' => [ 'leanpub', 'fab', null ], 'fa-sellsy' => [ 'sellsy', 'fab', null ], 'fa-shirtsinbulk' => [ 'shirtsinbulk', 'fab', null ], 'fa-simplybuilt' => [ 'simplybuilt', 'fab', null ], 'fa-skyatlas' => [ 'skyatlas', 'fab', null ], 'fa-diamond' => [ 'diamond', 'far', 'gem' ], 'fa-intersex' => [ 'intersex', null, 'transgender' ], 'fa-facebook-official' => [ 'facebook-official', 'fab', 'facebook' ], 'fa-pinterest-p' => [ 'pinterest-p', 'fab', null ], 'fa-whatsapp' => [ 'whatsapp', 'fab', null ], 'fa-hotel' => [ 'hotel', null, 'bed' ], 'fa-viacoin' => [ 'viacoin', 'fab', null ], 'fa-medium' => [ 'medium', 'fab', null ], 'fa-y-combinator' => [ 'y-combinator', 'fab', null ], 'fa-yc' => [ 'yc', 'fab', 'y-combinator' ], 'fa-optin-monster' => [ 'optin-monster', 'fab', null ], 'fa-opencart' => [ 'opencart', 'fab', null ], 'fa-expeditedssl' => [ 'expeditedssl', 'fab', null ], 'fa-battery-4' => [ 'battery-4', null, 'battery-full' ], 'fa-battery' => [ 'battery', null, 'battery-full' ], 'fa-battery-3' => [ 'battery-3', null, 'battery-three-quarters' ], 'fa-battery-2' => [ 'battery-2', null, 'battery-half' ], 'fa-battery-1' => [ 'battery-1', null, 'battery-quarter' ], 'fa-battery-0' => [ 'battery-0', null, 'battery-empty' ], 'fa-object-group' => [ 'object-group', 'far', null ], 'fa-object-ungroup' => [ 'object-ungroup', 'far', null ], 'fa-sticky-note-o' => [ 'sticky-note-o', 'far', 'sticky-note' ], 'fa-cc-jcb' => [ 'cc-jcb', 'fab', null ], 'fa-cc-diners-club' => [ 'cc-diners-club', 'fab', null ], 'fa-clone' => [ 'clone', 'far', null ], 'fa-hourglass-o' => [ 'hourglass-o', 'far', 'hourglass' ], 'fa-hourglass-1' => [ 'hourglass-1', null, 'hourglass-start' ], 'fa-hourglass-2' => [ 'hourglass-2', null, 'hourglass-half' ], 'fa-hourglass-3' => [ 'hourglass-3', null, 'hourglass-end' ], 'fa-hand-rock-o' => [ 'hand-rock-o', 'far', 'hand-rock' ], 'fa-hand-grab-o' => [ 'hand-grab-o', 'far', 'hand-rock' ], 'fa-hand-paper-o' => [ 'hand-paper-o', 'far', 'hand-paper' ], 'fa-hand-stop-o' => [ 'hand-stop-o', 'far', 'hand-paper' ], 'fa-hand-scissors-o' => [ 'hand-scissors-o', 'far', 'hand-scissors' ], 'fa-hand-lizard-o' => [ 'hand-lizard-o', 'far', 'hand-lizard' ], 'fa-hand-spock-o' => [ 'hand-spock-o', 'far', 'hand-spock' ], 'fa-hand-pointer-o' => [ 'hand-pointer-o', 'far', 'hand-pointer' ], 'fa-hand-peace-o' => [ 'hand-peace-o', 'far', 'hand-peace' ], 'fa-registered' => [ 'registered', 'far', null ], 'fa-creative-commons' => [ 'creative-commons', 'fab', null ], 'fa-gg' => [ 'gg', 'fab', null ], 'fa-gg-circle' => [ 'gg-circle', 'fab', null ], 'fa-tripadvisor' => [ 'tripadvisor', 'fab', null ], 'fa-odnoklassniki' => [ 'odnoklassniki', 'fab', null ], 'fa-odnoklassniki-square' => [ 'odnoklassniki-square', 'fab', null ], 'fa-get-pocket' => [ 'get-pocket', 'fab', null ], 'fa-wikipedia-w' => [ 'wikipedia-w', 'fab', null ], 'fa-safari' => [ 'safari', 'fab', null ], 'fa-chrome' => [ 'chrome', 'fab', null ], 'fa-firefox' => [ 'firefox', 'fab', null ], 'fa-opera' => [ 'opera', 'fab', null ], 'fa-internet-explorer' => [ 'internet-explorer', 'fab', null ], 'fa-television' => [ 'television', null, 'tv' ], 'fa-contao' => [ 'contao', 'fab', null ], 'fa-500px' => [ '500px', 'fab', null ], 'fa-amazon' => [ 'amazon', 'fab', null ], 'fa-calendar-plus-o' => [ 'calendar-plus-o', 'far', 'calendar-plus' ], 'fa-calendar-minus-o' => [ 'calendar-minus-o', 'far', 'calendar-minus' ], 'fa-calendar-times-o' => [ 'calendar-times-o', 'far', 'calendar-times' ], 'fa-calendar-check-o' => [ 'calendar-check-o', 'far', 'calendar-check' ], 'fa-map-o' => [ 'map-o', 'far', 'map' ], 'fa-commenting' => [ 'commenting', null, 'comment-dots' ], 'fa-commenting-o' => [ 'commenting-o', 'far', 'comment-dots' ], 'fa-houzz' => [ 'houzz', 'fab', null ], 'fa-vimeo' => [ 'vimeo', 'fab', 'vimeo-v' ], 'fa-black-tie' => [ 'black-tie', 'fab', null ], 'fa-fonticons' => [ 'fonticons', 'fab', null ], 'fa-reddit-alien' => [ 'reddit-alien', 'fab', null ], 'fa-edge' => [ 'edge', 'fab', null ], 'fa-credit-card-alt' => [ 'credit-card-alt', null, 'credit-card' ], 'fa-codiepie' => [ 'codiepie', 'fab', null ], 'fa-modx' => [ 'modx', 'fab', null ], 'fa-fort-awesome' => [ 'fort-awesome', 'fab', null ], 'fa-usb' => [ 'usb', 'fab', null ], 'fa-product-hunt' => [ 'product-hunt', 'fab', null ], 'fa-mixcloud' => [ 'mixcloud', 'fab', null ], 'fa-scribd' => [ 'scribd', 'fab', null ], 'fa-pause-circle-o' => [ 'pause-circle-o', 'far', 'pause-circle' ], 'fa-stop-circle-o' => [ 'stop-circle-o', 'far', 'stop-circle' ], 'fa-bluetooth' => [ 'bluetooth', 'fab', null ], 'fa-bluetooth-b' => [ 'bluetooth-b', 'fab', null ], 'fa-gitlab' => [ 'gitlab', 'fab', null ], 'fa-wpbeginner' => [ 'wpbeginner', 'fab', null ], 'fa-wpforms' => [ 'wpforms', 'fab', null ], 'fa-envira' => [ 'envira', 'fab', null ], 'fa-wheelchair-alt' => [ 'wheelchair-alt', 'fab', 'accessible-icon' ], 'fa-question-circle-o' => [ 'question-circle-o', 'far', 'question-circle' ], 'fa-volume-control-phone' => [ 'volume-control-phone', null, 'phone-volume' ], 'fa-asl-interpreting' => [ 'asl-interpreting', null, 'american-sign-language-interpreting' ], 'fa-deafness' => [ 'deafness', null, 'deaf' ], 'fa-hard-of-hearing' => [ 'hard-of-hearing', null, 'deaf' ], 'fa-glide' => [ 'glide', 'fab', null ], 'fa-glide-g' => [ 'glide-g', 'fab', null ], 'fa-signing' => [ 'signing', null, 'sign-language' ], 'fa-viadeo' => [ 'viadeo', 'fab', null ], 'fa-viadeo-square' => [ 'viadeo-square', 'fab', null ], 'fa-snapchat' => [ 'snapchat', 'fab', null ], 'fa-snapchat-ghost' => [ 'snapchat-ghost', 'fab', null ], 'fa-snapchat-square' => [ 'snapchat-square', 'fab', null ], 'fa-pied-piper' => [ 'pied-piper', 'fab', null ], 'fa-first-order' => [ 'first-order', 'fab', null ], 'fa-yoast' => [ 'yoast', 'fab', null ], 'fa-themeisle' => [ 'themeisle', 'fab', null ], 'fa-google-plus-official' => [ 'google-plus-official', 'fab', 'google-plus' ], 'fa-google-plus-circle' => [ 'google-plus-circle', 'fab', 'google-plus' ], 'fa-font-awesome' => [ 'font-awesome', 'fab', null ], 'fa-fa' => [ 'fa', 'fab', 'font-awesome' ], 'fa-handshake-o' => [ 'handshake-o', 'far', 'handshake' ], 'fa-envelope-open-o' => [ 'envelope-open-o', 'far', 'envelope-open' ], 'fa-linode' => [ 'linode', 'fab', null ], 'fa-address-book-o' => [ 'address-book-o', 'far', 'address-book' ], 'fa-vcard' => [ 'vcard', null, 'address-card' ], 'fa-address-card-o' => [ 'address-card-o', 'far', 'address-card' ], 'fa-vcard-o' => [ 'vcard-o', 'far', 'address-card' ], 'fa-user-circle-o' => [ 'user-circle-o', 'far', 'user-circle' ], 'fa-user-o' => [ 'user-o', 'far', 'user' ], 'fa-id-badge' => [ 'id-badge', 'far', null ], 'fa-drivers-license' => [ 'drivers-license', null, 'id-card' ], 'fa-id-card-o' => [ 'id-card-o', 'far', 'id-card' ], 'fa-drivers-license-o' => [ 'drivers-license-o', 'far', 'id-card' ], 'fa-quora' => [ 'quora', 'fab', null ], 'fa-free-code-camp' => [ 'free-code-camp', 'fab', null ], 'fa-telegram' => [ 'telegram', 'fab', null ], 'fa-thermometer-4' => [ 'thermometer-4', null, 'thermometer-full' ], 'fa-thermometer' => [ 'thermometer', null, 'thermometer-full' ], 'fa-thermometer-3' => [ 'thermometer-3', null, 'thermometer-three-quarters' ], 'fa-thermometer-2' => [ 'thermometer-2', null, 'thermometer-half' ], 'fa-thermometer-1' => [ 'thermometer-1', null, 'thermometer-quarter' ], 'fa-thermometer-0' => [ 'thermometer-0', null, 'thermometer-empty' ], 'fa-bathtub' => [ 'bathtub', null, 'bath' ], 'fa-s15' => [ 's15', null, 'bath' ], 'fa-window-maximize' => [ 'window-maximize', 'far', null ], 'fa-window-restore' => [ 'window-restore', 'far', null ], 'fa-times-rectangle' => [ 'times-rectangle', null, 'window-close' ], 'fa-window-close-o' => [ 'window-close-o', 'far', 'window-close' ], 'fa-times-rectangle-o' => [ 'times-rectangle-o', 'far', 'window-close' ], 'fa-bandcamp' => [ 'bandcamp', 'fab', null ], 'fa-grav' => [ 'grav', 'fab', null ], 'fa-etsy' => [ 'etsy', 'fab', null ], 'fa-imdb' => [ 'imdb', 'fab', null ], 'fa-ravelry' => [ 'ravelry', 'fab', null ], 'fa-eercast' => [ 'eercast', 'fab', 'sellcast' ], 'fa-snowflake-o' => [ 'snowflake-o', 'far', 'snowflake' ], 'fa-superpowers' => [ 'superpowers', 'fab', null ], 'fa-wpexplorer' => [ 'wpexplorer', 'fab', null ], 'fa-cab' => [ 'cab', null, 'taxi' ], ]; } } /** * Instantiates the Fusion_Template_Builder class. * Make sure the class is properly set-up. * * @since object 2.2 * @return object Fusion_App */ function AWB_Performance_Wizard() { // phpcs:ignore WordPress.NamingConventions return AWB_Performance_Wizard::get_instance(); } AWB_Performance_Wizard();
Cokiee Shell Web 1.0, Coded By Razor
Neueste Kommentare