カートの放棄のオブザーバー


8

私は助けが必要です!!!

APIを介して別のプラットフォームと統合するモジュールを作成しています。顧客登録用のオブザーバーまたはイベント(customer_register_success)をすでに取得しています。購入は完了しています(checkout_onepage_controller_success_action)。

私が必要とする助けは、オブザーバーに捨てられたカートをどのようにして入手できるか、またはその情報を取得してAPI経由で送信するための最良の方法は何でしょうか。


2
放棄されたカートのあなたの定義は何ですか?
Philipp Sander

お客様が車に製品を追加し、購入しなかったとき
Knaimero

3
2分、10分、1時間、または1日以内に購入しませんでしたか?とにかく、あなたがあなたの定義のためにあなたが選択するどんな時でも、あなたは起こる出来事を観察することができ、起こらないことは観察できません。あなたのユースケースに対する私の意見では、最良の概念は、x分/時間/日より古い最後の対話でアクティブな見積もりをチェックするcronジョブです。
HelgeB

ありがとうございました。Magentoは、購入してeコマースを閉じるときに、管理者->レポート->放棄されたカートに表示されるレコードを自動的に作成します。私の質問は、その情報を取得する方法はありますか?
Knaimero

それを取得するためのそのようなイベントはありません。特定の時間の間に注文されていない見積もりコレクションを取得できます
Ketan Borada

回答:


3
  • カートを放棄するようなイベントはありません。カスタムで作成する必要があります。
  • 私はこれを克服するためのアイデアを持っています。特定の時間ごとに実行するcronを作成し、順序付けされていないすべての見積もりを設定し、設定した時間の間で作成する必要があります(作成済みと更新済みの見積もり時間の差)。あなたはただ管理しupdatedAtFromupdatedAtTo
  • これを実行すると、すべての見積もりデータが収集され、そのコレクションでイベントをディスパッチしてすべての見積もりデータと顧客データを単一のイベント内でそのイベントに渡すか、すべての見積もりに分けてそのデータをオブザーバーからAPIに渡すことができます。

ブロック機能に適用できるスクリプトを作成しました。この作業スクリプトを使用して、注文せずに顧客がカートをカートに残した後に顧客にメールで送ります。

<?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
        }

?>

上記のスクリプトの結果のクエリは次のとおりです。

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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.