<?php
use Automattic\Jetpack\Constants;
use Automattic\WooCommerce\Utilities\NumberUtil;
defined('ABSPATH') || exit;
class WC_Tracks_Client
{
const PIXEL = 'https://pixel.wp.com/t.gif';
const BROWSER_TYPE = 'php-agent';
const USER_AGENT_SLUG = 'tracks-client';
public static function init()
{
add_action('admin_init', array(__CLASS__, 'maybe_set_identity_cookie'));
}
public static function maybe_set_identity_cookie()
{
if (Constants::is_true('DOING_AJAX')) {
return;
}
if (isset($_COOKIE['tk_ai'])) {
return;
}
$user = wp_get_current_user();
if ($user instanceof WP_User && 'wptests_capabilities' === $user->cap_key) {
return false;
}
$user_id = $user->ID;
$anon_id = get_user_meta($user_id, '_woocommerce_tracks_anon_id', true);
if (!$anon_id) {
$anon_id = self::get_anon_id();
update_user_meta($user_id, '_woocommerce_tracks_anon_id', $anon_id);
}
if (!Constants::is_true('REST_REQUEST') && !Constants::is_true('XMLRPC_REQUEST')) {
wc_setcookie('tk_ai', $anon_id);
}
}
public static function record_event($event)
{
if (!$event instanceof WC_Tracks_Event) {
$event = new WC_Tracks_Event($event);
}
if (is_wp_error($event)) {
return $event;
}
$pixel = $event->build_pixel_url($event);
if (!$pixel) {
return new WP_Error('invalid_pixel', 'cannot generate tracks pixel for given input', 400);
}
return self::record_pixel($pixel);
}
public static function record_pixel($pixel)
{
$pixel .= '&_rt=' . self::build_timestamp() . '&_=_';
wp_safe_remote_get($pixel, array('blocking' => false, 'redirection' => 2, 'httpversion' => '1.1', 'timeout' => 1));
return true;
}
public static function build_timestamp()
{
$ts = NumberUtil::round(microtime(true) * 1000);
return number_format($ts, 0, '', '');
}
public static function get_identity($user_id)
{
$jetpack_lib = '/tracks/client.php';
if (class_exists('Jetpack') && Constants::is_defined('JETPACK__VERSION')) {
if (version_compare(Constants::get_constant('JETPACK__VERSION'), '7.5', '<')) {
if (file_exists(jetpack_require_lib_dir() . $jetpack_lib)) {
include_once jetpack_require_lib_dir() . $jetpack_lib;
if (function_exists('jetpack_tracks_get_identity')) {
return jetpack_tracks_get_identity($user_id);
}
}
} else {
$tracking = new Automattic\Jetpack\Tracking();
return $tracking->tracks_get_identity($user_id);
}
}
$anon_id = isset($_COOKIE['tk_ai']) ? sanitize_text_field(wp_unslash($_COOKIE['tk_ai'])) : false;
if (!$anon_id) {
$anon_id = get_user_meta($user_id, '_woocommerce_tracks_anon_id', true);
}
if (!$anon_id) {
$anon_id = self::get_anon_id();
update_user_meta($user_id, '_woocommerce_tracks_anon_id', $anon_id);
}
return array('_ut' => 'anon', '_ui' => $anon_id);
}
public static function get_anon_id()
{
static $anon_id = null;
if (!isset($anon_id)) {
if (isset($_COOKIE['tk_ai'])) {
$anon_id = sanitize_text_field(wp_unslash($_COOKIE['tk_ai']));
} else {
$binary = '';
for ($i = 0; $i < 18; ++$i) {
$binary .= chr(wp_rand(0, 255));
}
$anon_id = 'woo:' . base64_encode($binary);
}
}
return $anon_id;
}
}
WC_Tracks_Client::init();