HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: /var/www/html/ielts-store/wp-content/plugins/automatewoo/includes/Usage_Tracking/Initializer.php
<?php

namespace AutomateWoo\Usage_Tracking;

use AutomateWoo\Exceptions\InvalidClass;

/**
 * Static Helper Class for tracks.
 *
 * @package AutomateWoo\Usage_Tracking
 * @since   4.9.0
 */
class Initializer {

	/**
	 * The tracks object.
	 *
	 * @var Tracks_Interface
	 */
	private static $tracks;

	/**
	 * Initialize our tracking classes.
	 *
	 * There are two kinds of data that we're tracking: events, referred to as "Tracks", and
	 * general store data, referred to as the "Tracker". Here we initialize both types of data.
	 */
	public static function init() {
		if ( ! apply_filters( 'automatewoo/usage_tracking/enabled', true ) ) {
			return;
		}

		do_action( 'automatewoo/usage_tracking/init' );

		self::initialize_tracks();
		self::initialize_tracker();
	}

	/**
	 * Initialize the tracks object if needed.
	 */
	private static function maybe_initialize_tracks() {
		if ( null === self::$tracks ) {
			self::$tracks = new Tracks();
		}
	}

	/**
	 * Initialize our tracks classes.
	 *
	 * @throws InvalidClass When a class does not exist, or the proper interface is not implemented.
	 */
	private static function initialize_tracks() {
		self::maybe_initialize_tracks();

		// Allow add-ons to include their own classes for tracking.
		$addon_classes = (array) apply_filters( 'automatewoo/usage_tracking/addon_tracking_classes', [] );

		// Our own list of classes for event tracking.
		$classes = [
			Conversions::class,
			Install::class,
			Workflows::class,
		];

		// Instantiate each class.
		$classes = array_unique( array_merge( $addon_classes, $classes ) );
		foreach ( $classes as $class ) {
			self::validate_class( $class, Event_Tracker_Interface::class );

			/** @var Event_Tracker_Interface $instance */
			$instance = new $class();
			$instance->init();
			$instance->set_tracks( self::$tracks );
		}
	}

	/**
	 * Hook our custom tracker data to the regular WC tracker data.
	 */
	private static function initialize_tracker() {
		global $wpdb;

		$tracker = new Tracker( $wpdb );
		$tracker->init();
	}

	/**
	 * Validate that a class exists and that it implements the given interface.
	 *
	 * @param string $class     The class to validate.
	 * @param string $interface The interface the class should implement.
	 *
	 * @throws InvalidClass When the class is invalid.
	 */
	private static function validate_class( $class, $interface ) {
		if ( ! class_exists( $class ) ) {
			throw InvalidClass::does_not_exist( $class );
		}

		$implements = class_implements( $class );
		if ( ! array_key_exists( $interface, $implements ) ) {
			throw InvalidClass::does_not_implement_interface( $class, $interface );
		}
	}
}