json_encode( self::get_data() ), 'timeout' => 30, ) ); } /** * Enable/disable * @since 2.1 */ public static function enable_disable() { if ( isset( $_GET['fl_usage'] ) && wp_verify_nonce( $_GET['_wpnonce'], 'stats_enable' ) ) { update_site_option( 'fl_builder_usage_enabled', $_GET['fl_usage'] ); } } /** * Render admin admin notice * @since 2.1 */ public static function render_notification() { if ( ! self::notification_enabled() ) { return false; } $btn = sprintf( '
%s %s%s
', __( "Sure, I'll help", 'fl-builder' ), __( 'No, Thank You', 'fl-builder' ), wp_nonce_field( 'fl-usage', '_wpnonce', false ) ); $message = sprintf( /* translators: %s: branded builder name */ __( 'Would you like to help us improve %s by sending anonymous usage data?', 'fl-builder' ), FLBuilderModel::get_branding() ); echo '
'; echo '
'; echo '

'; printf( '%s %s', $message, $btn ); echo '

'; printf( '
%s
', FLBuilderUsage::data_demo() ); } /** * Whether to show the stats settings in bb admin. */ public static function show_settings() { // super admin and network settings if ( is_multisite() && is_super_admin() && is_network_admin() ) { return true; } // single site admin if ( ! is_multisite() && is_super_admin() ) { return true; } return false; } /** * Is notification enabled * @since 2.1 * @return bool */ private static function notification_enabled() { global $pagenow; $screen = get_current_screen(); $show = false; if ( 'fl-builder-template' == $screen->post_type ) { $show = true; } if ( 'fl-theme-layout' == $screen->post_type ) { $show = true; } if ( 'options-general.php' == $pagenow && isset( $_GET['page'] ) && 'fl-builder-settings' == $_GET['page'] ) { $show = true; } if ( 'dashboard-network' == $screen->id ) { $show = true; } if ( '0' === get_site_option( 'fl_builder_usage_enabled' ) ) { $show = false; } if ( ! is_super_admin() ) { $show = false; } return ( $show && ! get_site_option( 'fl_builder_usage_enabled' ) ) ? true : false; } /** * Show a user what kind of data we are collecting. * @since 2.1 * @return string */ public static function data_demo() { self::scripts(); $data = self::get_data( true ); $output = ''; $txt = ''; $settings = array( 'server' => array( 'name' => __( 'Server Type', 'fl-builder' ), 'data' => $data['data']['server'], ), 'php' => array( 'name' => __( 'PHP Version', 'fl-builder' ), 'data' => $data['data']['php'], ), 'wp' => array( 'name' => __( 'WP Version', 'fl-builder' ), 'data' => $data['data']['wp'], ), 'mu' => array( 'name' => __( 'WP Multisite', 'fl-builder' ), 'data' => $data['data']['multisite'], ), 'locale' => array( 'name' => __( 'Locale', 'fl-builder' ), 'data' => $data['data']['locale'], ), 'plugins' => array( 'name' => __( 'Plugins Count', 'fl-builder' ), 'data' => $data['data']['plugins'], ), 'modules' => array( 'name' => __( 'Modules Used', 'fl-builder' ), 'data' => __( 'Which modules are used and how many times.', 'fl-builder' ), ), 'settings' => array( 'name' => __( 'Builder Settings', 'fl-builder' ), 'data' => __( 'UI theme, pinned settings etc.', 'fl-builder' ), ), ); foreach ( $settings as $k => $data ) { $txt .= sprintf( '%s: %s
', $data['name'], $data['data'] ); } $output = sprintf( '
%s

%s

%s

', __( 'What kind of info will we collect?', 'fl-builder' ), $txt, __( 'We will never collect any private data such as IP, email addresses or usernames.', 'fl-builder' ) ); return $output; } /** * Gather stats to send * @since 2.1 * @return array */ public static function get_data( $demo = false ) { global $wp_version, $wpdb; if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $data = array( 'modules' => array(), 'license' => array(), 'themer' => array( 'header' => 0, 'footer' => 0, 'part' => 0, '404' => 0, 'singular' => 0, ), 'pinned' => array( 'left' => 0, 'right' => 0, 'unpinned' => 0, ), ); $users = count_users(); $plugins_data = get_plugins(); $data['plugins'] = count( $plugins_data ); $data['plugins_active'] = 0; $data['active_plugins_installed'] = array(); foreach ( (array) $plugins_data as $plugin_slug => $plugin ) { if ( is_plugin_active( $plugin_slug ) ) { $data['active_plugins_installed'][] = array( 'name' => $plugin['Name'], 'version' => $plugin['Version'], 'slug' => $plugin_slug, ); $data['plugins_active'] ++; } } if ( false === $demo ) { /** * Setup an array of post types to query */ $post_types = get_post_types( array( 'public' => true, '_builtin' => true, ) ); if ( isset( $post_types['attachment'] ) ) { unset( $post_types['attachment'] ); } // $post_types['fl-builder-template'] = 'fl-builder-template'; /** * Get a count of all posts/pages that are *not* builder enabled. */ $args = array( 'post_type' => $post_types, 'post_status' => 'publish', 'meta_query' => array( 'key' => '_fl_builder_enabled', 'value' => '1', 'compare' => '!=', ), 'posts_per_page' => -1, ); $query = new WP_Query( $args ); $data['not-enabled'] = count( $query->posts ); /** * Get a count of all posts pages that are using the builder. */ $args = array( 'post_type' => $post_types, 'post_status' => 'publish', 'meta_key' => '_fl_builder_enabled', 'meta_value' => '1', 'posts_per_page' => -1, ); $query = new WP_Query( $args ); $data['enabled'] = count( $query->posts ); /** * Using the array of pages/posts using builder get a list of all used modules */ if ( is_array( $query->posts ) && ! empty( $query->posts ) ) { foreach ( $query->posts as $post ) { $meta = get_post_meta( $post->ID, '_fl_builder_data', true ); foreach ( (array) $meta as $node_id => $node ) { if ( @isset( $node->type ) && 'module' == $node->type ) { // @codingStandardsIgnoreLine if ( ! isset( $data['modules'][ $node->settings->type ] ) ) { $data['modules'][ $node->settings->type ] = 1; } else { $data['modules'][ $node->settings->type ] ++; } } } } } // themer settings. $args = array( 'post_type' => 'fl-theme-layout', 'post_status' => 'publish', 'meta_key' => '_fl_builder_enabled', 'meta_value' => '1', 'posts_per_page' => -1, ); $query = new WP_Query( $args ); $data['themer']['total'] = count( $query->posts ); if ( is_array( $query->posts ) && ! empty( $query->posts ) ) { foreach ( $query->posts as $post ) { $meta = get_post_meta( $post->ID ); if ( isset( $meta['_fl_theme_layout_type'] ) ) { if ( ! isset( $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ) ) { $data['themer'][ $meta['_fl_theme_layout_type'][0] ] = 1; } else { $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ++; } } } } /** * Find all users that are using the builder. */ $args = array( 'meta_key' => 'fl_builder_user_settings', 'meta_value' => 'null', 'meta_compare' => '!=', ); $query = new WP_User_Query( $args ); $user_settings = array(); foreach ( $query->results as $user ) { $meta = get_user_meta( $user->ID, 'fl_builder_user_settings', true ); $user_settings[ $user->ID ] = $meta; } $data['user_settings'] = $user_settings; $args = array( 'meta_key' => 'fl_builder_browser_stats', 'meta_value' => 'null', 'meta_compare' => '!=', ); $query = new WP_User_Query( $args ); $browsers = array(); foreach ( $query->results as $user ) { $meta = get_user_meta( $user->ID, 'fl_builder_browser_stats', true ); $browsers[ $user->ID ] = $meta; } $data['browsers'] = $browsers; } /** * General data */ $data['server'] = $_SERVER['SERVER_SOFTWARE']; $data['database'] = ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : 'Unknown' ); $data['multisite'] = is_multisite() ? 'Yes' : 'No'; $data['subsites'] = is_multisite() ? get_blog_count() : ''; $data['locale'] = get_locale(); $data['users'] = $users['total_users']; $data['php'] = phpversion(); $data['wp'] = $wp_version; $data['fl-builder'] = FL_BUILDER_VERSION; $data['fl-theme'] = ( defined( 'FL_THEME_VERSION' ) ) ? FL_THEME_VERSION : false; $data['fl-themer'] = ( defined( 'FL_THEME_BUILDER_VERSION' ) ) ? FL_THEME_BUILDER_VERSION : false; $settings_orig = FLBuilderModel::get_global_settings(); $settings = clone $settings_orig; // we dont need these unset( $settings->js ); unset( $settings->css ); foreach ( $settings as $k => $setting ) { $data['settings'][ $k ] = $setting; } $theme = wp_get_theme(); if ( $theme->get( 'Template' ) ) { $parent = wp_get_theme( $theme->get( 'Template' ) ); $data['theme'] = $parent->get( 'Name' ); $data['theme_child'] = $theme->get( 'Name' ); } else { $data['theme'] = $theme->get( 'Name' ); } if ( class_exists( 'FLUpdater' ) && false == $demo ) { $subscription = FLUpdater::get_subscription_info(); if ( ! $subscription->active ) { $data['license'] = 'none'; } else { $data['license'] = array(); foreach ( (array) $subscription->subscriptions as $subscription ) { if ( false !== strpos( $subscription->name, 'Beaver Builder' ) ) { $data['license']['bb-plugin'] = $subscription->name; } if ( 'Beaver Themer Plugin' == $subscription->name ) { $data['license']['bb-themer'] = $subscription->name; } } } } else { $data['license'] = 'none'; } $output = array( 'id' => md5( get_bloginfo( 'url' ) . get_bloginfo( 'admin_email' ) ), 'data' => $data, ); return $output; } } FLBuilderUsage::init();