בית › מרכז הידע › מדידה › מדריכי יישום
מדריך יישום · קודמתקדם

מדידת add_to_cart ב-WooCommerce (ולמה אין פתרון אחד לכולם)

מדריך יישום · לקהל טכני · 13 דקות

add_to_cart הוא האירוע שהכי משתנה בין חנויות, ובדיוק לכן הוא מעניין. אין קוד אחד שמתאים לכל אתר, ולכן המדריך מתחיל בבחירת אסטרטגיית המדידה: איך מזהים איזה flow יש באתר, ואז מיישמים את השיטה ל-WooCommerce קלאסי עם AJAX עם קוד להעתקה.

חדש כאן? מומלץ להתחיל במפת הארכיטקטורה, שמציגה את כל שכבות המדידה במבט אחד לפני שנכנסים למימוש.
חשוב לדעת: הקוד במדריך נכתב לפי ה-API הרשמי של WordPress ו-WooCommerce, ונבדק על התקנה סטנדרטית. אתרים עם Checkout Blocks, תבניות מותאמות, הרחבות מסחר או תוספי צד שלישי עשויים לדרוש התאמות. השתמשו בקוד כבסיס ליישום, לא כהבטחה שהוא יתאים לכל אתר ללא שינויים. לפני הטמעה באתר חי, בדקו בסביבת פיתוח או ב-Staging.
איפה אנחנו נמצאים במערכת · פרק 16 מתוך 20
אתרמדידהניהול לידיםאוטומציהעסקהOffline Conversionלמידת האלגוריתם
מסלול קריאה מומלץ: Data Layerרכישההוספה לעגלה (יישום) (כאן)
רמת קושימתקדם
זמן יישוםכ-25 דקות
נבדק עםWordPress 6.x · WooCommerce 9.x · PHP 8.2+
תואםWooCommerce Classic · AJAX Add to Cart (לולאה)
לא תואםCheckout Blocks · בילדרים · Quick View (דורשים התאמה)
ידע נדרשPHP · jQuery · GTM · GA4
עודכןאוגוסט 2026
בקצרה: אין דרך אחת למדוד add_to_cart, כי יש עשרות דרכים להוסיף לעגלה. קודם מזהים איזה אירוע החנות משדרת, ואז, למקרה הנפוץ (WooCommerce קלאסי עם AJAX בלולאה), משתמשים בפילטר woocommerce_loop_add_to_cart_args ובאירוע added_to_cart כדי לדחוף add_to_cart ל-dataLayer. ל-Blocks, בילדרים ו-Quick View נדרשות התאמות.

למה add_to_cart שונה מכל אירוע אחר

בניגוד ל-purchase ול-begin_checkout, שקורים בטעינת עמוד ברורה, ל-add_to_cart אין דרך אחת. יש עשרות דרכים שבהן לקוח מוסיף מוצר לעגלה, וכל אחת עובדת אחרת. הנה מפה מהירה של איפה הקוד במדריך נתמך, ואיפה תידרש התאמה:

סוג ההוספה לעגלהנתמך במדריךהערות
WooCommerce Classic (AJAX)נתמך במלואו
עמוד מוצר בודדדורש מימוש אחר
Cart & Checkout Blocksדורש API אחר
Elementor / Bricksתלוי במימוש
Flatsome / Woodmartלבדוק אירועים
Quick Viewמאזין ייעודי
לפני שבוחרים פתרון, צריך להבין איך החנות שלכם באמת מוסיפה מוצר לעגלה. הקוד במדריך מכסה את המקרה הנפוץ ביותר, WooCommerce קלאסי עם AJAX בלולאה, ומהווה בסיס טוב. לשאר ההקשרים נדרשות התאמות לפי הטבלה.

לפני שמתחילים

דרישות מקדימות

  • הושלמה כבר מדידת purchase ו-begin_checkout, GTM ו-GA4 מחוברים.
  • ההגדרה Enable AJAX add to cart buttons on archives פעילה (Settings ← Products).
  • גישה ל-functions.php של Child Theme או תוסף Code Snippets.

איך בודקים איזה אירוע החנות משדרת

לפני שכותבים קוד, כדאי לוודא שהחנות באמת משדרת את האירוע added_to_cart. פותחים DevTools, עוברים ל-Console, ומריצים:

DevTools · Console
// DevTools -> Console
jQuery(document.body).on('added_to_cart', function () {
  console.log('event fired');
});

עכשיו מוסיפים מוצר לעגלה מעמוד קטגוריה. אם מודפס event fired, הקוד במדריך מתאים לחנות. אם לא הודפס כלום, החנות משתמשת ב-flow אחר, וצריך לחפש את האירוע הנכון לפי הטבלה למעלה.

שימו לב: אם החנות אינה משתמשת ב-jQuery (למשל ב-Cart & Checkout Blocks), הבדיקה הזו לא תעזור, משום שהאירוע added_to_cart כלל אינו קיים שם.

1הקוד: הוספה לעגלה (Classic AJAX)

