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/Tracker.php
<?php

namespace AutomateWoo\Usage_Tracking;

use AutomateWoo\Clean;
use AutomateWoo\Log_Query;
use AutomateWoo\Workflow_Query;
use WC_Order;
use WP_Query;
use wpdb;

/**
 * Tracker class.
 *
 * @package AutomateWoo\Usage_Tracking
 * @since   4.9.0
 */
class Tracker {

	/**
	 * The WordPress Database instance.
	 *
	 * @var wpdb
	 */
	protected $wpdb;

	/**
	 * Tracker constructor.
	 *
	 * @param wpdb $wpdb The WordPress Database object.
	 */
	public function __construct( $wpdb ) {
		$this->wpdb = $wpdb;
	}

	/**
	 * Hook our tracker data into the WC tracker data.
	 */
	public function init() {
		add_filter(
			'woocommerce_tracker_data',
			function ( $data ) {
				return $this->add_data( $data );
			}
		);
	}

	/**
	 * Add our AutomateWoo data to the WC Tracker.
	 *
	 * @param array $data The existing array of tracker data.
	 *
	 * @return array
	 */
	private function add_data( $data = [] ) {
		if ( ! isset( $data['extensions'] ) ) {
			$data['extensions'] = [];
		}

		$conversion_data = $this->get_conversion_data();

		$data['extensions']['automatewoo'] = [
			'settings'                   => $this->get_settings(),
			'active_actions'             => $this->get_active_actions(),
			'active_triggers'            => $this->get_active_triggers(),
			'active_automatic_workflows' => $this->get_active_automatic_workflows(),
			'manual_workflows'           => $this->get_manual_workflows(),
			'conversion_count'           => $conversion_data['count'],
			'conversion_value'           => $conversion_data['total'],
			'log_counts'                 => $this->get_log_count_data(),
		];

		return $data;
	}

	/**
	 * Get settings data for AutomateWoo.
	 *
	 * @return array
	 */
	private function get_settings() {
		$options = AW()->options();

		return [
			'database_version'                         => $options::database_version(),
			'file_version'                             => $options::file_version(),
			'optin_enabled'                            => $options::optin_enabled(),
			'session_tracking_enabled'                 => $options::session_tracking_enabled(),
			'session_tracking_requires_cookie_consent' => $options::session_tracking_requires_cookie_consent(),
			'session_tracking_consent_cookie_name'     => $options::session_tracking_consent_cookie_name(),
			'presubmit_capture_enabled'                => $options::presubmit_capture_enabled(),
			'abandoned_cart_enabled'                   => $options::abandoned_cart_enabled(),
			'checkout_optin_enabled'                   => $options::checkout_optin_enabled(),
			'account_optin_enabled'                    => $options::account_optin_enabled(),
			'communication_account_tab_enabled'        => $options::communication_account_tab_enabled(),
			'mailchimp_integration_enabled'            => $options::mailchimp_enabled(),
			'campaign_monitor_integration_enabled'     => $options->campaign_monitor_enabled,
			'active_campaign_integration_enabled'      => $options->active_campaign_integration_enabled,
			'twilio_integration_enabled'               => $options->twilio_integration_enabled,
			'bitly_shorten_sms_links'                  => $options->bitly_shorten_sms_links,
		];
	}

	/**
	 * Get the action names that are actively in use for the store.
	 *
	 * @return array
	 */
	private function get_active_actions() {
		$sql = "SELECT meta.meta_value FROM {$this->wpdb->posts} AS posts
			LEFT JOIN {$this->wpdb->postmeta} AS meta ON posts.ID = meta.post_id
			WHERE post_type = 'aw_workflow'
			AND post_status = 'publish'
			AND meta.meta_key = 'actions'";

		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
		$results = Clean::recursive( $this->wpdb->get_col( $sql ) );
		// phpcs:enable

		// Process the results into action names.
		$actions = [];
		foreach ( $results as $result ) {
			$data = maybe_unserialize( $result );
			if ( ! is_array( $data ) ) {
				continue;
			}

			$counts = array_count_values( wp_list_pluck( $data, 'action_name' ) );
			foreach ( $counts as $action_name => $count ) {
				if ( ! array_key_exists( $action_name, $actions ) ) {
					$actions[ $action_name ] = $count;
				} else {
					$actions[ $action_name ] += $count;
				}
			}
		}

		return $actions;
	}

