114 lines
2.1 KiB
PHP
114 lines
2.1 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Send Tracks events on behalf of a user using pixel images in page footer.
|
||
|
*
|
||
|
* @package WooCommerce\Tracks
|
||
|
*/
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* WC_Tracks_Footer_Pixel class.
|
||
|
*/
|
||
|
class WC_Tracks_Footer_Pixel {
|
||
|
/**
|
||
|
* Singleton instance.
|
||
|
*
|
||
|
* @var WC_Tracks_Footer_Pixel
|
||
|
*/
|
||
|
protected static $instance = null;
|
||
|
|
||
|
/**
|
||
|
* Events to send to Tracks.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $events = array();
|
||
|
|
||
|
/**
|
||
|
* Instantiate the singleton.
|
||
|
*
|
||
|
* @return WC_Tracks_Footer_Pixel
|
||
|
*/
|
||
|
public static function instance() {
|
||
|
if ( is_null( self::$instance ) ) {
|
||
|
self::$instance = new WC_Tracks_Footer_Pixel();
|
||
|
}
|
||
|
|
||
|
return self::$instance;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Constructor - attach hooks to the singleton instance.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
add_action( 'admin_footer', array( $this, 'render_tracking_pixels' ) );
|
||
|
add_action( 'shutdown', array( $this, 'send_tracks_requests' ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Record a Tracks event
|
||
|
*
|
||
|
* @param array $event Array of event properties.
|
||
|
* @return bool|WP_Error True on success, WP_Error on failure.
|
||
|
*/
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
self::instance()->add_event( $event );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add a Tracks event to the queue.
|
||
|
*
|
||
|
* @param WC_Tracks_Event $event Event to track.
|
||
|
*/
|
||
|
public function add_event( $event ) {
|
||
|
$this->events[] = $event;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add events as tracking pixels to page footer.
|
||
|
*/
|
||
|
public function render_tracking_pixels() {
|
||
|
if ( empty( $this->events ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ( $this->events as $event ) {
|
||
|
$pixel = $event->build_pixel_url();
|
||
|
|
||
|
if ( ! $pixel ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
echo '<img style="position: fixed;" src="', esc_url( $pixel ), '" />';
|
||
|
}
|
||
|
|
||
|
$this->events = array();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Fire off API calls for events that weren't converted to pixels.
|
||
|
*
|
||
|
* This handles wp_redirect().
|
||
|
*/
|
||
|
public function send_tracks_requests() {
|
||
|
if ( empty( $this->events ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ( $this->events as $event ) {
|
||
|
WC_Tracks_Client::record_event( $event );
|
||
|
}
|
||
|
}
|
||
|
}
|