425 lines
15 KiB
PHP
425 lines
15 KiB
PHP
<?php
|
|
namespace PixelYourSite;
|
|
|
|
|
|
class EventsWoo extends EventsFactory {
|
|
|
|
private $events = array(
|
|
//"woo_frequent_shopper",
|
|
//"woo_vip_client",
|
|
//"woo_big_whale",
|
|
"woo_view_content",
|
|
//"woo_view_content_for_category",
|
|
"woo_view_cart",
|
|
"woo_view_category",
|
|
"woo_view_item_list",
|
|
//"woo_view_item_list_single",
|
|
//"woo_view_item_list_search",
|
|
//"woo_view_item_list_shop",
|
|
//"woo_view_item_list_tag",
|
|
"woo_add_to_cart_on_cart_page",
|
|
//"woo_add_to_cart_on_cart_page_category",
|
|
"woo_add_to_cart_on_checkout_page",
|
|
//"woo_add_to_cart_on_checkout_page_category",
|
|
"woo_initiate_checkout",
|
|
//"woo_initiate_checkout_category",
|
|
"woo_purchase",
|
|
//"woo_initiate_set_checkout_option",
|
|
//"woo_initiate_checkout_progress_f",
|
|
//"woo_initiate_checkout_progress_l",
|
|
//"woo_initiate_checkout_progress_e",
|
|
//"woo_initiate_checkout_progress_o",
|
|
"woo_remove_from_cart",
|
|
"woo_add_to_cart_on_button_click",
|
|
//"woo_affiliate",
|
|
//"woo_paypal",
|
|
//"woo_select_content_category",
|
|
//"woo_select_content_single",
|
|
//"woo_select_content_search",
|
|
//"woo_select_content_shop",
|
|
// "woo_select_content_tag",
|
|
);
|
|
public $doingAMP = false;
|
|
|
|
|
|
private static $_instance;
|
|
|
|
public static function instance() {
|
|
|
|
if ( is_null( self::$_instance ) ) {
|
|
self::$_instance = new self();
|
|
}
|
|
|
|
return self::$_instance;
|
|
|
|
}
|
|
|
|
static function getSlug() {
|
|
return "woo";
|
|
}
|
|
|
|
private function __construct() {
|
|
add_filter("pys_event_factory",[$this,"register"]);
|
|
}
|
|
|
|
function register($list) {
|
|
$list[] = $this;
|
|
return $list;
|
|
}
|
|
|
|
function getCount()
|
|
{
|
|
$size = 0;
|
|
if(!$this->isEnabled()) {
|
|
return 0;
|
|
}
|
|
foreach ($this->events as $event) {
|
|
if($this->isActive($event)){
|
|
$size++;
|
|
}
|
|
}
|
|
if(PYS()->getOption( 'woo_complete_registration_enabled' ))
|
|
$size++;
|
|
return $size;
|
|
}
|
|
|
|
function isEnabled()
|
|
{
|
|
return isWooCommerceActive();
|
|
}
|
|
|
|
function getOptions() {
|
|
|
|
if($this->isEnabled()) {
|
|
global $post;
|
|
$data = array(
|
|
'enabled' => true,
|
|
'enabled_save_data_to_orders' => PYS()->getOption('woo_enabled_save_data_to_orders'),
|
|
'addToCartOnButtonEnabled' => PYS()->getOption( 'woo_add_to_cart_enabled' ) && PYS()->getOption( 'woo_add_to_cart_on_button_click' ),
|
|
'addToCartOnButtonValueEnabled' => PYS()->getOption( 'woo_add_to_cart_value_enabled' ),
|
|
'addToCartOnButtonValueOption' => PYS()->getOption( 'woo_add_to_cart_value_option' ),
|
|
'singleProductId' => isWooCommerceActive() && is_singular( 'product' ) ? $post->ID : null,
|
|
'removeFromCartSelector' => isWooCommerceVersionGte( '3.0.0' )
|
|
? 'form.woocommerce-cart-form .remove'
|
|
: '.cart .product-remove .remove',
|
|
'addToCartCatchMethod' => PYS()->getOption('woo_add_to_cart_catch_method'),
|
|
'is_order_received_page' => is_order_received_page(),
|
|
'containOrderId' => wooIsRequestContainOrderId()
|
|
);
|
|
|
|
return $data;
|
|
} else {
|
|
return array(
|
|
'enabled' => false,
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
function isReadyForFire($event)
|
|
{
|
|
switch ($event) {
|
|
case 'woo_add_to_cart_on_button_click': {
|
|
return PYS()->getOption( 'woo_add_to_cart_enabled' )
|
|
&& PYS()->getOption( 'woo_add_to_cart_on_button_click' )
|
|
&& PYS()->getOption('woo_add_to_cart_catch_method') == "add_cart_js"; // or use in hook
|
|
}
|
|
|
|
|
|
case 'woo_remove_from_cart': {
|
|
return PYS()->getOption( 'woo_remove_from_cart_enabled') && is_cart();
|
|
}
|
|
|
|
|
|
case 'woo_purchase' : {
|
|
if(PYS()->getOption( 'woo_purchase_enabled' ) && is_order_received_page() &&
|
|
isset( $_REQUEST['key'] ) && $_REQUEST['key'] != ""
|
|
&& empty($_REQUEST['wc-api']) // if is not api request
|
|
) {
|
|
global $wp;
|
|
$order_key = sanitize_key($_REQUEST['key']);
|
|
$cache_key = 'order_id_' . $order_key;
|
|
$order_id = get_transient( $cache_key );
|
|
if (is_order_received_page() && empty($order_id) && $wp->query_vars['order-received']) {
|
|
|
|
$order_id = absint( $wp->query_vars['order-received'] );
|
|
if ($order_id) {
|
|
set_transient( $cache_key, $order_id, HOUR_IN_SECONDS );
|
|
}
|
|
}
|
|
if ( empty($order_id) ) {
|
|
$order_id = (int) wc_get_order_id_by_order_key( $order_key );
|
|
set_transient( $cache_key, $order_id, HOUR_IN_SECONDS );
|
|
}
|
|
|
|
$order = wc_get_order($order_id);
|
|
if(!$order) return false;
|
|
$status = "wc-".$order->get_status("edit");
|
|
|
|
$disabledStatuses = (array)PYS()->getOption("woo_order_purchase_disabled_status");
|
|
|
|
if( in_array($status,$disabledStatuses)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
case 'woo_view_content' : {
|
|
return PYS()->getOption( 'woo_view_content_enabled' ) && is_product();
|
|
}
|
|
case 'woo_view_cart': {
|
|
return PYS()->getOption( 'woo_view_cart_enabled' ) && is_cart();
|
|
}
|
|
case 'woo_view_category': {
|
|
return PYS()->getOption( 'woo_view_category_enabled' ) && is_tax( 'product_cat' );
|
|
}
|
|
case 'woo_view_item_list': {
|
|
return PYS()->getOption( 'woo_view_item_list_enabled' ) && is_tax( 'product_cat' );
|
|
}
|
|
case 'woo_add_to_cart_on_cart_page': {
|
|
return PYS()->getOption( 'woo_add_to_cart_enabled' ) &&
|
|
PYS()->getOption( 'woo_add_to_cart_on_cart_page' ) &&
|
|
is_cart()
|
|
&& count(WC()->cart->get_cart())>0;
|
|
}
|
|
case 'woo_add_to_cart_on_checkout_page': {
|
|
return PYS()->getOption( 'woo_add_to_cart_enabled' ) && PYS()->getOption( 'woo_add_to_cart_on_checkout_page' )
|
|
&& is_checkout() && ! is_wc_endpoint_url()
|
|
&& count(WC()->cart->get_cart())>0;
|
|
}
|
|
|
|
case 'woo_initiate_checkout': {
|
|
return PYS()->getOption( 'woo_initiate_checkout_enabled' ) && is_checkout() && ! is_wc_endpoint_url();
|
|
}
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function getEvent($event)
|
|
{
|
|
switch ($event) {
|
|
case 'woo_remove_from_cart':{
|
|
return $this->getRemoveFromCartEvents($event);
|
|
}
|
|
|
|
case 'woo_initiate_checkout':
|
|
case 'woo_add_to_cart_on_checkout_page':
|
|
case 'woo_add_to_cart_on_cart_page':
|
|
case 'woo_view_category':
|
|
case 'woo_view_item_list':
|
|
case 'woo_view_content':
|
|
return new SingleEvent($event,EventTypes::$STATIC,'woo');
|
|
case 'woo_view_cart': {
|
|
return $this->getInitCheckoutEvent($event);
|
|
}
|
|
case 'woo_add_to_cart_on_button_click':
|
|
return new SingleEvent($event,EventTypes::$DYNAMIC,'woo');
|
|
case 'woo_purchase' : {
|
|
$events = array();
|
|
$order_key = sanitize_key($_REQUEST['key']);
|
|
$cache_key = 'order_id_' . $order_key;
|
|
$order_id = get_transient( $cache_key );
|
|
global $wp;
|
|
if (is_order_received_page() && empty($order_id) && $wp->query_vars['order-received']) {
|
|
$order_id = absint( $wp->query_vars['order-received'] );
|
|
if ($order_id) {
|
|
set_transient( $cache_key, $order_id, HOUR_IN_SECONDS );
|
|
}
|
|
}
|
|
if ( empty($order_id) ) {
|
|
$order_id = (int) wc_get_order_id_by_order_key( $order_key );
|
|
set_transient( $cache_key, $order_id, HOUR_IN_SECONDS );
|
|
}
|
|
$order = wc_get_order($order_id);
|
|
if ( isWooCommerceVersionGte('3.0.0') ) {
|
|
// WooCommerce >= 3.0
|
|
if($order) {
|
|
$order->update_meta_data("_pys_purchase_event_fired",true);
|
|
$order->save();
|
|
}
|
|
|
|
} else {
|
|
// WooCommerce < 3.0
|
|
update_post_meta( $order_id, '_pys_purchase_event_fired', true );
|
|
}
|
|
$events[] = new SingleEvent($event,EventTypes::$STATIC,'woo');
|
|
|
|
// add child event complete_registration
|
|
if(PYS()->getOption( 'woo_complete_registration_enabled' ) && Facebook()->getOption("woo_complete_registration_fire_every_time") && !Facebook()->getOption("woo_complete_registration_send_from_server")) {
|
|
$events[] = new SingleEvent('woo_complete_registration',EventTypes::$STATIC,'woo');
|
|
}
|
|
|
|
|
|
return $events;
|
|
}
|
|
}
|
|
error_log("Not handle event ".$event);
|
|
return null;
|
|
}
|
|
|
|
private function isActive($event)
|
|
{
|
|
switch ($event) {
|
|
case 'woo_add_to_cart_on_button_click': {
|
|
return PYS()->getOption( 'woo_add_to_cart_enabled' ) && PYS()->getOption( 'woo_add_to_cart_on_button_click' );
|
|
}
|
|
|
|
case 'woo_remove_from_cart': {
|
|
return PYS()->getOption( 'woo_remove_from_cart_enabled') ;
|
|
}
|
|
|
|
case 'woo_purchase' : {
|
|
return PYS()->getOption( 'woo_purchase_enabled' );
|
|
}
|
|
|
|
|
|
case 'woo_view_content' : {
|
|
return PYS()->getOption( 'woo_view_content_enabled' ) ;
|
|
}
|
|
case 'woo_view_category': {
|
|
return PYS()->getOption( 'woo_view_category_enabled' ) ;
|
|
}
|
|
case 'woo_view_cart': {
|
|
return PYS()->getOption( 'woo_view_cart_enabled' );
|
|
}
|
|
case 'woo_initiate_checkout': {
|
|
return PYS()->getOption( 'woo_initiate_checkout_enabled' );
|
|
}
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function getRemoveFromCartEvents($eventId) {
|
|
$events = [];
|
|
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
|
|
$event = new SingleEvent($eventId,EventTypes::$DYNAMIC,self::getSlug());
|
|
$event->args = ['key'=>$cart_item_key,'item'=>$cart_item];
|
|
$events[]=$event;
|
|
}
|
|
return $events;
|
|
}
|
|
|
|
private function getWooCartActiveCategories($activeIds) {
|
|
$fireForCategory = array();
|
|
foreach (WC()->cart->cart_contents as $cart_item_key => $cart_item) {
|
|
$_product = wc_get_product( $cart_item['product_id'] );
|
|
if(!$_product) continue;
|
|
$productCat = $_product->get_category_ids();
|
|
foreach ($activeIds as $key => $value) {
|
|
if(in_array($key,$productCat)) {
|
|
$fireForCategory[] = $key;
|
|
}
|
|
}
|
|
}
|
|
return array_unique($fireForCategory);
|
|
}
|
|
|
|
private function getWooOrderActiveCategories($orderId,$activeIds) {
|
|
$order = new \WC_Order( $orderId );
|
|
|
|
$fireForCategory = array();
|
|
foreach ($order->get_items() as $item) {
|
|
$_product = wc_get_product( $item->get_product_id() );
|
|
if(!$_product) continue;
|
|
$productCat = $_product->get_category_ids();
|
|
foreach ($activeIds as $key => $value) {
|
|
if(in_array($key,$productCat)) { // fire initiate_checkout for all category pixel
|
|
$fireForCategory[] = $key;
|
|
}
|
|
}
|
|
}
|
|
return array_unique($fireForCategory);
|
|
}
|
|
/**
|
|
* Always returns empty customer LTV-related values to make plugin compatible with PRO version.
|
|
* Used by Pinterest add-on.
|
|
*
|
|
* @return array
|
|
*/
|
|
function getCustomerTotals($order_id = null){
|
|
return [
|
|
'ltv' => null,
|
|
'avg_order_value' => null,
|
|
'orders_count' => null,
|
|
];
|
|
}
|
|
function getInitCheckoutEvent($eventId) {
|
|
$event = new SingleEvent($eventId,EventTypes::$STATIC,self::getSlug());
|
|
|
|
$products_data = $this->getCartProductData();
|
|
if(count($products_data) == 0) return null;
|
|
|
|
$event->args = [
|
|
'products' => $products_data,
|
|
'coupon' => $this->getCartCoupon()
|
|
];
|
|
return $event;
|
|
}
|
|
function getCartProductData() {
|
|
$products_data = [];
|
|
foreach ( WC()->cart->cart_contents as $cart_item_key => $cart_item ) {
|
|
$product_id = empty($cart_item['variation_id']) ? $cart_item['product_id'] : $cart_item['variation_id'];
|
|
$product = wc_get_product($product_id);
|
|
|
|
if(!$product) continue;
|
|
|
|
if ( $product->get_type() == 'variation' ) {
|
|
$parent_id = $product->get_parent_id(); // get terms from parent
|
|
$tags = getObjectTerms( 'product_tag', $parent_id );
|
|
$categories = getObjectTermsWithId( 'product_cat', $parent_id );
|
|
$variation_name = implode("/", $product->get_variation_attributes());
|
|
} else {
|
|
$tags = getObjectTerms( 'product_tag', $product->get_id() );
|
|
$categories = getObjectTermsWithId( 'product_cat', $product->get_id() );
|
|
$variation_name = "";
|
|
}
|
|
$sale_price = -1;
|
|
|
|
|
|
$price = getWooProductPriceToDisplay($product_id, 1,$sale_price);
|
|
$product_data = [
|
|
'product_id' => $product->get_id(),
|
|
'parent_id' => $product->get_parent_id(),
|
|
'type' => $product->get_type(),
|
|
'tags' => $tags,
|
|
'categories' => $categories,
|
|
'quantity' => $cart_item['quantity'],
|
|
'price' => $price,
|
|
'total' => pys_round($cart_item['line_total']), // with coupon sale
|
|
'total_tax' => pys_round($cart_item['line_tax']),
|
|
'subtotal' => pys_round($cart_item['line_subtotal']),
|
|
'subtotal_tax' => pys_round($cart_item['line_subtotal_tax']),
|
|
'name' => $product->get_name(),
|
|
'variation_name'=> $variation_name
|
|
];
|
|
|
|
$products_data[] = $product_data;
|
|
}
|
|
|
|
return $products_data;
|
|
}
|
|
function getCartCoupon() {
|
|
$coupons = WC()->cart->get_applied_coupons();
|
|
if ( count($coupons) > 0 ) {
|
|
$firstCoupon = reset($coupons); // Получить первый элемент массива
|
|
return $firstCoupon;
|
|
}
|
|
return null;
|
|
}
|
|
function getEvents() {
|
|
return $this->events;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return EventsWoo
|
|
*/
|
|
function EventsWoo() {
|
|
return EventsWoo::instance();
|
|
}
|
|
|
|
EventsWoo();
|