שני חלקים: קודם מצמידים את פרטי המוצר לכפתור ההוספה בלולאה (דרך הפילטר הרשמי woocommerce_loop_add_to_cart_args), ואז מאזינים לאירוע added_to_cart ודוחפים את האירוע ל-dataLayer.

מה הקוד עושה?

  1. מצמיד נתוני מוצר לכפתור ההוספה לעגלה.
  2. ממתין לאישור מ-WooCommerce שהמוצר נוסף בהצלחה.
  3. דוחף אירוע add_to_cart ל-dataLayer.
  4. GTM קורא את האירוע ושולח אותו ל-GA4.
functions.php (Child Theme) או Code Snippet
/**
 * 1) Attach product data to the AJAX add-to-cart buttons in product loops
 *    (shop / category), so the browser can read it when the item is added.
 *    We attach the data to the button itself so that, on the added_to_cart
 *    event, we can read it WITHOUT making another AJAX request.
 */
add_filter( 'woocommerce_loop_add_to_cart_args', 'doffice_ga4_atc_button_data', 10, 2 );

function doffice_ga4_atc_button_data( $args, $product ) {
    $categories = wp_get_post_terms( $product->get_id(), 'product_cat', array( 'fields' => 'names' ) );

    $args['attributes']['data-ga4-id']       = $product->get_sku() ? $product->get_sku() : $product->get_id();
    $args['attributes']['data-ga4-name']     = $product->get_name();
    // The price the customer SAW at click time. Usually the right value for
    // add_to_cart. If the price changes only AFTER adding (coupons, dynamic
    // pricing, currency switchers), read the final price from the cart instead.
    $args['attributes']['data-ga4-price']    = wc_get_price_to_display( $product );
    $args['attributes']['data-ga4-category'] = ! empty( $categories ) ? $categories[0] : '';

    return $args;
}

/**
 * 2) When WooCommerce confirms the AJAX add (jQuery "added_to_cart" event),
 *    push a GA4 "add_to_cart" event to the dataLayer.
 */
add_action( 'wp_enqueue_scripts', 'doffice_ga4_atc_script' );

function doffice_ga4_atc_script() {
    if ( is_admin() || ! function_exists( 'WC' ) ) {
        return;
    }

    wp_register_script( 'doffice-ga4-atc', '', array( 'jquery' ), null, true );
    wp_enqueue_script( 'doffice-ga4-atc' );
    // Despite the name, wp_localize_script() is used here to pass data from PHP
    // to JavaScript (the store currency), NOT for translation.
    wp_localize_script( 'doffice-ga4-atc', 'dofficeGA4', array(
        'currency' => get_woocommerce_currency(),
    ) );

    $js = <<<'JS'
window.dataLayer = window.dataLayer || [];
jQuery(function ($) {
  // Fires after a SUCCESSFUL AJAX add-to-cart from a product loop button.
  $(document.body).on('added_to_cart', function (e, fragments, cart_hash, $button) {
    if (!$button || !$button.data('ga4-name')) return;
    var qty   = parseInt($button.data('quantity'), 10) || 1;
    var price = parseFloat($button.data('ga4-price')) || 0;
    window.dataLayer.push({ ecommerce: null });
    window.dataLayer.push({
      event: 'add_to_cart',
      ecommerce: {
        currency: dofficeGA4.currency,
        // add_to_cart represents the value of THIS action,
        // NOT the current total cart value.
        value: Math.round(price * qty * 100) / 100,
        items: [{
          item_id: String($button.data('ga4-id')),
          item_name: $button.data('ga4-name'),
          item_category: $button.data('ga4-category') || '',
          price: price,
          quantity: qty
        }]
      }
    });
  });
});
JS;

    wp_add_inline_script( 'doffice-ga4-atc', $js );
}

למה מצמידים נתונים לכפתור? כדי שברגע שאירוע added_to_cart נורה, נוכל לקרוא את שם המוצר, המחיר והמזהה ישירות מהכפתור, בלי לבצע קריאת AJAX נוספת לשרת. כך האירוע נשאר מיידי, בלי להמתין לתגובה נוספת מהשרת.

הערה למי שפחות מכיר WordPress: למרות השם, wp_localize_script() משמש כאן להעברת נתונים מ-PHP ל-JavaScript (המטבע), ולא לצורך תרגום.

לגבי המחיר: GA4 מתאר את פעולת ההוספה לעגלה, ולכן ברוב החנויות נכון לשלוח את המחיר שהיה מוצג בזמן הלחיצה (wc_get_price_to_display). אם המחיר משתנה רק לאחר ההוספה (למשל קופונים או Dynamic Pricing), יש למדוד את המחיר הסופי מתוך העגלה.

טעות נפוצה: ערך הפעולה מול ערך העגלה. באירוע add_to_cart שולחים את הערך של הפעולה הזו (מחיר × כמות), לא את ערך כל העגלה. הרבה מפתחים טועים כאן ושולחים את סכום העגלה כולה.

2לחבר את זה ב-GTM

