actionName, [ $this, 'process' ] ); } /** * Runs on the init action. * * @since 4.0.0 * @version 4.9.4.2 Use AIOSEO wrapper for scheduling; remove extra async action. * * @return void */ public function init() { if ( ! $this->enabled ) { aioseo()->actionScheduler->unschedule( $this->actionName ); return; } if ( aioseo()->actionScheduler->isScheduled( $this->actionName ) ) { return; } aioseo()->actionScheduler->scheduleRecurrent( $this->actionName, 0, WEEK_IN_SECONDS ); } /** * Processes the usage tracking. * * @since 4.0.0 * * @return void */ public function process() { if ( ! $this->enabled ) { return; } $cacheKey = 'usage_tracking_last_sent'; if ( null !== aioseo()->core->cache->get( $cacheKey ) ) { return; } aioseo()->core->cache->update( $cacheKey, true, DAY_IN_SECONDS ); aioseo()->helpers->wpRemotePost( $this->getUrl(), [ 'blocking' => false, 'aioseo_skip_lock' => true, 'body' => wp_json_encode( $this->getData() ) ] ); } /** * Gets the URL for the notifications api. * * @since 4.0.0 * * @return string The URL to use for the api requests. */ private function getUrl() { if ( defined( 'AIOSEO_USAGE_TRACKING_URL' ) ) { return AIOSEO_USAGE_TRACKING_URL; } return $this->url; } /** * Retrieves the data to send in the usage tracking. * * @since 4.0.0 * * @return array An array of data to send. */ protected function getData() { $themeData = wp_get_theme(); $type = $this->getType(); return [ // Generic data (environment). 'url' => home_url(), 'php_version' => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, 'wp_version' => get_bloginfo( 'version' ), 'mysql_version' => aioseo()->core->db->db->db_version(), 'server_version' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '', 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'sites_count' => function_exists( 'get_blog_count' ) ? (int) get_blog_count() : 1, 'active_plugins' => $this->getActivePlugins(), 'theme_name' => $themeData->name, 'theme_version' => $themeData->version, 'user_count' => function_exists( 'get_user_count' ) ? get_user_count() : null, 'locale' => get_locale(), 'timezone_offset' => wp_timezone_string(), 'email' => get_bloginfo( 'admin_email' ), // AIOSEO specific data. 'aioseo_version' => AIOSEO_VERSION, 'aioseo_license_key' => null, 'aioseo_license_type' => null, 'aioseo_is_pro' => false, "aioseo_{$type}_installed_date" => aioseo()->internalOptions->internal->installed, 'aioseo_settings' => $this->getSettings() ]; } /** * Get the settings and escape the quotes so it can be JSON encoded. * * @since 4.0.0 * * @return array An array of settings data. */ private function getSettings() { $settings = aioseo()->options->all(); array_walk_recursive( $settings, function( &$v ) { if ( is_string( $v ) && strpos( $v, '"' ) !== false ) { $v = str_replace( '"', '\"', $v ); } }); $settings = $this->filterPrivateSettings( $settings ); $internal = aioseo()->internalOptions->all(); array_walk_recursive( $internal, function( &$v ) { if ( is_string( $v ) && strpos( $v, '"' ) !== false ) { $v = str_replace( '"', '\"', $v ); } }); return [ 'options' => $settings, 'internal' => $internal ]; } /** * Return a list of active plugins. * * @since 4.0.0 * * @return array An array of active plugin data. */ private function getActivePlugins() { if ( ! function_exists( 'get_plugins' ) ) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $active = get_option( 'active_plugins', [] ); $plugins = array_intersect_key( get_plugins(), array_flip( $active ) ); return array_map( static function ( $plugin ) { if ( isset( $plugin['Version'] ) ) { return $plugin['Version']; } return 'Not Set'; }, $plugins ); } /** * Anonimizes or obfuscates the value of certain settings. * * @since 4.3.2 * * @param array $settings The settings. * @return array The altered settings. */ private function filterPrivateSettings( $settings ) { if ( ! empty( $settings['localBusiness']['maps']['apiKey'] ) ) { $settings['localBusiness']['maps']['apiKey'] = true; } return $settings; } }