שימוש בהמלצות מוצרים באמצעות API עבור Shopify

ההמלצות מוצרים של פלאשי עוזרות להגדיל את המכירות באמצעות המלצות מוצרים חכמות שמתבססות על כל פרטי המבקרים והלקוחות החוזרים באתר.

באמצעות ה API תוכלו להגיע למקסימום יכולות בעיצוב והתאמות לאתר שלכם ולעשות כמעט כל דבר שתרצו באמצעות מספר קודים פשוטים.

בשופיפיי יש לבצע שלב מקדים לפני שעובדים על הקוד שהוא בעצם לקבל גישה לקרוא את המוצרים שלכם

באמצעות Storefront API בסרטון אני מסביר את הנושא בהרחבה.

מהניסיון שלנו עם חברות פיתוח שונות, הערכת השעות לעבודה מהסוג הזה היא בין 5-8 שעות פיתוח, חשוב לקחת את זה בחשבון בהחלטה על שיטת היישום. תמיד ניתן לבצע הטמעה באמצעות DIV ולא באמצעות API.

מהניסיון שלנו עם חברות פיתוח שונות, הערכת השעות לתהליך ההטמעה הוא בין 5-8 שעות פיתוח, חשוב לקחת את זה בחשבון בהחלטה על שיטת היישום. תמיד ניתן לבצע הטמעה באמצעות DIV ולא באמצעות API.

שלב ההטמעה

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

להלן המחלקה עם כל האפשרויות שיצרנו עבורכם.

<script>
  window.FlashyProductRecommendations = class FlashyProductRecommendations {
    constructor(popupId, productsContainer = 'home-recommendations') {
      this.popupId = popupId;
      this.container = document.getElementById(productsContainer);
    }

    // Fetch product recommendations
    async fetchRecommendations() {
      try {
        const recommendations = await flashy.recommendations.get(this.popupId);
        return this.getItemIds(recommendations.products);
      } catch (error) {
        console.warning("Error fetching flashy recommendations:", error);
      }
    }

    // Fetch product details from Shopify
    async fetchProductDetails(productNumericIds) {
      const productGlobalIds = productNumericIds.map(id => `gid://shopify/Product/${id}`);

      const productQuery = `
        query ProductsQuery($ids: [ID!]!) {
          nodes(ids: $ids) {
            ... on Product {
              id
              title
              handle
              descriptionHtml
              createdAt
              productType
              vendor
              tags
              images(first: 2) {
                edges {
                  node {
                    id
                    originalSrc
                    altText
                  }
                }
              }
              variants(first: 2) {
                edges {
                  node {
                    id
                    title
                    priceV2 {
                      amount
                      currencyCode
                    }
                    availableForSale
                    sku
                    compareAtPriceV2 {
                      amount
                      currencyCode
                    }
                  }
                }
              }
            }
          }
        }
      `;

      try {
        const response = await fetch(`//${window.Shopify.shop}/api/2022-01/graphql.json`, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'X-Shopify-Storefront-Access-Token': 'your-storefront-access-token',
          },
          body: JSON.stringify({
            query: productQuery,
            variables: { ids: productGlobalIds },
          }),
        });

        const { data, errors } = await response.json();

        if (errors) {
          console.error('GraphQL Errors:', errors);
          return null;
        }

        return data.nodes;
      } catch (error) {
        console.error('Fetch Error:', error);
        return null;
      }
    }

    getProductTemplate(product) {
      return `
        <div class="product-item">
          <img src="${product.images.edges[0].node.originalSrc}" alt="Product Image" class="product-image">
          <div class="product-title">${product.title}</div>
          <a href="/products/${product.handle}" class="product-button view-product">View Product</a>
          <button class="product-button add-to-cart">Add to Cart</button>
        </div>
      `;
    }


    // Render product details
    async displayProducts() {
      const recommendations = await this.fetchRecommendations();
      const productsDetails = await this.fetchProductDetails(recommendations);

      productsDetails.forEach(product => {
        const productHTML = this.getProductTemplate(product);
        // Insert the product HTML directly into the container
        this.container.insertAdjacentHTML('beforeend', productHTML);

        const lastProductItem = this.container.lastElementChild;

        // Add event listener for the Click or Add to Cart events
        const links = lastProductItem.querySelectorAll('a'); // Selects all <a> tags within the item

        // For any links events
        links.forEach(link => {
          link.addEventListener('click', (e) => {
            this.trackProductInteraction('amplify:Click', this.getItemId(product.id));
          });
        });

        // If you are using Add To Cart directly from the product
        // lastProductItem.querySelector('.add-to-cart').addEventListener('click', (e) => {
        //   this.trackProductInteraction('amplify:AddToCart', this.getItemId(product.id), product.variants[0].price);
        // });
      });
    }

    // Track product interactions
    trackProductInteraction(eventType, productId, value = null, currency = 'ILS') {
      const eventData = {
        'popup_id': this.popupId,
        'content_ids': [productId]
      };

      if (eventType === 'amplify:AddToCart') {
        eventData.value = value; // Assuming value is provided for Add to Cart events
        eventData.currency = currency;
      }

      flashy(eventType, eventData);
    }

    getItemIds(obj) {
      const ids = [];
      for (const key in obj) {
        if (obj.hasOwnProperty(key) && typeof obj[key] === 'object' && obj[key] !== null && 'id' in obj[key]) {
          ids.push(obj[key].id);
        }
      }
      return ids;
    }

    getItemId(globalId) {
      return globalId.split('/').pop();
    }

    // Initialize the recommendations display
    init() {
      this.displayProducts();
    }
  }
