| Server IP : 37.27.51.148 / Your IP : 37.27.51.148 Web Server : nginx/1.14.1 System : Linux libra 4.18.0-553.51.1.el8_10.x86_64 #1 SMP Wed Apr 30 20:24:04 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.3.31 Disable Function : exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/html/wp-content/plugins/pixelyoursite-pinterest/modules/pinterest/ |
Upload File : |
<?php
namespace PixelYourSite;
require_once PYS_PINTEREST_PATH . '/modules/pinterest/pinterest-server-async-task.php';
use PixelYourSite;
if ( !defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
class PinterestServer {
private static $_instance;
private $access_token;
private $isDebug;
private $woo_order = 0;
private $edd_order = 0;
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct() {
$this->isDebug = PYS()->getOption( 'debug_enabled' );
add_action( 'wp_ajax_pys_pinterest_api_event', array(
$this,
"catchPinterestAjaxEvent"
) );
add_action( 'wp_ajax_nopriv_pys_pinterest_api_event', array(
$this,
"catchPinterestAjaxEvent"
) );
/*add_action( 'woocommerce_add_to_cart', array(
$this,
'trackAddToCartEvent'
), 40, 4 );*/
// initialize pinterest event async task
new PinterestAsyncTask();
}
/**
* Send event in shutdown hook (not work in ajax)
* @param SingleEvent[] $events
*/
public function sendEventsAsync( $events ) {
$serverEvents = array();
foreach ( $events as $event ) {
if ( empty( $event->payload[ 'eventID' ] ) ) {
$token = Pinterest\pys_generate_token();
} else {
$token = $event->payload[ 'eventID' ];
}
$serverEvents[] = $this->dataToSingleEvent( $event->payload[ 'name' ], $event->params, $token, $event->payload[ 'pixelIds' ], '', '' );
}
if ( count( $serverEvents ) > 0 ) {
do_action( 'pys_send_pinterest_server_event', $serverEvents );
}
}
/**
* Send Event Now
*
* @param SingleEvent[] $events
*/
public function sendEventsNow( $events ) {
foreach ( $events as $event ) {
$serverEvent = $this->mapEventToServerEvent( $event );
$ids = $event->payload[ 'pixelIds' ];
$this->sendEvent( $ids, $serverEvent );
}
}
function trackAddToCartEvent( $cart_item_key, $product_id, $quantity, $variation_id ) {
if ( EventsWoo()->isReadyForFire( "woo_add_to_cart_on_button_click" ) && PYS()->getOption( 'woo_add_to_cart_catch_method' ) == "add_cart_js" ) {
// it ok. We send server method after js, and take event id from cookies
Pinterest()->getLog()->debug( ' trackAddToCartEvent send Pinterest server without browser event' );
if ( !empty( $variation_id ) && $variation_id > 0 && ( !Pinterest()->getOption( 'woo_variable_as_simple' ) ) ) {
$_product_id = $variation_id;
} else {
$_product_id = $product_id;
}
$event = new SingleEvent( "woo_add_to_cart_on_button_click", EventTypes::$DYNAMIC, 'woo' );
$event->args = [
'productId' => $_product_id,
'quantity' => $quantity
];
$event->params[ 'uri' ] = self::getRequestUri( PYS()->getOption( 'enable_remove_source_url_params' ) );
add_filter( 'pys_conditional_post_id', function ( $id ) use ( $product_id ) {
return $product_id;
} );
$events = Pinterest()->generateEvents( $event );
remove_all_filters( 'pys_conditional_post_id' );
foreach ( $events as $singleEvent ) {
if ( isset( $_COOKIE[ "pys_pinterest_event_id" ] ) ) {
$singleEvent->payload[ 'eventID' ] = json_decode( stripslashes( $_COOKIE[ "pys_pinterest_event_id" ] ) )->AddToCart;
}
}
do_action( 'pys_send_pinterest_server_event', $events );
}
}
/**
* If server message is blocked by gprg or it dynamic
* we send data by ajax request from js and send the same data like browser event
*/
function catchPinterestAjaxEvent() {
Pinterest()->getLog()->debug( ' catchPinterestAjaxEvent send to Pinterest server from ajax' );
$event = $_POST[ 'event' ];
$data = isset( $_POST[ 'data' ] ) ? $_POST[ 'data' ] : array();
$ids = $_POST[ 'ids' ];
$eventID = $_POST[ 'eventID' ];
$wooOrder = isset( $_POST[ 'woo_order' ] ) ? $_POST[ 'woo_order' ] : null;
$eddOrder = isset( $_POST[ 'edd_order' ] ) ? $_POST[ 'edd_order' ] : null;
if ( empty( $_REQUEST[ 'ajax_event' ] ) || !wp_verify_nonce( $_REQUEST[ 'ajax_event' ], 'ajax-event-nonce' ) ) {
wp_die();
return;
}
if ( $event == "hCR" ) $event = "CompleteRegistration"; // de mask completer registration event if it was hidden
$singleEvent = $this->dataToSingleEvent( $event, $data, $eventID, $ids, $wooOrder, $eddOrder );
$this->sendEventsNow( [ $singleEvent ] );
wp_die();
}
/**
* @param $eventName
* @param $params
* @param $eventID
* @param $ids
* @param $wooOrder
* @param $eddOrder
* @return SingleEvent
*/
private function dataToSingleEvent( $eventName, $params, $eventID, $ids, $wooOrder, $eddOrder ) {
$singleEvent = new SingleEvent( "", "" );
$payload = [
'name' => $eventName,
'eventID' => $eventID,
'woo_order' => $wooOrder,
'edd_order' => $eddOrder,
'pixelIds' => $ids
];
$singleEvent->addParams( $params );
$singleEvent->addPayload( $payload );
return $singleEvent;
}
/**
* Send event for each pixel id
* @param array $pixel_Ids //array of facebook ids
* @param $event //One Facebook event object
*/
function sendEvent( $pixel_Ids, $event ) {
if ( !$event || apply_filters( 'pys_disable_server_event_filter', false ) ) {
return;
}
if ( !$this->access_token ) {
$this->access_token = Pinterest()->getApiTokens();
}
foreach ( $pixel_Ids as $pixel_Id ) {
if ( !Pinterest()->enabled() || empty( $this->access_token[ $pixel_Id ] || empty( $this->access_token[ $pixel_Id ][ 'server_id' ] ) ) || empty( $this->access_token[ $pixel_Id ][ 'ad_account' ] ) ) continue;
$data = new \stdClass;
$data->data[] = $event;
$url = "https://api.pinterest.com/v5/ad_accounts/{$this->access_token[ $pixel_Id ][ 'ad_account' ]}/events";
$headers = array(
'Content-Type' => 'application/json',
'Authorization' => "Bearer " . $this->access_token[ $pixel_Id ][ 'server_id' ]
);
Pinterest()->getLog()->debug( ' Send Pinterest server event', $data );
try {
$client = new \PYS_PRO_GLOBAL\GuzzleHttp\Client();
$response = $client->request( 'POST', $url, [
'headers' => $headers,
'body' => json_encode( $data )
] );
Pinterest()->getLog()->debug( ' Response from Pinterest server', $response );
} catch ( \Exception $e ) {
Pinterest()->getLog()->error( 'Error send Pinterest server event ' . $e->getMessage() );
}
}
}
public function mapEventToServerEvent( $event ) {
$eventData = $event->getData();
$eventData = EventsManager::filterEventParams( $eventData, $event->getCategory(), [
'event_id' => $event->getId(),
'pixel' => Pinterest()->getSlug()
] );
$eventName = $eventData[ 'name' ];
$wooOrder = isset( $event->payload[ 'woo_order' ] ) ? $event->payload[ 'woo_order' ] : null;
$eddOrder = isset( $event->payload[ 'edd_order' ] ) ? $event->payload[ 'edd_order' ] : null;
$user_data = $this->getUserData( $wooOrder, $eddOrder );
$custom_data = $this->paramsToCustomData( $eventData[ 'params' ] );
if ( isset( $event->params[ 'uri' ] ) ) {
$uri = $event->params[ 'uri' ];
} else {
$uri = self::getRequestUri( PYS()->getOption( 'enable_remove_source_url_params' ) );
// set custom uri use in ajax request
if ( isset( $_POST[ 'url' ] ) ) {
if ( PYS()->getOption( 'enable_remove_source_url_params' ) ) {
$list = explode( "?", $_POST[ 'url' ] );
if ( is_array( $list ) && count( $list ) > 0 ) {
$uri = $list[ 0 ];
} else {
$uri = $_POST[ 'url' ];
}
} else {
$uri = $_POST[ 'url' ];
}
}
}
$serverEvent = new \stdClass;
$serverEvent->event_name = $eventName;
$serverEvent->event_time = time();
$serverEvent->event_source_url = $uri;
$serverEvent->action_source = 'website';
$serverEvent->user_data = $user_data;
$serverEvent->custom_data = $custom_data;
if ( isset( $event->payload[ 'eventID' ] ) ) {
$serverEvent->event_id = $event->payload[ 'eventID' ];
} else {
$serverEvent->event_id = '';
}
return $serverEvent;
}
private function getUserData( $wooOrder = null, $eddOrder = null ) {
$userData = new \stdClass;
if ( !$this->access_token ) {
$this->access_token = Pinterest()->getApiTokens();
}
/**
* Add purchase WooCommerce Advanced Matching params
*/
if ( PixelYourSite\isWooCommerceActive() && isEventEnabled( 'woo_purchase_enabled' ) && ( $wooOrder || ( is_order_received_page() && wooIsRequestContainOrderId() ) ) ) {
if ( wooIsRequestContainOrderId() ) {
$order_id = wooGetOrderIdFromRequest();
} else {
$order_id = $wooOrder;
}
$order = wc_get_order( $order_id );
if ( $order ) {
$this->woo_order = $order_id;
if ( PixelYourSite\isWooCommerceVersionGte( '3.0.0' ) ) {
if ( $order->get_billing_email() ) {
$userData->em[] = hash( 'sha256', mb_strtolower( $order->get_billing_email() ), false );
}
if ( $order->get_billing_phone() ) {
$userData->ph[] = hash( 'sha256', preg_replace( '/[^0-9]/', '', $order->get_billing_phone() ), false );
}
if ( $order->get_billing_first_name() ) {
$userData->fn[] = hash( 'sha256', mb_strtolower( $order->get_billing_first_name() ), false );
}
if ( $order->get_billing_last_name() ) {
$userData->ln[] = hash( 'sha256', mb_strtolower( $order->get_billing_last_name() ), false );
}
if ( $order->get_billing_city() ) {
$userData->ct[] = hash( 'sha256', mb_strtolower( preg_replace( '/[^\d|\w]/', '', $order->get_billing_city() ) ), false );
}
if ( $order->get_billing_state() ) {
$userData->st[] = hash( 'sha256', mb_strtolower( $order->get_billing_state() ), false );
}
if ( $order->get_billing_postcode() ) {
$userData->zp[] = hash( 'sha256', $order->get_billing_postcode(), false );
}
if ( $order->get_billing_country() ) {
$userData->country[] = hash( 'sha256', mb_strtolower( $order->get_billing_country() ), false );
}
} else {
if ( $order->billing_postcode ) {
$userData->zp[] = hash( 'sha256', $order->billing_postcode, false );
}
$userData->em[] = hash( 'sha256', mb_strtolower( $order->billing_email ), false );
$userData->ph[] = hash( 'sha256', preg_replace( '/[^0-9]/', '', $order->billing_phone ), false );
$userData->fn[] = hash( 'sha256', mb_strtolower( $order->billing_first_name ), false );
$userData->ln[] = hash( 'sha256', mb_strtolower( $order->billing_last_name ), false );
$userData->ct[] = hash( 'sha256', mb_strtolower( preg_replace( '/[^\d|\w]/', '', $order->billing_city ) ), false );
$userData->st[] = hash( 'sha256', mb_strtolower( $order->billing_state ), false );
$userData->country[] = hash( 'sha256', mb_strtolower( $order->billing_country ), false );
}
} else {
$userData = $this->getRegularUserData();
}
} else {
if ( PixelYourSite\isEddActive() && isEventEnabled( 'edd_purchase_enabled' ) && ( $eddOrder || edd_is_success_page() ) ) {
$this->edd_order = $eddOrder;
if ( $eddOrder ) $payment_id = $eddOrder; else {
$payment_key = getEddPaymentKey();
$payment_id = (int) edd_get_purchase_id_by_key( $payment_key );
}
$user_info = edd_get_payment_meta_user_info( $payment_id );
$email = edd_get_payment_user_email( $payment_id );
if ( $email ) {
$userData->em[] = hash( 'sha256', mb_strtolower( $email ), false );
}
if ( isset( $user_info[ 'first_name' ] ) ) $userData->fn[] = hash( 'sha256', mb_strtolower( $user_info[ 'first_name' ] ), false );
if ( isset( $user_info[ 'last_name' ] ) ) $userData->ln[] = hash( 'sha256', mb_strtolower( $user_info[ 'last_name' ] ), false );
} else {
$userData = $this->getRegularUserData();
}
}
$userData->client_ip_address = self::getIpAddress();
$userData->client_user_agent = self::getHttpUserAgent();
if ( PixelYourSite\EventsManager::isTrackExternalId() && isset( $_COOKIE[ 'pbid' ] ) ) {
$userData->external_id[] = $_COOKIE[ 'pbid' ];
}
return apply_filters( "pys_pinterest_server_user_data", $userData );
}
private function getRegularUserData() {
$user = wp_get_current_user();
$userData = new \stdClass;
if ( $user->ID ) {
// get user regular data
$userData->fn[] = hash( 'sha256', mb_strtolower( $user->get( 'user_firstname' ) ), false );
$userData->ln[] = hash( 'sha256', mb_strtolower( $user->get( 'user_lastname' ) ), false );
$userData->em[] = hash( 'sha256', mb_strtolower( $user->get( 'user_email' ) ), false );
/**
* Add common WooCommerce Advanced Matching params
*/
if ( PixelYourSite\isWooCommerceActive() ) {
// if first name is not set in regular wp user meta
if ( empty( $userData->fn[ 0 ] ) ) {
$userData->fn = hash( 'sha256', mb_strtolower( $user->get( 'billing_first_name' ) ), false );
}
// if last name is not set in regular wp user meta
if ( empty( $userData->ln[ 0 ] ) ) {
$userData->ln = $user->get( 'billing_last_name' );
}
if ( $user->get( 'billing_phone' ) ) $userData->ph[] = hash( 'sha256', preg_replace( '/[^0-9]/', '', $user->get( 'billing_phone' ) ), false );
if ( $user->get( 'billing_city' ) ) $userData->ct[] = hash( 'sha256', mb_strtolower( preg_replace( '/[^\d|\w]/', '', $user->get( 'billing_city' ) ) ), false );
if ( $user->get( 'billing_state' ) ) $userData->st[] = hash( 'sha256', mb_strtolower( $user->get( 'billing_state' ) ), false );
if ( $user->get( 'shipping_country' ) ) $userData->country[] = hash( 'sha256', mb_strtolower( $user->get( 'shipping_country' ) ), false );
if ( $user->get( 'billing_postcode' ) ) {
$userData->zp[] = hash( 'sha256', $user->get( 'billing_postcode' ), false );
}
}
} else {
if ( isset( $_COOKIE[ 'pys_advanced_form_data' ] ) ) {
$jsonStr = stripslashes( $_COOKIE[ 'pys_advanced_form_data' ] );
$advancedForm = json_decode( $jsonStr, true );
if ( isset( $advancedForm[ "email" ] ) && $advancedForm[ "email" ] != "" ) {
$userData->em[] = hash( 'sha256', mb_strtolower( $advancedForm[ "email" ] ), false );
}
if ( isset( $advancedForm[ "phone" ] ) && $advancedForm[ "phone" ] != "" ) {
$userData->ph[] = hash( 'sha256', preg_replace( '/[^0-9]/', '', $advancedForm[ "phone" ] ), false );
}
if ( isset( $advancedForm[ "first_name" ] ) && $advancedForm[ "first_name" ] != "" ) {
$userData->fn[] = hash( 'sha256', mb_strtolower( $advancedForm[ "first_name" ] ), false );
}
if ( isset( $advancedForm[ "last_name" ] ) && $advancedForm[ "last_name" ] != "" ) {
$userData->ln[] = hash( 'sha256', mb_strtolower( $advancedForm[ "last_name" ] ), false );
}
}
}
return apply_filters( "pys_pinterest_server_user_data", $userData );
}
private function paramsToCustomData( $data ) {
$custom_data = new \stdClass;
if ( isset( $data[ 'product_quantity' ] ) ) {
$data_line_items = array();
$data_line_items[ 'product_quantity' ] = $data[ 'product_quantity' ];
if ( isset( $data[ 'product_price' ] ) ) {
$data_line_items[ 'product_price' ] = $data[ 'product_price' ];
}
if ( isset( $data[ 'product_id' ] ) ) {
$data_line_items[ 'product_id' ] = $data[ 'product_id' ];
}
$data[ 'line_items' ][] = $data_line_items;
}
if ( isset( $data[ 'line_items' ] ) && is_array( $data[ 'line_items' ] ) ) {
$contents = array();
$ids = array();
$cost = 0;
$num_items = 0;
foreach ( $data[ 'line_items' ] as $c ) {
if ( isset( $c[ 'product_quantity' ] ) ) {
$contents[] = array(
'quantity' => (int) $c[ 'product_quantity' ],
'item_price' => isset( $c[ 'product_price' ] ) ? strval( $c[ 'product_price' ] ) : null
);
$cost += $c[ 'product_quantity' ] * ( $c[ 'product_price' ] ?? 0 );
$num_items++;
}
if ( isset( $c[ 'product_id' ] ) ) {
$ids[] = strval( $c[ 'product_id' ] );
}
}
$custom_data->contents = $contents;
$custom_data->value = strval( $cost );
$custom_data->content_ids = $ids;
$custom_data->num_items = $num_items;
} else {
$custom_data->contents = array();
}
if ( isset( $data[ 'currency' ] ) ) {
$custom_data->currency = $data[ 'currency' ];
}
$order_id = ( $this->woo_order !== 0 ) ? $this->woo_order : ( ( $this->edd_order !== 0 ) ? $this->edd_order : 0 );
if ( $order_id !== 0 ) {
$custom_data->order_id = strval( $order_id );
}
if ( !empty( $_GET[ 's' ] ) ) {
$custom_data->search_string = $_GET[ 's' ];
}
return apply_filters( "pys_pinterest_server_custom_data", $custom_data );
}
private static function getRequestUri( $removeQuery = false ) {
$request_uri = null;
if ( !empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
$start = ( isset( $_SERVER[ 'HTTPS' ] ) && $_SERVER[ 'HTTPS' ] === 'on' ? "https" : "http" ) . "://";
$request_uri = $start . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ];
}
if ( $removeQuery && isset( $_SERVER[ 'QUERY_STRING' ] ) ) {
$request_uri = str_replace( "?" . $_SERVER[ 'QUERY_STRING' ], "", $request_uri );
}
return $request_uri;
}
private static function getIpAddress() {
$HEADERS_TO_SCAN = array(
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR'
);
foreach ( $HEADERS_TO_SCAN as $header ) {
if ( array_key_exists( $header, $_SERVER ) ) {
$ip_list = explode( ',', $_SERVER[ $header ] );
foreach ( $ip_list as $ip ) {
$trimmed_ip = trim( $ip );
if ( self::isValidIpAddress( $trimmed_ip ) ) {
return $trimmed_ip;
}
}
}
}
return "127.0.0.1";
}
private static function isValidIpAddress( $ip_address ) {
return filter_var( $ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE );
}
private static function getHttpUserAgent() {
$user_agent = null;
if ( !empty( $_SERVER[ 'HTTP_USER_AGENT' ] ) ) {
$user_agent = $_SERVER[ 'HTTP_USER_AGENT' ];
}
return $user_agent;
}
}
/**
* @return PinterestServer
*/
function PinterestServer() {
return PinterestServer::instance();
}
PinterestServer();