	/**
	 * Get the number of active automatic workflows.
	 *
	 * @return int
	 */
	private function get_active_automatic_workflows() {
		$query = $this->get_workflow_count_query();
		$query->set_status( 'active' );
		$query->set_type( 'automatic' );
		$query->get_results();

		return $query->get_found_rows();
	}

	/**
	 * Get the number of manual workflows.
	 *
	 * @return int
	 */
	private function get_manual_workflows() {
		$query = $this->get_workflow_count_query();
		$query->set_type( 'manual' );
		$query->get_results();

		return $query->get_found_rows();
	}

	/**
	 * Get a workflow query to be used for obtaining a count of workflows.
	 *
	 * @return Workflow_Query
	 */
	private function get_workflow_count_query() {
		$query = new Workflow_Query();
		$query->set_limit( 1 );
		$query->set_no_found_rows( false );
		$query->set_return( 'ids' );

		return $query;
	}

	/**
	 * Get the log count data for the Tracker.
	 *
	 * @return array
	 */
	private function get_log_count_data() {
		$log_query = new Log_Query();
		$count     = $log_query->get_count();

		$conversion_query   = clone $log_query;
		$conversion_enabled = $conversion_query->where( 'conversion_tracking_enabled', true )->get_count();

		$tracking_query   = clone $log_query;
		$tracking_enabled = $tracking_query->where( 'tracking_enabled', true )->get_count();

		return [
			'total'                       => $count,
			'conversion_tracking_enabled' => $conversion_enabled,
			'tracking_enabled'            => $tracking_enabled,
		];
	}

	/**
	 * Get the array of conversion data for the tracker.
	 *
	 * @return array
	 */
	private function get_conversion_data() {
		// Get paid statuses, and generate placeholders for query.
		$statuses    = array_map( 'aw_add_order_status_prefix', wc_get_is_paid_statuses() );
		$placeholder = join( ',', array_fill( 1, count( $statuses ), '%s' ) );

		// Build the query to get the results we need.
		$sql = "
			SELECT SUM(order_total) AS total, COUNT(order_id) AS count FROM (
				SELECT posts.ID AS order_id, meta2.meta_value AS order_total 
				FROM {$this->wpdb->posts} AS posts
				LEFT JOIN {$this->wpdb->postmeta} AS meta1 ON posts.ID = meta1.post_id
				LEFT JOIN {$this->wpdb->postmeta} AS meta2 ON posts.ID = meta2.post_id
				WHERE posts.post_type = 'shop_order'
				AND posts.post_status IN ({$placeholder})
				AND meta1.meta_key = '_aw_conversion'
				AND meta2.meta_key = '_order_total'
				GROUP BY order_id
			) AS orders_table";

		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
		return $this->wpdb->get_row( $this->wpdb->prepare( $sql, ...$statuses ), ARRAY_A );
		// phpcs:enable
	}

	/**
	 * Get active triggers and the count of how many times they are used.
	 *
	 * @return array
	 */
	private function get_active_triggers() {
		$sql = "SELECT meta.meta_value FROM {$this->wpdb->posts} as posts
			LEFT JOIN {$this->wpdb->postmeta} AS meta ON posts.ID = meta.post_id
			WHERE post_type = 'aw_workflow'
			AND post_status = 'publish'
			AND meta.meta_key = 'trigger_name'";

		// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
		$results = Clean::recursive( $this->wpdb->get_col( $sql ) );
		// phpcs:enable

		return array_count_values( $results );
	}
}