Người quan sát từ bỏ giỏ hàng


8

Tôi cần giúp đỡ!!!

Tôi đang tạo một mô-đun tích hợp với nền tảng khác thông qua API. Tôi đã có Trình quan sát hoặc Sự kiện để đăng ký khách hàng ( customer_register_success ), hoàn tất giao dịch mua hàng ( checkout_onepage_controll_success_action ).

Sự giúp đỡ tôi cần là làm thế nào tôi có thể đưa Người quan sát đến các giỏ hàng bị bỏ rơi?, Hoặc phương pháp tốt nhất để có được thông tin đó và gửi thông qua API.


2
định nghĩa của bạn về xe đẩy bỏ là gì?
Philipp Sander

Khi khách hàng thêm sản phẩm vào xe và không mua hàng
Knaimero

3
Không mua hàng trong vòng 2 phút, 10 phút, một giờ hay một ngày? Dù sao, bất cứ lúc nào bạn chọn cho định nghĩa của mình, bạn có thể quan sát một sự kiện xảy ra, và không phải là điều gì đó không xảy ra. Theo ý kiến ​​của tôi đối với usecase của bạn, khái niệm tốt nhất sẽ là một cronjob kiểm tra các trích dẫn hoạt động với tương tác cuối cùng cũ hơn x phút / giờ / ngày.
HelgeB

Cảm ơn bạn. Magento khi bạn mua hàng và đóng thương mại điện tử, tự động tạo một bản ghi mà bạn có thể thấy trong quản trị viên -> báo cáo -> Giỏ hàng bị bỏ rơi. Câu hỏi của tôi tồn tại là có cách nào để có được thông tin đó?
Knaimero

Không có sự kiện nào như vậy để có được nó, bạn có thể nhận được bộ sưu tập trích dẫn không được đặt hàng giữa thời gian cụ thể
Ketan Borada

Câu trả lời:


3
  • Không có sự kiện như vậy để có được giỏ hàng bị bỏ rơi, bạn phải tạo nó tùy chỉnh.
  • Tôi có ý tưởng để khắc phục điều này, bạn phải tạo ra cron chạy mỗi thời gian cụ thể và thu thập tất cả các trích dẫn không được đặt hàng và giữa thời gian bạn đặt (sự khác biệt giữa thời gian trích dẫn được tạo và cập nhật). bạn phải quản lý updatedAtFromupdatedAtTo
  • Bằng cách này, bạn sẽ thu thập tất cả dữ liệu báo giá và trong bộ sưu tập đó, bạn có thể gửi sự kiện và chuyển tất cả dữ liệu báo giá và dữ liệu khách hàng đến sự kiện đó trong một sự kiện hoặc lấy mẫu cho tất cả trích dẫn và chuyển dữ liệu đó đến API từ người quan sát.

Tôi đã tạo Tập lệnh mà bạn có thể áp dụng trong chức năng Chặn của mình. Tôi đang sử dụng tập lệnh hoạt động này để gửi mục giỏ hàng trong thư cho khách hàng của mình sau khi họ rời đi mà không đặt hàng.

<?php 
ob_start();
use Magento\Framework\App\Bootstrap;
include('app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
ini_set('memory_limit', '1024M');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$resource = $objectManager->create('Magento\Framework\App\ResourceConnection');
$updatedAtFrom = '2019-06-19 19:00:00'; //Add current time
$updatedAtTo   = '2019-06-19 20:30:00';  // $updatedAtFrom  + 90 minutes ,add 90 minutes in current time to abondened cart

        $connection = $resource->getConnection();


        $select = $connection->select()
            ->from(
                ['q' => $resource->getTableName('quote')],
                [
                    'store_id'    => 'q.store_id',
                    'quote_id'    => 'q.entity_id',
                    'customer_id' => 'q.customer_id',
                    'updated_at'  => 'q.updated_at',
                    'created_at'  => 'q.created_at',
                ]
            )
            ->joinLeft(
                ['qa' => $resource->getTableName('quote_address')],
                'q.entity_id = qa.quote_id AND qa.address_type = "billing"',
                [
                    'customer_email'     => new \Zend_Db_Expr('IFNULL(q.customer_email, qa.email)'),
                    'customer_firstname' => new \Zend_Db_Expr('IFNULL(q.customer_firstname, qa.firstname)'),
                    'customer_lastname'  => new \Zend_Db_Expr('IFNULL(q.customer_lastname, qa.lastname)'),
                ]
            )
            ->joinInner(
                ['qi' => $resource->getTableName('quote_item')],
                'q.entity_id = qi.quote_id',
                [
                    'i_created_at' => new \Zend_Db_Expr('MAX(qi.created_at)'),
                ]
            )
            ->joinLeft(array('order' => $resource->getTableName('sales_order')),
                'order.quote_id = q.entity_id',
                array()
            )
            ->where('order.entity_id IS NULL')
            ->where('q.is_active = 1')
            ->where('q.items_count > 0')
            ->where('q.customer_email IS NOT NULL OR qa.email IS NOT NULL')
            ->where('qi.parent_item_id IS NULL')
            ->group('q.entity_id')
            ->having(
                '(q.created_at > ? OR MAX(qi.created_at) > ?)',
                $updatedAtFrom
            )
            ->having(
                '(q.created_at < ? OR MAX(qi.created_at) < ?)',
                $updatedAtTo
            )
            ->order('q.updated_at');

        $quotes = $connection->fetchAll($select);


        foreach ($quotes as $quote) {

            $params = [

                'store_id'       => $quote['store_id'],
                'quote_id'              => $quote['quote_id'],
                'customer_id'           => $quote['customer_id'],
                'customer_email' => $quote['customer_email'],
                'customer_tname'  => $quote['customer_firstname'] . ' ' . $quote['customer_lastname'],
                'created_at'     => max($quote['created_at'], $quote['i_created_at']),
            ];

            echo $quote['quote_id'];

            /*$this->eventdispatch->register(
                'quote_abandoned',
                [$params['quote_id']],
                $params
            );*/ 
            // Dispatch Event here and writelogic in that event which you want
        }

?>

Kết quả truy vấn của tập lệnh trên là:

SELECT `q`.`store_id`, `q`.`entity_id` AS `quote_id`, `q`.`customer_id`, `q`.`updated_at`, `q`.`created_at`, IFNULL(q.customer_email, qa.email) AS `customer_email`, IFNULL(q.customer_firstname, qa.firstname) AS `customer_firstname`, IFNULL(q.customer_lastname, qa.lastname) AS `customer_lastname`, MAX(qi.created_at) AS `i_created_at` FROM `quote` AS `q` LEFT JOIN `quote_address` AS `qa` ON q.entity_id = qa.quote_id AND qa.address_type = "billing" INNER JOIN `quote_item` AS `qi` ON q.entity_id = qi.quote_id LEFT JOIN `sales_order` AS `order` ON order.quote_id = q.entity_id WHERE (order.entity_id IS NULL) AND (q.is_active = 1) AND (q.items_count > 0) AND (q.customer_email IS NOT NULL OR qa.email IS NOT NULL) AND (qi.parent_item_id IS NULL) GROUP BY `q`.`entity_id` HAVING ((q.created_at > '2019-06-19 19:00:00' OR MAX(qi.created_at) > '2019-06-19 19:00:00')) AND ((q.created_at < '2019-06-19 20:30:00' OR MAX(qi.created_at) < '2019-06-19 20:30:00')) ORDER BY `q`.`updated_at` ASC 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.