אותה שיטה כמו בשאר האירועים: טריגר Custom Event בשם add_to_cart, ותגית GA4 Event עם אותו שם, Send Ecommerce data מ-Data Layer, מחוברת לטריגר. משתמשים באותו משתנה ecommerce מהמדריכים הקודמים. שומרים ו-Publish.

3אימות ו-Debug

נכנסים לעמוד קטגוריה, מוסיפים מוצר, ובקונסול מסננים את האירוע:

Console, בעמוד החנות
window.dataLayer.filter(e => e.event === "add_to_cart")

// Expected after adding a product from the shop / category page:
[
  {
    event: "add_to_cart",
    ecommerce: {
      currency: "ILS",
      value: 349.90,
      items: [
        { item_id: "SKU-1", item_name: "...", item_category: "...", price: 349.90, quantity: 1 }
      ]
    }
  }
]

ואז מוודאים ב-GA4 DebugView שהאירוע נכנס עם items, value ו-currency תקינים.

גבולות ומלכודות

  • מחיר לאחר ההוספה, אם Dynamic Pricing, קופונים או Currency Switcher משנים את המחיר רק בעגלה, קראו אותו מהעגלה ולא מהכפתור.
  • מוצרים משתנים, שנוספים מעמוד המוצר ולא מהלולאה, ולכן נמדדים שם (עם item_variant). אין טעם לנסות להכריח את הקוד הזה לעבוד גם שם.
  • Checkout Blocks / בילדרים, שבהם added_to_cart לא נורה, ונדרש מאזין אחר.
  • חסר item_list_name, שם הרשימה שממנה המוצר נוסף (למשל "מבצעי קיץ" או "קטגוריית נעליים"). ניתן להוסיף אותו כהרחבה אופציונלית.

איפה זה במסלול, ומה הלאה

add_to_cart פותח את משפך המסחר, ועכשיו שלושת השלבים מחוברים:

add_to_cart
begin_checkout
purchase

הצעדים הבאים באותה שיטה: אירוע view_item (צפייה במוצר) שפותח את המשפך אפילו מוקדם יותר, וחיבור Meta Pixel + CAPI לאותם אירועים עם event_id משותף לדדופליקציה.

מושגים שהוזכרו במדריך

add_to_cartdataLayeradded_to_cart (jQuery)woocommerce_loop_add_to_cart_argswp_localize_scriptAJAX Add to CartCart & Checkout Blockswc_get_price_to_displayitem_variantitem_list_nameGA4 DebugView
שאלות נפוצות

שאלות ותשובות על היישום

למה add_to_cart מסובך יותר מ-purchase?
כי יש עשרות דרכים להוסיף מוצר לעגלה (לולאה, עמוד מוצר, Quick View, Blocks, בילדרים), וכל אחת עם flow אחר. אין קוד אחד שמתאים לכולן. הקוד כאן מכסה את המקרה הנפוץ ביותר, WooCommerce קלאסי עם AJAX בלולאה.
למה לא פשוט להאזין ללחיצה על הכפתור?
כי לחיצה אינה מבטיחה שהמוצר באמת נוסף לעגלה. הכפתור יכול להיכשל, להיות חסום במלאי, לדרוש בחירת וריאציה או להחזיר שגיאה. האירוע added_to_cart נורה רק לאחר שההוספה הצליחה, ולכן הוא נקודת המדידה הנכונה.
למה לא למדוד add_to_cart דרך GTM בלבד?
כי GTM יכול לזהות לחיצות, אבל לא תמיד יודע אם ההוספה באמת הצליחה. מדידה שמבוססת על האירוע added_to_cart של WooCommerce מודדת רק פעולות שהסתיימו בהצלחה.
איך אני יודע איזו שיטה מתאימה לחנות שלי?
מריצים את בדיקת ה-Console מהמדריך. אם האירוע added_to_cart נורה, הקוד כאן מתאים. אם לא, האתר משתמש ב-flow אחר (Blocks, בילדר או כפתור מותאם) ויידרש מימוש אחר.
המחיר שנשלח מדויק?
הוא המחיר שהלקוח ראה לפני הלחיצה, שברוב המקרים זה הערך הנכון. אם יש Dynamic Pricing או קופונים שמשנים את המחיר רק אחרי ההוספה, קוראים את המחיר הסופי מהעגלה.
מה עם מוצרים עם וריאציות?
מוצר משתנה נוסף בדרך כלל מעמוד המוצר, לא מהלולאה, ולכן מודדים אותו שם (עם item_variant). אין טעם לנסות להכריח את הקוד הזה לעבוד גם שם.
הפרק הבא · פרק 17 מתוך 20Meta CAPI (הטמעה)המדריך המלא להטמעת המרות מטא מהשרת

רוצים משפך מסחר מלא ומדויק?

נחבר את כל אירועי המסחר, מהוספה לעגלה ועד הרכישה, ל-GA4 ולמטא, בהתאמה לאיך שהחנות שלכם באמת עובדת (כולל Blocks ובילדרים), כדי שתראו בדיוק היכן הלקוחות נופלים.

בואו נדבר
כולל add_to_cart, begin_checkout ו-purchase, GTM, GA4, ו-Meta Pixel + CAPI עם Event ID.