</script>

הטמעה כללית בעמוד הבית

אם בחרנו להטמיע את האלמנט בעמוד הבית אנחנו יכולים ישירות להשתמש בקוד הבא במיקום שאנחנו רוצים, שימו לב שאנחנו נציג את המוצרים ב DIV עם ה ID שנקרא "home-recommendations" לכן חובה לייצר אותו כי לשם יופיעו המוצרים

לפני שאנחנו מוסיפים את הקוד הזה אנחנו צריכים לייצר DIV במיקום שנבחר עם ה ID home-recommendations - זה המיקום שיופיעו ההמלצות מוצרים.
<script>
  window.addEventListener('onFlashy', function() {
    (new FlashyProductRecommendations(__WEBLAYER_ID__, 'home-recommendations')).init();
  });
</script>

הטמעה בעמודי מוצר

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

לפני שאנחנו מוסיפים את הקוד הזה אנחנו צריכים לייצר DIV במיקום שנבחר עם ה ID complementary-products - זה המיקום שיופיעו ההמלצות מוצרים.
<script>
  window.addEventListener('ViewContent', function() {
    (new FlashyProductRecommendations(__WEBLAYER_ID__, 'complementary-products')).init();
  });
</script>

הטמעה בהתאם למוצרים שיש ללקוח בסל

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

<script>
  window.addEventListener('UpdateCart', function() {
    (new FlashyProductRecommendations(__WEBLAYER_ID__, 'complementary-cart')).init();
  });
</script>

הטמעה בעמודי קטגוריה

אם אנחנו רוצים להוסיף המלצות לעמוד קטגוריה, גם כאן נצטרך לוודא שהעמוד קטגוריה נטען ואז להציג את ההמלצות מוצרים:

<script>
  window.addEventListener('ViewCategory', function() {
    (new FlashyProductRecommendations(__WEBLAYER_ID__, 'collection-recommendations')).init();
  });
</script>
לפני שאנחנו מוסיפים את הקוד הזה אנחנו צריכים לייצר DIV במיקום שנבחר עם ה ID collection-recommendations - זה המיקום שיופיעו ההמלצות מוצרים.