You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
6.3 KiB
PHP

<?php
/**
* Tracking class.
*
* Used for setting up telemetry.
*
* @link https://github.com/googleforcreators/web-stories-wp
*
* @copyright 2020 Google LLC
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
*/
/**
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
declare(strict_types = 1);
namespace Google\Web_Stories;
use Google\Web_Stories\Integrations\Site_Kit;
use Google\Web_Stories\Integrations\WooCommerce;
use Google\Web_Stories\User\Preferences;
use WP_User;
/**
* Tracking class.
*/
class Tracking extends Service_Base {
/**
* Web Stories tracking script handle.
*/
public const SCRIPT_HANDLE = 'web-stories-tracking';
/**
* Google Analytics property ID.
*/
public const TRACKING_ID = 'UA-168571240-1';
/**
* Google Analytics 4 measurement ID.
*/
public const TRACKING_ID_GA4 = 'G-T88C9951CM';
/**
* Experiments instance.
*
* @var Experiments Experiments instance.
*/
private Experiments $experiments;
/**
* Site_Kit instance.
*
* @var Site_Kit Site_Kit instance.
*/
private Site_Kit $site_kit;
/**
* Assets instance.
*
* @var Assets Assets instance.
*/
private Assets $assets;
/**
* Settings instance.
*
* @var Settings Settings instance.
*/
private Settings $settings;
/**
* Preferences instance.
*
* @var Preferences Preferences instance.
*/
private Preferences $preferences;
/**
* WooCommerce instance.
*
* @var WooCommerce WooCommerce instance.
*/
private WooCommerce $woocommerce;
/**
* Tracking constructor.
*
* @since 1.4.0
*
* @param Experiments $experiments Experiments instance.
* @param Site_Kit $site_kit Site_Kit instance.
* @param Assets $assets Assets instance.
* @param Settings $settings Settings instance.
* @param Preferences $preferences Preferences instance.
* @param WooCommerce $woocommerce WooCommerce instance.
*/
public function __construct(
Experiments $experiments,
Site_Kit $site_kit,
Assets $assets,
Settings $settings,
Preferences $preferences,
WooCommerce $woocommerce
) {
$this->assets = $assets;
$this->experiments = $experiments;
$this->site_kit = $site_kit;
$this->settings = $settings;
$this->preferences = $preferences;
$this->woocommerce = $woocommerce;
}
/**
* Initializes tracking.
*
* Registers the setting in WordPress.
*
* @since 1.0.0
*/
public function register(): void {
// By not passing an actual script src we can print only the inline script.
$this->assets->register_script(
self::SCRIPT_HANDLE,
false,
[],
WEBSTORIES_VERSION,
false
);
wp_add_inline_script(
self::SCRIPT_HANDLE,
'window.webStoriesTrackingSettings = ' . wp_json_encode( $this->get_settings() ) . ';'
);
}
/**
* Get the action to use for registering the service.
*
* @since 1.6.0
*
* @return string Registration action to use.
*/
public static function get_registration_action(): string {
return 'admin_init';
}
/**
* Returns tracking settings to pass to the inline script.
*
* @since 1.0.0
*
* @return array<string, array<string, bool|int|string>|bool|string> Tracking settings.
*/
public function get_settings(): array {
return [
'trackingAllowed' => $this->is_active(),
'trackingId' => self::TRACKING_ID,
'trackingIdGA4' => self::TRACKING_ID_GA4,
// This doesn't seem to be fully working for web properties.
// So we send it as both app_version and a user property.
// See https://support.google.com/analytics/answer/9268042.
'appVersion' => WEBSTORIES_VERSION,
'userProperties' => $this->get_user_properties(),
];
}
/**
* Is tracking active for the current user?
*
* @return bool True if tracking enabled, and False if not.
*/
public function is_active(): bool {
return (bool) $this->preferences->get_preference( get_current_user_id(), Preferences::OPTIN_META_KEY );
}
/**
* Returns a list of user properties.
*
* @since 1.4.0
*
* @return array<string, string|int|bool> User properties.
*/
private function get_user_properties(): array {
/**
* Current user.
*
* @var null|WP_User $current_user
*/
$current_user = wp_get_current_user();
$roles = $current_user instanceof WP_User ? $current_user->roles : [];
$role = ! empty( $roles ) && \is_array( $roles ) ? array_shift( $roles ) : '';
$experiments = implode( ',', $this->experiments->get_enabled_experiments() );
$active_plugins = [];
$woocommerce_status = $this->woocommerce->get_plugin_status();
if ( $woocommerce_status['active'] ) {
$active_plugins[] = 'woocommerce';
}
$site_kit_status = $this->site_kit->get_plugin_status();
$analytics = $site_kit_status['analyticsActive'] ? 'google-site-kit' : ! empty( $this->settings->get_setting( $this->settings::SETTING_NAME_TRACKING_ID ) );
if ( $site_kit_status['active'] ) {
$active_plugins[] = 'google-site-kit';
}
/**
* Ad network type.
*
* @var string $ad_network
*/
$ad_network = $this->settings->get_setting( $this->settings::SETTING_NAME_AD_NETWORK, 'none' );
return [
'siteLocale' => get_locale(),
'userLocale' => get_user_locale(),
'userRole' => $role,
'enabledExperiments' => $experiments,
'wpVersion' => (string) get_bloginfo( 'version' ),
'phpVersion' => (string) PHP_VERSION,
'isMultisite' => (int) is_multisite(),
'serverEnvironment' => wp_get_environment_type(),
'adNetwork' => $ad_network,
'analytics' => $analytics,
'activePlugins' => implode( ',', $active_plugins ),
// This doesn't seem to be fully working for web properties.
// So we send it as both app_version and a user property.
// See https://support.google.com/analytics/answer/9268042.
'pluginVersion' => WEBSTORIES_VERSION,
];
}
}