parent
377cabf3cc
commit
6e2a763cb7
@ -0,0 +1,380 @@ |
|||||||
|
<? |
||||||
|
|
||||||
|
/** |
||||||
|
* Добавление событий контрибуции для FP Pixel |
||||||
|
* только на боевом сайте АЕ |
||||||
|
*/ |
||||||
|
if ($site_env->site_mode == 'production' && $site_env->site_region == 'ae') { |
||||||
|
|
||||||
|
// Проверка на тестовый режим для метрик |
||||||
|
// TO_DO: дуюлирует логику is_gp_test_mode в wp-content/themes/cosmopet/global-functions/multisite-functions.php |
||||||
|
function is_gp_test_mode() |
||||||
|
{ |
||||||
|
if (isset($_GET['gp-test']) && $_GET['gp-test'] == '1') { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if (is_user_logged_in() && current_user_can('administrator')) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
add_action('wp_footer', 'add_facebook_pixel_events'); |
||||||
|
function add_facebook_pixel_events() |
||||||
|
{ |
||||||
|
if (is_gp_test_mode()) |
||||||
|
return; |
||||||
|
|
||||||
|
global $product; |
||||||
|
|
||||||
|
// 1. ViewContent |
||||||
|
if (is_product() && $product && $product->get_price() > 0) { |
||||||
|
?> |
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
fbq('track', 'ViewContent', { |
||||||
|
content_ids: ['<?php echo $product->get_id(); ?>'],
|
||||||
|
content_type: 'product', |
||||||
|
value: <?php echo $product->get_price(); ?>,
|
||||||
|
currency: '<?php echo get_woocommerce_currency(); ?>'
|
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
|
||||||
|
// 2. InitiateCheckout |
||||||
|
if (is_checkout() && !is_wc_endpoint_url('order-received') && WC()->cart && WC()->cart->get_cart_contents_count() > 0) { |
||||||
|
?> |
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
fbq('track', 'InitiateCheckout'); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
|
||||||
|
// 3. AddToCart |
||||||
|
if (is_product() || is_shop() || is_cart()) { |
||||||
|
?> |
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
jQuery(function($) { |
||||||
|
$(document.body).on('added_to_cart', function(event, fragments, cart_hash, $button) { |
||||||
|
var productId = $button.data('product_id') || ''; |
||||||
|
var quantity = $button.data('quantity') || 1; |
||||||
|
var productName = $button.data('product_sku') || |
||||||
|
$button.closest('.product').find('.woocommerce-loop-product__title').text().trim() || 'Unknown'; |
||||||
|
var priceElement = $button.closest('.product').find('.price .amount').text().replace(/[^0-9.]/g, '') || '0.00'; |
||||||
|
var currency = '<?php echo get_woocommerce_currency(); ?>';
|
||||||
|
|
||||||
|
fbq('track', 'AddToCart', { |
||||||
|
content_ids: [productId], |
||||||
|
content_type: 'product', |
||||||
|
value: parseFloat(priceElement) * quantity, |
||||||
|
currency: currency |
||||||
|
}); |
||||||
|
|
||||||
|
window.dataLayer = window.dataLayer || []; |
||||||
|
window.dataLayer.push({ |
||||||
|
'event': 'add_to_cart', |
||||||
|
'ecommerce': { |
||||||
|
'currency': currency, |
||||||
|
'value': parseFloat(priceElement) * quantity, |
||||||
|
'items': [{ |
||||||
|
'item_id': productId, |
||||||
|
'item_name': productName, |
||||||
|
'price': parseFloat(priceElement), |
||||||
|
'quantity': quantity |
||||||
|
}] |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
|
||||||
|
// 4. AddPaymentInfo |
||||||
|
if (is_checkout() && !is_wc_endpoint_url('order-received') && WC()->cart && WC()->cart->get_cart_contents_count() > 0) { |
||||||
|
$currency = get_woocommerce_currency(); |
||||||
|
$cart_total = WC()->cart->get_total('edit'); |
||||||
|
?> |
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
fbq('track', 'AddPaymentInfo', { |
||||||
|
value: <?php echo $cart_total; ?>,
|
||||||
|
currency: '<?php echo $currency; ?>'
|
||||||
|
}); |
||||||
|
|
||||||
|
window.dataLayer = window.dataLayer || []; |
||||||
|
window.dataLayer.push({ |
||||||
|
'event': 'add_payment_info', |
||||||
|
'ecommerce': { |
||||||
|
'currency': '<?php echo $currency; ?>',
|
||||||
|
'value': <?php echo $cart_total; ?> |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
|
||||||
|
// 5. Purchase |
||||||
|
if (is_wc_endpoint_url('order-received')) { |
||||||
|
$order_id = absint(get_query_var('order-received')); |
||||||
|
if (!$order_id) |
||||||
|
return; |
||||||
|
|
||||||
|
$order = wc_get_order($order_id); |
||||||
|
if (!$order || ($order->get_status() !== 'processing' && $order->get_status() !== 'completed')) |
||||||
|
return; |
||||||
|
|
||||||
|
$items = []; |
||||||
|
foreach ($order->get_items() as $item) { |
||||||
|
$product = $item->get_product(); |
||||||
|
$items[] = [ |
||||||
|
'item_id' => $product->get_id(), |
||||||
|
'item_name' => $product->get_name(), |
||||||
|
'price' => $product->get_price(), |
||||||
|
'quantity' => $item->get_quantity() |
||||||
|
]; |
||||||
|
} |
||||||
|
?> |
||||||
|
<script> |
||||||
|
document.addEventListener('DOMContentLoaded', function() { |
||||||
|
fbq('track', 'Purchase', { |
||||||
|
value: <?php echo $order->get_total(); ?>,
|
||||||
|
currency: '<?php echo $order->get_currency(); ?>',
|
||||||
|
content_ids: [<?php echo implode(',', array_column($items, 'item_id')); ?>],
|
||||||
|
content_type: 'product' |
||||||
|
}); |
||||||
|
|
||||||
|
window.dataLayer = window.dataLayer || []; |
||||||
|
window.dataLayer.push({ |
||||||
|
'event': 'purchase', |
||||||
|
'ecommerce': { |
||||||
|
'currency': '<?php echo $order->get_currency(); ?>',
|
||||||
|
'value': <?php echo $order->get_total(); ?>,
|
||||||
|
'items': <?php echo json_encode($items); ?> |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
add_action('woocommerce_thankyou', 'send_purchase_to_metrika'); |
||||||
|
function send_purchase_to_metrika($order_id) |
||||||
|
{ |
||||||
|
if (is_gp_test_mode()) |
||||||
|
return; |
||||||
|
|
||||||
|
if (!$order_id) |
||||||
|
return; |
||||||
|
|
||||||
|
$order = wc_get_order($order_id); |
||||||
|
if ($order->get_status() !== 'processing' && $order->get_status() !== 'completed') |
||||||
|
return; |
||||||
|
|
||||||
|
$items = []; |
||||||
|
foreach ($order->get_items() as $item) { |
||||||
|
$product = $item->get_product(); |
||||||
|
$items[] = [ |
||||||
|
'id' => $product->get_id(), |
||||||
|
'name' => $product->get_name(), |
||||||
|
'price' => $product->get_price(), |
||||||
|
'quantity' => $item->get_quantity() |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
$currency = $order->get_currency(); |
||||||
|
?> |
||||||
|
<script> |
||||||
|
window.dataLayer = window.dataLayer || []; |
||||||
|
dataLayer.push({ |
||||||
|
'ecommerce': { |
||||||
|
'purchase': { |
||||||
|
'actionField': { |
||||||
|
'id': '<?php echo $order_id; ?>',
|
||||||
|
'revenue': '<?php echo $order->get_total(); ?>',
|
||||||
|
'currency': '<?php echo $currency; ?>'
|
||||||
|
}, |
||||||
|
'products': <?php echo json_encode($items); ?> |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
yaCounter96481053.reachGoal('purchase', { |
||||||
|
'order_id': '<?php echo $order_id; ?>',
|
||||||
|
'order_price': '<?php echo $order->get_total(); ?>',
|
||||||
|
'currency': '<?php echo $currency; ?>',
|
||||||
|
'items': <?php echo json_encode($items); ?> |
||||||
|
}); |
||||||
|
|
||||||
|
fbq('track', 'Purchase', { |
||||||
|
value: <?php echo $order->get_total(); ?>,
|
||||||
|
currency: '<?php echo $currency; ?>',
|
||||||
|
content_ids: [<?php echo implode(',', array_column($items, 'id')); ?>],
|
||||||
|
content_type: 'product' |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<?php |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Функция событий Meta Pixel |
||||||
|
|
||||||
|
add_action('wp_head', function () { |
||||||
|
global $site_env; |
||||||
|
$show_pixel = false; |
||||||
|
|
||||||
|
// Для продакшена |
||||||
|
if ($site_env->site_mode === 'production' && $site_env->site_region === 'ae') { |
||||||
|
$show_pixel = true; |
||||||
|
} |
||||||
|
|
||||||
|
// Для тестовых стендов AE |
||||||
|
if ($site_env->site_mode === 'develope' && $site_env->site_region === 'ae') { |
||||||
|
$show_pixel = true; |
||||||
|
} |
||||||
|
|
||||||
|
// Дополнительные проверки |
||||||
|
$skip_tracking = false; |
||||||
|
|
||||||
|
// Исключаем админов |
||||||
|
if (current_user_can('administrator')) { |
||||||
|
$skip_tracking = true; |
||||||
|
} |
||||||
|
|
||||||
|
// Исключаем gp-test режим |
||||||
|
if ($site_env->is_gp_test_mode) { |
||||||
|
$skip_tracking = true; |
||||||
|
} |
||||||
|
|
||||||
|
// Исключаем если есть параметр gp-test=1 в URL |
||||||
|
if (isset($_GET['gp-test']) && $_GET['gp-test'] == '1') { |
||||||
|
$skip_tracking = true; |
||||||
|
} |
||||||
|
|
||||||
|
if ($show_pixel && !$skip_tracking) { |
||||||
|
$context = [ |
||||||
|
'currency' => get_woocommerce_currency(), |
||||||
|
]; |
||||||
|
|
||||||
|
// Определяем тип страницы и подготавливаем данные |
||||||
|
if (is_product()) { |
||||||
|
// Страница товара - ViewContent |
||||||
|
global $product; |
||||||
|
if ($product && $product instanceof WC_Product) { |
||||||
|
$context['pixel_event_type'] = 'ViewContent'; |
||||||
|
$context['product'] = [ |
||||||
|
'id' => $product->get_id(), |
||||||
|
'name' => $product->get_name(), |
||||||
|
'price' => floatval($product->get_price()), |
||||||
|
'sku' => $product->get_sku(), |
||||||
|
'category' => wp_get_post_terms($product->get_id(), 'product_cat', ['fields' => 'names'])[0] ?? '', |
||||||
|
]; |
||||||
|
} |
||||||
|
} elseif (is_checkout() && !is_order_received_page()) { |
||||||
|
// Страница чекаута - InitiateCheckout |
||||||
|
$context['pixel_event_type'] = 'InitiateCheckout'; |
||||||
|
if (WC()->cart && !WC()->cart->is_empty()) { |
||||||
|
$context['cart_total'] = floatval(WC()->cart->get_total('edit')); |
||||||
|
$context['cart_items'] = []; |
||||||
|
$context['content_ids'] = []; |
||||||
|
|
||||||
|
foreach (WC()->cart->get_cart() as $cart_item) { |
||||||
|
$product = $cart_item['data']; |
||||||
|
if ($product && $product instanceof WC_Product) { |
||||||
|
$item_data = [ |
||||||
|
'item_id' => $product->get_id(), |
||||||
|
'item_name' => $product->get_name(), |
||||||
|
'price' => floatval($product->get_price()), |
||||||
|
'quantity' => intval($cart_item['quantity']), |
||||||
|
'category' => wp_get_post_terms($product->get_id(), 'product_cat', ['fields' => 'names'])[0] ?? '', |
||||||
|
]; |
||||||
|
$context['cart_items'][] = $item_data; |
||||||
|
$context['content_ids'][] = $product->get_id(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} elseif (is_order_received_page()) { |
||||||
|
// Страница благодарности - Purchase |
||||||
|
$order_id = get_query_var('order-received'); |
||||||
|
if ($order_id) { |
||||||
|
$order = wc_get_order($order_id); |
||||||
|
if ($order && $order instanceof WC_Order) { |
||||||
|
$context['pixel_event_type'] = 'Purchase'; |
||||||
|
$order_items = []; |
||||||
|
$content_ids = []; |
||||||
|
|
||||||
|
foreach ($order->get_items() as $item) { |
||||||
|
if ($item instanceof WC_Order_Item_Product) { |
||||||
|
$product = $item->get_product(); |
||||||
|
if ($product && $product instanceof WC_Product) { |
||||||
|
$order_items[] = [ |
||||||
|
'item_id' => $product->get_id(), |
||||||
|
'item_name' => $product->get_name(), |
||||||
|
'price' => floatval($item->get_total() / $item->get_quantity()), |
||||||
|
'quantity' => intval($item->get_quantity()), |
||||||
|
'category' => wp_get_post_terms($product->get_id(), 'product_cat', ['fields' => 'names'])[0] ?? '', |
||||||
|
]; |
||||||
|
$content_ids[] = $product->get_id(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$context['order'] = [ |
||||||
|
'id' => $order->get_id(), |
||||||
|
'total' => floatval($order->get_total()), |
||||||
|
'currency' => $order->get_currency(), |
||||||
|
'items' => $order_items, |
||||||
|
'content_ids' => $content_ids, |
||||||
|
'order_key' => $order->get_order_key(), |
||||||
|
]; |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
// Все остальные страницы - PageView + подготовка для AddToCart |
||||||
|
$context['pixel_event_type'] = 'PageView'; |
||||||
|
$context['enable_addtocart'] = true; // Включаем обработчик AddToCart |
||||||
|
|
||||||
|
// Дополнительные данные для PageView |
||||||
|
global $wp_query; |
||||||
|
$context['page_data'] = [ |
||||||
|
'page_title' => wp_get_document_title(), |
||||||
|
'page_url' => home_url(add_query_arg(array(), $wp_query->request)), |
||||||
|
'page_type' => get_page_type(), |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
// Рендерим шаблон |
||||||
|
\Timber\Timber::render('templates/head-pixel-functions.twig', $context); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
function get_page_type() |
||||||
|
{ |
||||||
|
if (is_home() || is_front_page()) { |
||||||
|
return 'home'; |
||||||
|
} elseif (is_shop()) { |
||||||
|
return 'shop'; |
||||||
|
} elseif (is_product_category()) { |
||||||
|
return 'category'; |
||||||
|
} elseif (is_product_tag()) { |
||||||
|
return 'tag'; |
||||||
|
} elseif (is_search()) { |
||||||
|
return 'search'; |
||||||
|
} elseif (is_cart()) { |
||||||
|
return 'cart'; |
||||||
|
} elseif (is_account_page()) { |
||||||
|
return 'account'; |
||||||
|
} else { |
||||||
|
return 'other'; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
<? |
||||||
|
|
||||||
|
add_filter('wpseo_canonical', '__return_false'); |
||||||
|
add_filter('wpseo_opengraph_url', '__return_false'); |
||||||
|
add_filter('wpseo_add_x_default_hreflang', '__return_false'); |
||||||
|
add_filter('wpseo_disable_adjacent_rel_links', '__return_true'); |
||||||
|
|
||||||
|
/* Добавление canonical-ссылок */ |
||||||
|
add_action('wp_head', function () { |
||||||
|
if (!is_admin()) { |
||||||
|
static $canonical_added = false; |
||||||
|
if ($canonical_added) |
||||||
|
return; |
||||||
|
$canonical_added = true; |
||||||
|
$current_url = strtok(trailingslashit(home_url($_SERVER['REQUEST_URI'])), '?'); |
||||||
|
echo '<link rel="canonical" href="' . esc_url($current_url) . '" />' . "\n"; |
||||||
|
} |
||||||
|
}); |
Loading…
Reference in new issue