first commit

This commit is contained in:
2024-11-10 21:08:49 +01:00
commit 0d932ce5ee
14455 changed files with 2567501 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
<?php
namespace PixelYourSite;
/**
* Class FDPEvent
* @property string event_name
* @property string content_type
* @property string trigger_type
* @property string trigger_value
* */
class FDPEvent
{
private $data = array();
public function __get( $key ) {
if(isset($this->data[$key])) return $this->data[$key];
return "";
}
public function __set( $key,$value ){
$this->data[$key] = $value;
}
public function hasTimeWindow() {
return false;
}
public function getTimeWindow() {
return 0;
}
}

View File

@@ -0,0 +1,379 @@
<?php
namespace PixelYourSite;
use PixelYourSite;
use PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\Event;
use PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\UserData;
use PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\CustomData;
use PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\Content;
defined('ABSPATH') or die('Direct access not allowed');
class ServerEventHelper {
/**
* @param SingleEvent $event
* @return Event | null
*/
public static function mapEventToServerEvent($event) {
$eventData = $event->getData();
$eventData = EventsManager::filterEventParams($eventData,$event->getCategory(),[
'event_id'=>$event->getId(),
'pixel'=>Facebook()->getSlug()
]);
$eventName = $eventData['name'];
$eventParams = $eventData['params'];
$eventId = $event->payload['eventID'];
$wooOrder = isset($event->payload['woo_order']) ? $event->payload['woo_order'] : null;
$eddOrder = isset($event->payload['edd_order']) ? $event->payload['edd_order'] : null;
if(!$eventId) return null;
$user_data = ServerEventHelper::getUserData($wooOrder,$eddOrder)
->setClientIpAddress(self::getIpAddress())
->setClientUserAgent(self::getHttpUserAgent());
$fbp = self::getFbp();
$fbc = self::getFbc();
if(!$fbp && $wooOrder) {
$fbp = ServerEventHelper::getFbStatFromOrder('fbp',$wooOrder);
}
if(!$fbc && $wooOrder) {
$fbc = ServerEventHelper::getFbStatFromOrder('fbc',$wooOrder);
}
$user_data->setFbp($fbp);
$user_data->setFbc($fbc);
$customData = self::paramsToCustomData($eventParams);
$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'];
}
}
$event = (new Event())
->setEventName($eventName)
->setEventTime(time())
->setEventId($eventId)
->setEventSourceUrl($uri)
->setActionSource("website")
->setCustomData($customData)
->setUserData($user_data);
return $event;
}
/**
* @param $key
* @param $wooOrder
* @return string|null
*/
private static function getFbStatFromOrder($key,$wooOrder) {
$order = wc_get_order( $wooOrder );
if($order) {
$fbCookie = $order->get_meta('pys_fb_cookie',true);
if($fbCookie){
if(!empty($fbCookie[$key])) {
return $fbCookie[$key];
}
}
}
return null;
}
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;
}
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;
}
public static function getFbp() {
$fbp = null;
if (!empty($_COOKIE['_fbp'])) {
$fbp = $_COOKIE['_fbp'];
}
return $fbp;
}
public static function getFbc() {
$fbc = null;
if (!empty($_COOKIE['_fbc'])) {
$fbc = $_COOKIE['_fbc'];
}
return $fbc;
}
private static function getUserData($wooOrder = null,$eddOrder = null) {
$userData = new UserData();
/**
* 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 ) {
if ( PixelYourSite\isWooCommerceVersionGte( '3.0.0' ) ) {
if($order->get_billing_postcode()) {
$userData->setZipCode($order->get_billing_postcode());
}
if($order->get_billing_country()) {
$userData->setCountryCode(strtolower($order->get_billing_country()));
}
if($order->get_billing_email()) {
$userData->setEmail($order->get_billing_email());
}
if($order->get_billing_phone()) {
$userData->setPhone($order->get_billing_phone());
}
if($order->get_billing_first_name()) {
$userData->setFirstName($order->get_billing_first_name());
}
if($order->get_billing_last_name()) {
$userData->setLastName($order->get_billing_last_name());
}
if($order->get_billing_city()) {
$userData->setCity($order->get_billing_city());
}
if($order->get_billing_state()) {
$userData->setState($order->get_billing_state());
}
} else {
if($order->billing_postcode) {
$userData->setZipCode($order->billing_postcode);
}
$userData->setCountryCode(strtolower($order->billing_country));
$userData->setEmail($order->billing_email);
$userData->setPhone($order->billing_phone);
$userData->setFirstName($order->billing_first_name);
$userData->setLastName($order->billing_last_name);
$userData->setCity($order->billing_city);
$userData->setState($order->billing_state);
}
} else {
return ServerEventHelper::getRegularUserData();
}
} else {
if(PixelYourSite\isEddActive() && isEventEnabled( 'edd_purchase_enabled' ) &&
($eddOrder || edd_is_success_page()) ) {
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->setEmail($email);
}
if(isset($user_info['first_name']))
$userData->setFirstName($user_info['first_name']);
if(isset($user_info['last_name']))
$userData->setLastName($user_info['last_name']);
} else {
return ServerEventHelper::getRegularUserData();
}
}
return $userData;
}
private static function getRegularUserData() {
$user = wp_get_current_user();
$userData = new UserData();
if ( $user->ID ) {
// get user regular data
$userData->setFirstName($user->get( 'user_firstname' ));
$userData->setLastName($user->get( 'user_lastname' ));
$userData->setEmail($user->get( 'user_email' ));
/**
* Add common WooCommerce Advanced Matching params
*/
if ( PixelYourSite\isWooCommerceActive() ) {
// if first name is not set in regular wp user meta
if (empty($userData->getFirstName())) {
$userData->setFirstName($user->get('billing_first_name'));
}
// if last name is not set in regular wp user meta
if (empty($userData->getLastName())) {
$userData->setLastName($user->get('billing_last_name'));
}
if($user->get('billing_phone'))
$userData->setPhone($user->get('billing_phone'));
if($user->get('billing_city'))
$userData->setCity($user->get('billing_city'));
if($user->get('billing_state'))
$userData->setState($user->get('billing_state'));
if($user->get('shipping_country'))
$userData->setCountryCode(strtolower($user->get('shipping_country')));
if($user->get('billing_postcode')) {
$userData->setZipCode($user->get('billing_postcode'));
}
}
} else {
// $userData->setFirstName("undefined");
// $userData->setLastName("undefined");
// $userData->setEmail("undefined");
}
return $userData;
}
static function paramsToCustomData($data) {
if(isset($data['contents']) && is_array($data['contents'])) {
$contents = array();
foreach ($data['contents'] as $c) {
$contents[] = new Content([
'product_id' => $c['id'],
'quantity' => $c['quantity']
]);
}
$data['contents'] = $contents;
} else {
$data['contents'] = array();
}
$customData = new CustomData($data);
$customProperties = array();
if(isset($data['category_name'])) {
$customData->setContentCategory($data['category_name']);
}
$custom_values = ['event_action','download_type','download_name','download_url','target_url','text','trigger','traffic_source','plugin','user_role','event_url','page_title',"post_type",'post_id','categories','tags','video_type',
'video_id','video_title','event_trigger','link_type','tag_text',"URL",
'form_id','form_class','form_submit_label','transactions_count','average_order',
'shipping_cost','tax','total','shipping','coupon_used','post_category','landing_page'];
$adding_custom_field = array();
$eventsCustom = EventsCustom()->getEvents();
foreach ($eventsCustom as $event)
{
$fbCustomEvents = $event->getFacebookCustomParams();
foreach ($fbCustomEvents as $paramKey => $params)
{
if(!in_array($params['name'], $custom_values))
{
$adding_custom_field[] = $params['name'];
}
}
}
$result_custom_values = array_merge($custom_values, $adding_custom_field);
foreach ($result_custom_values as $val) {
if(isset($data[$val])){
$customProperties[$val] = $data[$val];
}
}
$customData->setCustomProperties($customProperties);
return $customData;
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace PixelYourSite;
defined('ABSPATH') or die('Direct access not allowed');
class FacebookAsyncTask extends \WP_Async_Task {
protected $action = 'pys_send_server_event';
protected function prepare_data($data) {
try {
if (!empty($data)) {
if(empty($this->_body_data)) {
return array('data' => base64_encode(serialize($data)));
} else {
//error_log("_body_data".print_r($this->_body_data,true));
$oldData = unserialize(base64_decode($this->_body_data['data']));
$data = [array_merge($oldData[0],$data[0])];
return array('data' => base64_encode(serialize($data)));
}
}
} catch (\Exception $ex) {
error_log($ex);
}
return array();
}
protected function run_action() {
try {
$data = unserialize(base64_decode($_POST['data']));
$events = is_array($data[0]) ? $data[0] : $data ;
if (empty($events)) {
return;
}
foreach ($events as $event) {
FacebookServer()->sendEvent($event["pixelIds"],$event["event"]);
}
}
catch (\Exception $ex) {
error_log($ex);
}
}
}

View File

@@ -0,0 +1,333 @@
<?php
namespace PixelYourSite;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/*
* @see https://github.com/facebook/facebook-php-business-sdk
* This class use for sending facebook server events
*/
require_once PYS_FREE_PATH . '/modules/facebook/facebook-server-async-task.php';
require_once PYS_FREE_PATH . '/modules/facebook/PYSServerEventHelper.php';
use PYS_PRO_GLOBAL\FacebookAds\Api;
use PYS_PRO_GLOBAL\FacebookAds\Http\Exception\RequestException;
use PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\EventRequest;
class FacebookServer {
private static $_instance;
private $isEnabled;
private $hours = ['00-01', '01-02', '02-03', '03-04', '04-05', '05-06', '06-07', '07-08',
'08-09', '09-10', '10-11', '11-12', '12-13', '13-14', '14-15', '15-16', '16-17',
'17-18', '18-19', '19-20', '20-21', '21-22', '22-23', '23-24'
];
private $access_token;
private $testCode;
private $isDebug;
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __construct() {
$this->isEnabled = Facebook()->enabled() && Facebook()->isServerApiEnabled();
$this->isDebug = PYS()->getOption( 'debug_enabled' );
if($this->isEnabled) {
add_action( 'woocommerce_checkout_update_order_meta',array($this,'saveFbTagsInOrder'),10, 2);
add_action( 'wp_ajax_pys_api_event',array($this,"catchAjaxEvent"));
add_action( 'wp_ajax_nopriv_pys_api_event', array($this,"catchAjaxEvent"));
add_action( 'woocommerce_remove_cart_item', array($this, 'trackRemoveFromCartEvent'), 10, 2);
add_action( 'woocommerce_add_to_cart', array($this, 'trackAddToCartEvent'), 40, 4);
//add_action( 'woocommerce_order_status_completed', array( $this, 'completed_purchase' ) );
// initialize the s2s event async task
new FacebookAsyncTask();
}
}
/**
* Send event in shutdown hook (not work in ajax)
* @param SingleEvent[] $events
*/
public function sendEventsAsync($events) {
$serverEvents = [];
foreach ($events as $event) {
$ids = $event->payload['pixelIds'];
$serverEvents[] = [
"pixelIds" => $ids,
"event" => ServerEventHelper::mapEventToServerEvent($event)
];
}
if(count($serverEvents) > 0) {
do_action('pys_send_server_event', $serverEvents);
}
}
/**
* Send Event Now
*
* @param SingleEvent[] $events
*/
public function sendEventsNow($events) {
foreach ($events as $event) {
$serverEvent = ServerEventHelper::mapEventToServerEvent($event);
$ids = $event->payload['pixelIds'];
$this->sendEvent($ids,$serverEvent);
}
}
/**
* Tracks a completed purchase
*
* @param int $order_id the order ID
*/
function completed_purchase($order_id) {
$order = wc_get_order($order_id);
if(!$order
|| $order->get_meta( '_pys_purchase_event_fired', true )
|| !PYS()->getOption( 'woo_purchase_enabled' )) {
return;
}
add_filter("pys_woo_checkout_order_id",function () use ($order_id) {return $order_id;});
$event = EventsWoo()->getEvent('woo_purchase');
if ( $event == null ) {
return;
}
$events = Facebook()->generateEvents($event);
foreach ($events as $singleEvent) {
if(isset($_COOKIE['pys_landing_page']))
$singleEvent->addParams(['landing_page'=>$_COOKIE['pys_landing_page']]);
}
$this->sendEventsNow($events);
}
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")
{
PYS()->getLog()->debug('trackAddToCartEvent send fb server with out browser event');
if( !empty($variation_id)
&& $variation_id > 0
&& ( !Facebook()->getOption( 'woo_variable_as_simple' )
|| ( Facebook()->getSlug() == "facebook"
&& !Facebook\Helpers\isDefaultWooContentIdLogic()
)
)
) {
$_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];
add_filter('pys_conditional_post_id', function($id) use ($product_id) { return $product_id; });
$events = Facebook()->generateEvents($event);
remove_all_filters('pys_conditional_post_id');
foreach ($events as $singleEvent) {
if(isset($_COOKIE['pys_landing_page']))
$singleEvent->addParams(['landing_page'=>$_COOKIE['pys_landing_page']]);
if(isset($_COOKIE["pys_fb_event_id"])) {
$singleEvent->payload['eventID'] = json_decode(stripslashes($_COOKIE["pys_fb_event_id"]))->AddToCart;
}
}
$this->sendEventsAsync($events);
}
}
/**
* @param String $cart_item_key
* @param \WC_Cart $cart
*/
function trackRemoveFromCartEvent ($cart_item_key,$cart) {
$eventId = 'woo_remove_from_cart';
$url = $_SERVER['HTTP_HOST'].strtok($_SERVER["REQUEST_URI"], '?');
$postId = url_to_postid($url);
$cart_id = wc_get_page_id( 'cart' );
$item = $cart->get_cart_item($cart_item_key);
if(PYS()->getOption( 'woo_remove_from_cart_enabled') && $cart_id==$postId) {
PYS()->getLog()->debug('trackRemoveFromCartEvent send fb server with out browser event');
$event = new SingleEvent("woo_remove_from_cart",EventTypes::$STATIC,'woo');
$event->args=['item'=>$item];
$events = Facebook()->generateEvents($event);
foreach ($events as $singleEvent) {
$singleEvent->addParams(getStandardParams());
if(isset($_COOKIE['pys_landing_page'])){
$singleEvent->addParams(['landing_page'=>$_COOKIE['pys_landing_page']]);
}
if(isset($_COOKIE["pys_fb_event_id"])) {
$singleEvent->payload['eventID'] = json_decode(stripslashes($_COOKIE["pys_fb_event_id"]))->RemoveFromCart;
}
}
$this->sendEventsAsync($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 catchAjaxEvent() {
PYS()->getLog()->debug('catchAjaxEvent send fb 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 \PYS_PRO_GLOBAL\FacebookAds\Object\ServerSide\Event $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 = Facebook()->getApiToken();
$this->testCode = Facebook()->getApiTestCode();
}
foreach($pixel_Ids as $pixel_Id) {
if(empty($this->access_token[$pixel_Id])) continue;
$event->setEventId($event->getEventId());
$api = Api::init(null, null, $this->access_token[$pixel_Id],false);
/**
* filter pys_before_send_fb_server_event
* Help add custom options or get data from event before send
* FacebookAds\Object\ServerSide\Event $event
* String $pixel_Id
* String EventId
*/
$event = apply_filters("pys_before_send_fb_server_event",$event,$pixel_Id,$event->getEventId());
$request = (new EventRequest($pixel_Id))->setEvents([$event]);
$request->setPartnerAgent("dvpixelyoursite");
if(!empty($this->testCode[$pixel_Id])) {
$request->setTestEventCode($this->testCode[$pixel_Id]);
}
PYS()->getLog()->debug('Send FB server event',$request);
try{
$response = $request->execute();
PYS()->getLog()->debug('Response from FB server',$response);
} catch (\Exception $e) {
if($e instanceof RequestException) {
PYS()->getLog()->error('Error send FB server event '.$e->getErrorUserMessage(),$e->getResponse());
} else {
PYS()->getLog()->error('Error send FB server event',$e);
}
}
}
}
public function saveFbTagsInOrder($order_id, $data) {
$pysData = [];
$pysData['fbc'] = ServerEventHelper::getFbc();
$pysData['fbp'] = ServerEventHelper::getFbp();
$order = wc_get_order($order_id);
if($order) {
$order->update_meta_data("pys_fb_cookie",$pysData);
$order->save();
}
}
}
/**
* @return FacebookServer
*/
function FacebookServer() {
return FacebookServer::instance();
}
FacebookServer();

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,585 @@
<?php
namespace PixelYourSite\Facebook\Helpers;
use PixelYourSite;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* @return array
*/
function getAdvancedMatchingParams() {
$params = array();
$user = wp_get_current_user();
if ( $user->ID ) {
// get user regular data
$params['fn'] = $user->get( 'user_firstname' );
$params['ln'] = $user->get( 'user_lastname' );
$params['em'] = $user->get( 'user_email' );
}
/**
* Add common WooCommerce Advanced Matching params
*/
if ( PixelYourSite\isWooCommerceActive() ) {
// if first name is not set in regular wp user meta
if ( empty( $params['fn'] ) ) {
$params['fn'] = $user->get( 'billing_first_name' );
}
// if last name is not set in regular wp user meta
if ( empty( $params['ln'] ) ) {
$params['ln'] = $user->get( 'billing_last_name' );
}
$params['ph'] = $user->get( 'billing_phone' );
$params['ct'] = $user->get( 'billing_city' );
$params['st'] = $user->get( 'billing_state' );
$params['country'] = $user->get( 'billing_country' );
/**
* Add purchase WooCommerce Advanced Matching params
*/
if ( is_order_received_page() && isset( $_REQUEST['key'] ) && $_REQUEST['key'] != "" ) {
$key = sanitize_key($_REQUEST['key']);
$order_id = wc_get_order_id_by_order_key($key );
$order = wc_get_order( $order_id );
if ( $order ) {
if ( PixelYourSite\isWooCommerceVersionGte( '3.0.0' ) ) {
$params = array(
'em' => $order->get_billing_email(),
'ph' => $order->get_billing_phone(),
'fn' => $order->get_billing_first_name(),
'ln' => $order->get_billing_last_name(),
'ct' => $order->get_billing_city(),
'st' => $order->get_billing_state(),
'country' => $order->get_billing_country(),
);
} else {
$params = array(
'em' => $order->billing_email,
'ph' => $order->billing_phone,
'fn' => $order->billing_first_name,
'ln' => $order->billing_last_name,
'ct' => $order->billing_city,
'st' => $order->billing_state,
'country' => $order->billing_country,
);
}
}
}
}
/**
* Add common EDD Advanced Matching params
*/
if ( PixelYourSite\isEddActive()) {
/**
* Add purchase EDD Advanced Matching params
*/
// skip payment confirmation page
if ( edd_is_success_page() && ! isset( $_GET['payment-confirmation'] ) ) {
global $edd_receipt_args;
$session = edd_get_purchase_session();
if ( isset( $_GET['payment_key'] ) ) {
$payment_key = urldecode( $_GET['payment_key'] );
} else if ( $session ) {
$payment_key = $session['purchase_key'];
} elseif ( $edd_receipt_args && $edd_receipt_args['payment_key'] ) {
$payment_key = $edd_receipt_args['payment_key'];
}
if ( isset( $payment_key ) ) {
$payment_id = edd_get_purchase_id_by_key( $payment_key );
if ( $payment = edd_get_payment( $payment_id ) ) {
// if first name is not set in regular wp user meta
if ( empty( $params['fn'] ) ) {
$params['fn'] = $payment->user_info['first_name'];
}
// if last name is not set in regular wp user meta
if ( empty( $params['ln'] ) ) {
$params['ln'] = $payment->user_info['last_name'];
}
$params['ct'] = $payment->address['city'];
$params['st'] = $payment->address['state'];
$params['country'] = $payment->address['country'];
}
}
}
}
$sanitized = array();
foreach ( $params as $key => $value ) {
if ( ! empty( $value ) ) {
$sanitized[ $key ] = sanitizeAdvancedMatchingParam( $value, $key );
}
}
return $sanitized;
}
function sanitizeAdvancedMatchingParam( $value, $key ) {
// prevents fatal error when mb_string extension not enabled
if ( function_exists( 'mb_strtolower' ) ) {
$value = mb_strtolower( $value );
} else {
$value = strtolower( $value );
}
if ( $key == 'ph' ) {
$value = preg_replace( '/\D/', '', $value );
} elseif ( $key == 'em' ) {
$value = preg_replace( '/[^a-z0-9._+-@]+/i', '', $value );
} else {
$value = preg_replace( '/[^a-z]/', '', $value );
}
return $value;
}
/**
* @param string $product_id
*
* @return array
*/
function getFacebookWooProductContentId( $product_id ) {
if ( PixelYourSite\Facebook()->getOption( 'woo_content_id' ) == 'product_sku' ) {
$content_id = get_post_meta( $product_id, '_sku', true );
} else {
$content_id = $product_id;
}
$prefix = PixelYourSite\Facebook()->getOption( 'woo_content_id_prefix' );
$suffix = PixelYourSite\Facebook()->getOption( 'woo_content_id_suffix' );
$value = $prefix . $content_id . $suffix;
$value = array( $value );
// Facebook for WooCommerce plugin integration
if ( ! isDefaultWooContentIdLogic() ) {
$product = wc_get_product($product_id);
if ( ! $product ) {
return $value;
}
$ids = array(
get_fb_plugin_retailer_id($product)
);
$value = array_values( array_filter( $ids ) );
}
return $value;
}
function get_fb_plugin_retailer_id( $woo_product ) {
if(!$woo_product) return "";
$woo_id = $woo_product->get_id();
// Call $woo_product->get_id() instead of ->id to account for Variable
// products, which have their own variant_ids.
return $woo_product->get_sku() ? $woo_product->get_sku() . '_' .
$woo_id : 'wc_post_id_'. $woo_id;
}
function getFacebookWooCartItemId( $item ) {
if ( ! PixelYourSite\Facebook()->getOption( 'woo_variable_as_simple' ) && isset( $item['variation_id'] ) && $item['variation_id'] !== 0 ) {
$product_id = $item['variation_id'];
} else {
$product_id = $item['product_id'];
}
// Facebook for WooCommerce plugin integration
if ( ! isDefaultWooContentIdLogic() ) {
if ( isset( $item['variation_id'] ) && $item['variation_id'] !== 0 ) {
$product_id = $item['variation_id'];
} else {
$product_id = $item['product_id'];
}
}
return $product_id;
}
/**
* Adds "content_name" and "category_name" params
*/
function getWooCustomAudiencesOptimizationParams( $post_id ) {
$post = get_post( $post_id );
$params = array(
'content_name' => '',
'category_name' => '',
);
if ( ! $post ) {
return $params;
}
if ( $post->post_type == 'product_variation' ) {
$post_id = $post->post_parent; // get terms from parent
}
$params['content_name'] = $post->post_title;
$params['category_name'] = implode( ', ', PixelYourSite\getObjectTerms( 'product_cat', $post_id ) );
return $params;
}
function getWooSingleAddToCartParams( $_product_id, $qty = 1 ) {
$params = array();
$product = wc_get_product($_product_id);
if(!$product) return array();
$product_ids = array();
$isGrouped = $product->get_type() == "grouped";
if($isGrouped) {
$product_ids = $product->get_children();
} else {
$product_ids[] = $_product_id;
}
$params['content_type'] = 'product';
$params['content_ids'] = array();
$params['contents'] = array();
// content_name, category_name, tags
$params['tags'] = implode( ', ', PixelYourSite\getObjectTerms( 'product_tag', $_product_id ) );
$params = array_merge( $params, getWooCustomAudiencesOptimizationParams( $_product_id ) );
// currency, value
if ( PixelYourSite\PYS()->getOption( 'woo_add_to_cart_value_enabled' ) ) {
$value_option = PixelYourSite\PYS()->getOption( 'woo_add_to_cart_value_option' );
$global_value = PixelYourSite\PYS()->getOption( 'woo_add_to_cart_value_global', 0 );
$params['value'] = PixelYourSite\getWooEventValue( $value_option, $global_value,100, $_product_id,$qty );
$params['currency'] = get_woocommerce_currency();
}
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if(!$product) continue;
if($product->get_type() == "variable" && $isGrouped) {
continue;
}
$content_id = getFacebookWooProductContentId( $product_id );
$params['content_ids'] = array_merge($params['content_ids'],$content_id);
// contents
if ( isDefaultWooContentIdLogic() ) {
// Facebook for WooCommerce plugin does not support new Dynamic Ads parameters
$params['contents'][] = array(
'id' => (string) reset( $content_id ),
'quantity' => $qty,
//'item_price' => PixelYourSite\getWooProductPriceToDisplay( $product_id ),// remove because price need send only with currency
);
}
}
return $params;
}
function getWooCartParams( $context = 'cart' ) {
$params['content_type'] = 'product';
$content_ids = array();
$content_names = array();
$content_categories = array();
$tags = array();
$contents = array();
foreach ( WC()->cart->cart_contents as $cart_item_key => $cart_item ) {
$product_id = getFacebookWooCartItemId( $cart_item );
$content_id = getFacebookWooProductContentId( $product_id );
$content_ids = array_merge( $content_ids, $content_id );
// content_name, category_name, tags
$custom_audiences = getWooCustomAudiencesOptimizationParams( $product_id );
$content_names[] = $custom_audiences['content_name'];
$content_categories[] = $custom_audiences['category_name'];
$cart_item_tags = PixelYourSite\getObjectTerms( 'product_tag', $product_id );
$tags = array_merge( $tags, $cart_item_tags );
// raw product id
$_product_id = empty( $cart_item['variation_id'] ) ? $cart_item['product_id'] : $cart_item['variation_id'];
// contents
$contents[] = array(
'id' => (string) reset( $content_id ),
'quantity' => $cart_item['quantity'],
//'item_price' => PixelYourSite\getWooProductPriceToDisplay( $_product_id ),
);
}
$params['content_ids'] = ( $content_ids );
$params['content_name'] = implode( ', ', $content_names );
$params['category_name'] = implode( ', ', $content_categories );
// contents
if ( isDefaultWooContentIdLogic() ) {
// Facebook for WooCommerce plugin does not support new Dynamic Ads parameters
$params['contents'] = ( $contents );
}
$tags = array_unique( $tags );
$tags = array_slice( $tags, 0, 100 );
$params['tags'] = implode( ', ', $tags );
if ( $context == 'InitiateCheckout' ) {
$params['num_items'] = WC()->cart->get_cart_contents_count();
$value_enabled_option = 'woo_initiate_checkout_value_enabled';
$value_option_option = 'woo_initiate_checkout_value_option';
$value_global_option = 'woo_initiate_checkout_value_global';
$params['subtotal'] = PixelYourSite\getWooCartSubtotal();
} else { // AddToCart
$value_enabled_option = 'woo_add_to_cart_value_enabled';
$value_option_option = 'woo_add_to_cart_value_option';
$value_global_option = 'woo_add_to_cart_value_global';
}
if ( PixelYourSite\PYS()->getOption( $value_enabled_option ) ) {
$value_option = PixelYourSite\PYS()->getOption( $value_option_option );
$global_value = PixelYourSite\PYS()->getOption( $value_global_option, 0 );
$params['value'] = PixelYourSite\getWooEventValueCart( $value_option, $global_value );
$params['currency'] = get_woocommerce_currency();
}
return $params;
}
function isFacebookForWooCommerceActive() {
return class_exists( 'WC_Facebookcommerce' );
}
function isDefaultWooContentIdLogic() {
return ! isFacebookForWooCommerceActive() || PixelYourSite\Facebook()->getOption( 'woo_content_id_logic' ) != 'facebook_for_woocommerce';
}
/**
* EASY DIGITAL DOWNLOADS
*/
function getFacebookEddDownloadContentId( $download_id ) {
if ( PixelYourSite\PYS()->getOption( 'edd_content_id' ) == 'download_sku' ) {
$content_id = get_post_meta( $download_id, 'edd_sku', true );
} else {
$content_id = $download_id;
}
$prefix = PixelYourSite\PYS()->getOption( 'edd_content_id_prefix' );
$suffix = PixelYourSite\PYS()->getOption( 'edd_content_id_suffix' );
return $prefix . $content_id . $suffix;
}
/**
* Adds "content_name" and "category_name" params
*/
function getEddCustomAudiencesOptimizationParams( $post_id ) {
$post = get_post( $post_id );
$params = array(
'content_name' => '',
'category_name' => '',
);
if ( ! $post ) {
return $params;
}
$params['content_name'] = $post->post_title;
$params['category_name'] = implode( ', ', PixelYourSite\getObjectTerms( 'download_category', $post_id ) );
return $params;
}
function getFDPViewContentEventParams() {
$tagsArray = wp_get_post_tags();
$catArray = get_the_category();
$tags = "";
if(is_array($tagsArray)) {
$tags = implode(", ",$tagsArray);
}
$func = function($value) {
return $value->cat_name;
};
$catArray = array_map($func,$catArray);
$categories = implode(", ",$catArray);
$params = array(
'content_name' => get_the_title(),
'content_ids' => get_the_ID(),
'tags' => $tags,
'categories' => $categories
);
return $params;
}
function getFDPViewCategoryEventParams() {
global $wp_query;
$func = function($value) {
return $value->ID;
};
$ids = array_map($func,$wp_query->posts);
$params = array(
'content_name' => single_term_title('', 0),
'content_ids' => ($ids)
);
return $params;
}
function getFDPAddToCartEventParams() {
$tagsArray = wp_get_post_tags();
$catArray = get_the_category();
$tags = "";
if(is_array($tagsArray)) {
$tags = implode(", ",$tagsArray);
}
$func = function($value) {
return $value->cat_name;
};
$catArray = array_map($func,$catArray);
$categories = implode(", ",$catArray);
$params = array(
'content_name' => get_the_title(),
'content_ids' => get_the_ID(),
'tags' => $tags,
'categories' => $categories,
'value' => 0
);
return $params;
}
function getFDPPurchaseEventParams() {
$tagsArray = wp_get_post_tags();
$catArray = get_the_category();
$tags = "";
if(is_array($tagsArray)) {
$tags = implode(", ",$tagsArray);
}
$func = function($value) {
return $value->cat_name;
};
$catArray = array_map($func,$catArray);
$categories = implode(", ",$catArray);
$params = array(
'content_name' => get_the_title(),
'content_ids' => get_the_ID(),
'tags' => $tags,
'categories' => $categories,
'value' => 0
);
return $params;
}
function getCompleteRegistrationOrderParams() {
$params = array();
$order_key = sanitize_key( $_REQUEST['key']);
$order_id = (int) wc_get_order_id_by_order_key( $order_key );
$order = new \WC_Order( $order_id );
$value_option = PixelYourSite\Facebook()->getOption( 'woo_complete_registration_custom_value' );
$global_value = PixelYourSite\Facebook()->getOption( 'woo_complete_registration_global_value', 0 );
$percents_value = PixelYourSite\Facebook()->getOption( 'woo_complete_registration_percent_value', 100 );
$params['value'] = PixelYourSite\getWooEventValueOrder( $value_option, $order, $global_value, $percents_value );
$params['currency'] = get_woocommerce_currency();
return $params;
}

View File

@@ -0,0 +1,76 @@
{
"enabled": true,
"pixel_id": "",
"advanced_matching_enabled": false,
"remove_metadata": false,
"general_event_enabled": true,
"comment_event_enabled": true,
"download_event_enabled": true,
"form_event_enabled": true,
"woo_variable_as_simple": false,
"woo_content_id": "product_id",
"woo_content_id_prefix": "",
"woo_content_id_suffix": "",
"woo_content_id_logic": "default",
"woo_purchase_enabled": true,
"woo_initiate_checkout_enabled": true,
"woo_remove_from_cart_enabled": true,
"woo_add_to_cart_enabled": true,
"woo_view_content_enabled": true,
"woo_view_category_enabled": true,
"edd_content_id": "download_id",
"edd_content_id_prefix": "",
"edd_content_id_suffix": "",
"edd_purchase_enabled": true,
"edd_initiate_checkout_enabled": true,
"edd_remove_from_cart_enabled": true,
"edd_add_to_cart_enabled": true,
"edd_view_content_enabled": true,
"edd_view_category_enabled": true,
"fdp_content_type" : "product",
"fdp_view_content_enabled": false,
"fdp_view_category_enabled": false,
"fdp_add_to_cart_enabled": false,
"fdp_add_to_cart_event_fire_scroll": "50",
"fdp_purchase_enabled": false,
"fdp_purchase_event_fire" : "scroll_pos",
"fdp_purchase_event_fire_scroll": "90",
"fdp_purchase_event_fire_css": "",
"fdp_pixel_id": "",
"fdp_use_own_pixel_id": false,
"fdp_currency" : "USD",
"fdp_add_to_cart_value" : "0",
"fdp_purchase_value" : "0",
"use_server_api": false,
"server_event_use_ajax": true,
"server_access_api_token": "",
"test_api_event_code": "",
"test_api_event_code_expiration_at": "",
"complete_registration_event_enabled" : true,
"woo_complete_registration_fire_every_time": false,
"woo_complete_registration_use_custom_value": true,
"woo_complete_registration_custom_value": "price",
"woo_complete_registration_percent_value": "",
"woo_complete_registration_global_value": "",
"woo_complete_registration_custom_value_old": "",
"woo_complete_registration_send_from_server": true,
"verify_meta_tag": "",
"automatic_event_form_enabled": true,
"automatic_event_signup_enabled": true,
"automatic_event_login_enabled": true,
"automatic_event_download_enabled": true,
"automatic_event_comment_enabled": true,
"automatic_event_scroll_enabled": true,
"automatic_event_time_on_page_enabled": true,
"automatic_event_search_enabled": true
}

View File

@@ -0,0 +1,75 @@
{
"enabled": "checkbox",
"pixel_id": "array",
"advanced_matching_enabled": "checkbox",
"remove_metadata": "checkbox",
"general_event_enabled": "checkbox",
"comment_event_enabled": "checkbox",
"download_event_enabled": "checkbox",
"form_event_enabled": "checkbox",
"woo_variable_as_simple": "checkbox",
"woo_content_id": "select",
"woo_content_id_prefix": "text",
"woo_content_id_suffix": "text",
"woo_content_id_logic": "radio",
"woo_purchase_enabled": "checkbox",
"woo_initiate_checkout_enabled": "checkbox",
"woo_remove_from_cart_enabled": "checkbox",
"woo_add_to_cart_enabled": "checkbox",
"woo_view_content_enabled": "checkbox",
"woo_view_category_enabled": "checkbox",
"edd_content_id": "select",
"edd_content_id_prefix": "text",
"edd_content_id_suffix": "text",
"edd_purchase_enabled": "checkbox",
"edd_initiate_checkout_enabled": "checkbox",
"edd_remove_from_cart_enabled": "checkbox",
"edd_add_to_cart_enabled": "checkbox",
"edd_view_content_enabled": "checkbox",
"edd_view_category_enabled": "checkbox",
"fdp_content_type" : "select",
"fdp_view_content_enabled": "checkbox",
"fdp_view_category_enabled": "checkbox",
"fdp_add_to_cart_enabled": "checkbox",
"fdp_add_to_cart_event_fire_scroll": "text",
"fdp_purchase_enabled": "checkbox",
"fdp_purchase_event_fire" : "select",
"fdp_purchase_event_fire_scroll": "text",
"fdp_purchase_event_fire_css": "text",
"fdp_pixel_id": "text",
"fdp_use_own_pixel_id": "checkbox",
"fdp_currency" : "select",
"fdp_add_to_cart_value" : "text",
"fdp_purchase_value" : "text",
"use_server_api": "checkbox",
"server_event_use_ajax": "checkbox",
"server_access_api_token": "array",
"test_api_event_code": "array",
"test_api_event_code_expiration_at": "array",
"complete_registration_event_enabled" : "checkbox",
"woo_complete_registration_percent_value": "text",
"woo_complete_registration_global_value": "text",
"woo_complete_registration_fire_every_time": "checkbox",
"woo_complete_registration_use_custom_value": "checkbox",
"woo_complete_registration_custom_value": "radio",
"woo_complete_registration_custom_value_old": "radio",
"woo_complete_registration_send_from_server": "checkbox",
"verify_meta_tag": "array_textarea",
"automatic_event_form_enabled": "checkbox",
"automatic_event_signup_enabled": "checkbox",
"automatic_event_login_enabled": "checkbox",
"automatic_event_download_enabled": "checkbox",
"automatic_event_comment_enabled": "checkbox",
"automatic_event_scroll_enabled": "checkbox",
"automatic_event_time_on_page_enabled": "checkbox",
"automatic_event_search_enabled": "checkbox"
}

View File

@@ -0,0 +1,69 @@
<?php
namespace PixelYourSite;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
?>
<h2 class="section-title">Facebook Settings</h2>
<!-- General -->
<div class="card card-static">
<div class="card-header">
General
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col">
<?php Facebook()->render_switcher_input( 'enabled' ); ?>
<h4 class="switcher-label">Enable Meta Pixel (formerly Facebook Pixel)</h4>
</div>
</div>
<div class="row">
<div class="col">
<?php Facebook()->render_switcher_input( 'advanced_matching_enabled' ); ?>
<h4 class="switcher-label">Enable Advanced Matching</h4>
<div class="alert alert-primary mt-3">Because of a Facebook error, when Advanced Matching is ON, Custom
Audiences based on the pixel
will not show the size number ("Size: -1", or "Size Unavailable"). They will still work fine for
retargeting or Lookalike Audiences. Details <a href="https://www.pixelyoursite
.com/facebook-audience-size-not-available" target="_blank">here</a>.</div>
</div>
</div>
<div class="row">
<div class="col">
<?php Facebook()->render_switcher_input( 'remove_metadata' ); ?>
<h4 class="switcher-label">Remove Facebook default events</h4>
</div>
</div>
<!--
<div class="row">
<div class="col">
<?php Facebook()->render_switcher_input( 'send_external_id_demo',false,true ); ?>
<h4 class="switcher-label">Send external id</h4>
<?php renderProBadge();?>
</div>
</div>
-->
</div>
</div>
<div class="panel">
<div class="row">
<div class="col text-center">
<p class="mb-0">Fire more events and parameters and improve your ads performance.
<br><a href="https://www.pixelyoursite.com/facebook-pixel-plugin?utm_source=pixelyoursite-free-plugin&utm_medium=plugin&utm_campaign=free-plugin-facebook-settings"
target="_blank">Find more about the PRO Meta Pixel (formerly Facebook Pixel) implementation</a></p>
</div>
</div>
</div>
<hr>
<div class="row justify-content-center">
<div class="col-4">
<button class="btn btn-block btn-save">Save Settings</button>
</div>
</div>