enabled ) { aioseo()->helpers->unscheduleAction( $action ); return; } // Register the action handler. add_action( $action, [ $this, 'process' ] ); if ( ! as_next_scheduled_action( $action ) ) { as_schedule_recurring_action( $this->generateStartDate(), WEEK_IN_SECONDS, $action, [], 'aioseo' ); // Run the task immediately using an async action. as_enqueue_async_action( $action, [], 'aioseo' ); } } catch ( \Exception $e ) { // Do nothing. } } /** * Processes the usage tracking. * * @since 4.0.0 * * @return void */ public function process() { if ( ! $this->enabled ) { return; } wp_remote_post( $this->getUrl(), [ 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.1', 'blocking' => true, 'headers' => [ 'Content-Type' => 'application/json; charset=utf-8' ], 'body' => wp_json_encode( $this->getData() ), 'user-agent' => 'AIOSEO/' . AIOSEO_VERSION . '; ' . get_bloginfo( 'url' ), ] ); } /** * 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()->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' => aioseo()->helpers->getTimeZoneOffset(), '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 ); } }); $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 ); } /** * Generate a random start date for usage tracking. * * @since 4.0.0 * * @return integer The randomized start date. */ private function generateStartDate() { $tracking = [ 'days' => wp_rand( 0, 6 ) * DAY_IN_SECONDS, 'hours' => wp_rand( 0, 23 ) * HOUR_IN_SECONDS, 'minutes' => wp_rand( 0, 23 ) * HOUR_IN_SECONDS, 'seconds' => wp_rand( 0, 59 ) ]; return strtotime( 'next sunday' ) + array_sum( $tracking ); } }