fix conflict

pull/36/head
Your Name 3 weeks ago
parent 56c91ed705
commit a482be1ebd
  1. 116
      wp-content/themes/cosmopet/global-functions/multisite-functions.php
  2. 327
      wp-content/themes/cosmopet/templates/head-pixel-functions.twig
  3. 18
      wp-content/themes/cosmopet/templates/layout.twig

@ -268,6 +268,8 @@ if ($site_env->site_mode == 'production' && $site_env->site_region == 'ae') {
}
// Функция событий Meta Pixel
add_action('wp_head', function() {
global $site_env;
$show_pixel = false;
@ -282,12 +284,120 @@ add_action('wp_head', function() {
$show_pixel = true;
}
if ($show_pixel && !$site_env->is_gp_test_mode) {
// Дополнительные проверки
$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 = [
'pixel_event_type' => 'AddToCart', // или определите логику
'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);
}
});

@ -1,135 +1,332 @@
{# header_scripts_pixel.twig #}
{# templates/head-pixel-functions.twig #}
{# Проверка переменных перед рендерингом #}
{% if pixel_event_type == 'ViewContent' and product %}
{# PageView - просмотр любой страницы #}
{% if pixel_event_type == 'PageView' %}
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'ViewContent', {
content_ids: ['{{ product.id }}'],
content_type: 'product',
value: {{ product.price|number_format(2, '.', '') }},
currency: '{{ currency }}'
});
// Facebook Pixel - PageView
if (typeof fbq !== 'undefined') {
fbq('track', 'PageView');
console.log('Facebook PageView sent for page:', '{{ page_data.page_type }}');
}
// GA4 - page_view (автоматически отправляется, но можем добавить кастомные параметры)
if (typeof gtag !== 'undefined') {
gtag('event', 'page_view', {
'page_title': '{{ page_data.page_title|escape('js') }}',
'page_location': '{{ page_data.page_url|escape('js') }}',
'page_type': '{{ page_data.page_type }}'
});
</script>
{% endif %}
console.log('GA4 page_view sent for page:', '{{ page_data.page_type }}');
}
{% if pixel_event_type == 'InitiateCheckout' %}
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'InitiateCheckout');
// DataLayer для GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'page_view',
'page_title': '{{ page_data.page_title|escape('js') }}',
'page_type': '{{ page_data.page_type }}',
'page_url': '{{ page_data.page_url|escape('js') }}'
});
});
</script>
{% endif %}
{% if pixel_event_type == 'AddToCart' %}
{# ViewContent - просмотр товара #}
{% if pixel_event_type == 'ViewContent' and product %}
<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 = '{{ currency }}';
fbq('track', 'AddToCart', {
content_ids: [productId],
// Facebook Pixel - ViewContent
if (typeof fbq !== 'undefined') {
fbq('track', 'ViewContent', {
content_ids: ['{{ product.id }}'],
content_type: 'product',
value: parseFloat(priceElement) * quantity,
currency: currency
content_name: '{{ product.name|escape('js') }}',
content_category: '{{ product.category|escape('js') }}',
value: {{ product.price|number_format(2, '.', '') }},
currency: '{{ currency }}'
});
console.log('Facebook ViewContent sent for product:', '{{ product.id }}', 'value:', {{ product.price|number_format(2, '.', '') }});
}
// GA4 - view_item
if (typeof gtag !== 'undefined') {
gtag('event', 'view_item', {
currency: '{{ currency }}',
value: {{ product.price|number_format(2, '.', '') }},
items: [{
item_id: '{{ product.id }}',
item_name: '{{ product.name|escape('js') }}',
item_category: '{{ product.category|escape('js') }}',
price: {{ product.price|number_format(2, '.', '') }},
quantity: 1
}]
});
console.log('GA4 view_item sent for product:', '{{ product.id }}');
}
// DataLayer для GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_to_cart',
'event': 'view_item',
'ecommerce': {
'currency': currency,
'value': parseFloat(priceElement) * quantity,
'currency': '{{ currency }}',
'value': {{ product.price|number_format(2, '.', '') }},
'items': [{
'item_id': productId,
'item_name': productName,
'price': parseFloat(priceElement),
'quantity': quantity
'item_id': '{{ product.id }}',
'item_name': '{{ product.name|escape('js') }}',
'item_category': '{{ product.category|escape('js') }}',
'price': {{ product.price|number_format(2, '.', '') }},
'quantity': 1
}]
}
});
// Яндекс.Метрика
if (typeof yaCounter96481053 !== 'undefined') {
yaCounter96481053.reachGoal('view_item', {
'product_id': '{{ product.id }}',
'product_name': '{{ product.name|escape('js') }}',
'price': {{ product.price|number_format(2, '.', '') }},
'currency': '{{ currency }}'
});
});
console.log('Yandex view_item goal sent for product:', '{{ product.id }}');
}
});
</script>
{% endif %}
{% if pixel_event_type == 'AddPaymentInfo' %}
{# InitiateCheckout - начало оформления заказа #}
{% if pixel_event_type == 'InitiateCheckout' %}
<script>
document.addEventListener('DOMContentLoaded', function() {
fbq('track', 'AddPaymentInfo', {
value: {{ cart_total|number_format(2, '.', '') }},
currency: '{{ currency }}'
// Facebook Pixel - InitiateCheckout
if (typeof fbq !== 'undefined') {
fbq('track', 'InitiateCheckout', {
{% if cart_total %}value: {{ cart_total|number_format(2, '.', '') }},
currency: '{{ currency }}',{% endif %}
{% if content_ids %}content_ids: [{{ content_ids|map(id => '"' ~ id ~ '"')|join(',') }}],{% endif %}
content_type: 'product',
num_items: {{ cart_items|length|default(0) }}
});
console.log('Facebook InitiateCheckout sent, value:', {{ cart_total|default(0)|number_format(2, '.', '') }});
}
// GA4 - begin_checkout
if (typeof gtag !== 'undefined') {
gtag('event', 'begin_checkout', {
currency: '{{ currency }}',
value: {{ cart_total|default(0)|number_format(2, '.', '') }}{% if cart_items %},
items: {{ cart_items|json_encode()|raw }}{% endif %}
});
console.log('GA4 begin_checkout sent, value:', {{ cart_total|default(0)|number_format(2, '.', '') }});
}
// DataLayer для GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_payment_info',
'event': 'begin_checkout',
'ecommerce': {
'currency': '{{ currency }}',
'value': {{ cart_total|number_format(2, '.', '') }}
'value': {{ cart_total|default(0)|number_format(2, '.', '') }}{% if cart_items %},
'items': {{ cart_items|json_encode()|raw }}{% endif %}
}
});
// Яндекс.Метрика
if (typeof yaCounter96481053 !== 'undefined') {
yaCounter96481053.reachGoal('begin_checkout', {
'cart_total': {{ cart_total|default(0)|number_format(2, '.', '') }},
'currency': '{{ currency }}',
'items_count': {{ cart_items|length|default(0) }}
});
console.log('Yandex begin_checkout goal sent');
}
});
</script>
{% endif %}
{# Purchase - завершение покупки #}
{% if pixel_event_type == 'Purchase' and order %}
<script>
document.addEventListener('DOMContentLoaded', function() {
// Facebook Pixel - Purchase
if (typeof fbq !== 'undefined') {
fbq('track', 'Purchase', {
value: {{ order.total|number_format(2, '.', '') }},
currency: '{{ order.currency }}',
content_ids: [{{ order.content_ids|join(',') }}],
content_type: 'product'
content_ids: [{{ order.content_ids|map(id => '"' ~ id ~ '"')|join(',') }}],
content_type: 'product',
num_items: {{ order.items|length }}
});
console.log('Facebook Purchase sent, order:', '{{ order.id }}', 'value:', {{ order.total|number_format(2, '.', '') }});
}
// GA4 - purchase
if (typeof gtag !== 'undefined') {
gtag('event', 'purchase', {
transaction_id: '{{ order.id }}',
value: {{ order.total|number_format(2, '.', '') }},
currency: '{{ order.currency }}',
items: {{ order.items|json_encode()|raw }}
});
console.log('GA4 purchase sent for order:', '{{ order.id }}');
}
// DataLayer для GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'purchase',
'ecommerce': {
'transaction_id': '{{ order.id }}',
'currency': '{{ order.currency }}',
'value': {{ order.total|number_format(2, '.', '') }},
'items': {{ order.items|json_encode()|raw }}
}
});
// Яндекс.Метрика
if (typeof yaCounter96481053 !== 'undefined') {
yaCounter96481053.reachGoal('purchase', {
'order_id': '{{ order.id }}',
'order_price': {{ order.total|number_format(2, '.', '') }},
'currency': '{{ order.currency }}',
'items': {{ order.items|json_encode()|raw }}
});
console.log('Yandex purchase goal sent for order:', '{{ order.id }}');
}
});
</script>
{% endif %}
{# AddToCart - добавление в корзину (работает на всех страницах где включен) #}
{% if enable_addtocart or pixel_event_type == 'PageView' %}
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({
'ecommerce': {
'purchase': {
'actionField': {
'id': '{{ order.id }}',
'revenue': '{{ order.total|number_format(2, '.', '') }}',
'currency': '{{ order.currency }}'
},
'products': {{ order.items|json_encode()|raw }}
document.addEventListener('DOMContentLoaded', function() {
// Обработчик для ваших кнопок добавления в корзину
if (typeof jQuery !== 'undefined') {
jQuery(function($) {
// Обработчик клика по кнопкам добавления в корзину
$(document).on('click', '.single_add_to_cart_button, .ajax_add_to_cart', function(e) {
var $button = $(this);
// Небольшая задержка, чтобы товар успел добавиться
setTimeout(function() {
sendAddToCartEvent($button);
}, 500);
});
// Также оставляем стандартный обработчик WooCommerce на всякий случай
$(document.body).on('added_to_cart', function(event, fragments, cart_hash, $button) {
sendAddToCartEvent($button);
});
// Функция отправки события AddToCart
function sendAddToCartEvent($button) {
// Получаем данные о товаре
var productId = $button.data('product_id') || $button.attr('data-product_id') || '';
var quantity = parseInt($button.data('quantity') || $button.attr('data-quantity') || 1);
// Пытаемся получить название товара разными способами
var productName = $button.data('product_sku') ||
$button.closest('.product').find('.woocommerce-loop-product__title').text().trim() ||
$button.closest('.product').find('h2 a').text().trim() ||
$button.closest('.product').find('h3 a').text().trim() ||
$button.closest('.summary').find('.product_title').text().trim() ||
'Unknown Product';
// Получаем цену товара
var priceText = '';
var $product = $button.closest('.product, .summary');
// Ищем цену в разных местах
var $priceElement = $product.find('.price .woocommerce-Price-amount').last();
if ($priceElement.length === 0) {
$priceElement = $product.find('.price .amount').last();
}
if ($priceElement.length === 0) {
$priceElement = $product.find('.price').last();
}
if ($priceElement.length > 0) {
priceText = $priceElement.text() || $priceElement.html() || '';
}
// Очищаем цену от всего кроме цифр и точки
var price = parseFloat(priceText.replace(/[^0-9.,]/g, '').replace(',', '.')) || 0;
var totalValue = price * quantity;
var currency = '{{ currency }}';
console.log('AddToCart data:', {
productId: productId,
productName: productName,
price: price,
quantity: quantity,
totalValue: totalValue
});
yaCounter96481053.reachGoal('purchase', {
'order_id': '{{ order.id }}',
'order_price': '{{ order.total|number_format(2, '.', '') }}',
'currency': '{{ order.currency }}',
'items': {{ order.items|json_encode()|raw }}
if (productId && totalValue > 0) {
// Facebook Pixel - AddToCart
if (typeof fbq !== 'undefined') {
fbq('track', 'AddToCart', {
content_ids: [productId.toString()],
content_type: 'product',
content_name: productName,
value: totalValue,
currency: currency
});
console.log('Facebook AddToCart sent for product:', productId, 'value:', totalValue);
}
fbq('track', 'Purchase', {
value: {{ order.total|number_format(2, '.', '') }},
currency: '{{ order.currency }}',
content_ids: [{{ order.content_ids|join(',') }}],
content_type: 'product'
// GA4 - add_to_cart
if (typeof gtag !== 'undefined') {
gtag('event', 'add_to_cart', {
currency: currency,
value: totalValue,
items: [{
item_id: productId.toString(),
item_name: productName,
price: price,
quantity: quantity
}]
});
console.log('GA4 add_to_cart sent for product:', productId);
}
// DataLayer для GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'currency': currency,
'value': totalValue,
'items': [{
'item_id': productId.toString(),
'item_name': productName,
'price': price,
'quantity': quantity
}]
}
});
// Яндекс.Метрика
if (typeof yaCounter96481053 !== 'undefined') {
yaCounter96481053.reachGoal('add_to_cart', {
'product_id': productId.toString(),
'product_name': productName,
'price': price,
'quantity': quantity,
'value': totalValue,
'currency': currency
});
console.log('Yandex add_to_cart goal sent for product:', productId);
}
} else {
console.warn('AddToCart: Missing product data', {productId, totalValue});
}
});
});
}
});
</script>
{% endif %}

@ -10,6 +10,24 @@
{% if site_mode == 'production' %}
{{ header_scripts }}
{% endif %}
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '4085928675022207');
fbq('track', 'PageView');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=4085928675022207&ev=PageView&noscript=1"
/></noscript>
<!-- End Meta Pixel Code -->
</head>

Loading…
Cancel
Save