* CartEventTracker class file.
declare( strict_types=1 );
namespace Automattic\WooCommerce\Internal\FraudProtection;
defined( 'ABSPATH' ) || exit;
* Tracks cart events for fraud protection analysis.
* This class provides methods to track cart events (add, update, remove, restore)
* for fraud protection. Event-specific data is passed
* to the SessionDataCollector which handles session data storage internally.
* @internal This class is part of the internal API and is subject to change without notice.
* Session data collector instance.
* @var SessionDataCollector
private SessionDataCollector $session_data_collector;
* Initialize with dependencies.
* @param SessionDataCollector $session_data_collector The session data collector instance.
final public function init( SessionDataCollector $session_data_collector ): void {
$this->session_data_collector = $session_data_collector;
* Track cart page loaded event.
* Collects session data when the cart page is initially loaded.
* This captures the initial session state before any user interactions.
public function track_cart_page_loaded(): void {
$this->session_data_collector->collect( 'cart_page_loaded', array() );
* Track cart item added event.
* Collects session data when an item is added to the cart.
* @param string $cart_item_key Cart item key.
* @param int $product_id Product ID.
* @param int $quantity Quantity added.
* @param int $variation_id Variation ID.
public function track_cart_item_added( $cart_item_key, $product_id, $quantity, $variation_id ): void {
$event_data = $this->build_cart_event_data(
$this->session_data_collector->collect( 'cart_item_added', $event_data );
* Track cart item quantity updated event.
* Collects session data when cart item quantity is updated.
* @param string $cart_item_key Cart item key.
* @param int $quantity New quantity.
* @param int $old_quantity Old quantity.
* @param object $cart Cart object.
public function track_cart_item_updated( $cart_item_key, $quantity, $old_quantity, $cart ): void {
$cart_item = $cart->cart_contents[ $cart_item_key ] ?? null;
if ( (int) $quantity === (int) $old_quantity || ! $cart_item ) {
$product_id = $cart_item['product_id'] ?? 0;
$variation_id = $cart_item['variation_id'] ?? 0;
$event_data = $this->build_cart_event_data(
$event_data['old_quantity'] = (int) $old_quantity;
$this->session_data_collector->collect( 'cart_item_updated', $event_data );
* Track cart item removed event.
* Collects session data when an item is removed from the cart.
* @param string $cart_item_key Cart item key.
* @param object $cart Cart object.
public function track_cart_item_removed( $cart_item_key, $cart ): void {
$cart_item = $cart->removed_cart_contents[ $cart_item_key ] ?? null;
$product_id = $cart_item['product_id'] ?? 0;
$variation_id = $cart_item['variation_id'] ?? 0;
$quantity = $cart_item['quantity'] ?? 0;
$event_data = $this->build_cart_event_data(
$this->session_data_collector->collect( 'cart_item_removed', $event_data );
* Track cart item restored event.
* Collects session data when a removed item is restored to the cart.
* @param string $cart_item_key Cart item key.
* @param object $cart Cart object.
public function track_cart_item_restored( $cart_item_key, $cart ): void {
$cart_item = $cart->cart_contents[ $cart_item_key ] ?? null;
$product_id = $cart_item['product_id'] ?? 0;
$variation_id = $cart_item['variation_id'] ?? 0;
$quantity = $cart_item['quantity'] ?? 0;
$event_data = $this->build_cart_event_data(
$this->session_data_collector->collect( 'cart_item_restored', $event_data );
* Build cart event-specific data.
* Prepares the cart event data including action type, product details,
* and current cart state. This data will be merged with comprehensive
* session data during event dispatching.
* @param string $action Action type (item_added, item_updated, item_removed, item_restored).
* @param int $product_id Product ID.
* @param int $quantity Quantity.
* @param int $variation_id Variation ID.
* @return array Cart event data.
private function build_cart_event_data( string $action, int $product_id, int $quantity, int $variation_id ): array {
// Get current cart item count if cart is available.
if ( WC()->cart instanceof \WC_Cart ) {
$cart_item_count = WC()->cart->get_cart_contents_count();
'product_id' => $product_id,
'variation_id' => $variation_id,
'cart_item_count' => $cart_item_count,