Search for last engagement in orders only if WooCommerce is active
[MAILPOET-3762]
This commit is contained in:
committed by
Veljko V
parent
754f901e30
commit
ae2d450dce
@@ -7,6 +7,7 @@ use MailPoet\Entities\StatisticsOpenEntity;
|
|||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Models\ScheduledTask;
|
use MailPoet\Models\ScheduledTask;
|
||||||
use MailPoet\Util\DBCollationChecker;
|
use MailPoet\Util\DBCollationChecker;
|
||||||
|
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||||
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
class SubscribersLastEngagement extends SimpleWorker {
|
class SubscribersLastEngagement extends SimpleWorker {
|
||||||
@@ -21,16 +22,21 @@ class SubscribersLastEngagement extends SimpleWorker {
|
|||||||
/** @var DBCollationChecker */
|
/** @var DBCollationChecker */
|
||||||
private $dbCollationChecker;
|
private $dbCollationChecker;
|
||||||
|
|
||||||
|
/** @var WooCommerceHelper */
|
||||||
|
private $wooCommereHelper;
|
||||||
|
|
||||||
/** @var null|string */
|
/** @var null|string */
|
||||||
private $emailCollationCorrection;
|
private $emailCollationCorrection;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
EntityManager $entityManager,
|
EntityManager $entityManager,
|
||||||
DBCollationChecker $dbCollationChecker
|
DBCollationChecker $dbCollationChecker,
|
||||||
|
WooCommerceHelper $wooCommereHelper
|
||||||
) {
|
) {
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
$this->dbCollationChecker = $dbCollationChecker;
|
$this->dbCollationChecker = $dbCollationChecker;
|
||||||
|
$this->wooCommereHelper = $wooCommereHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processTaskStrategy(ScheduledTask $task, $timer): bool {
|
public function processTaskStrategy(ScheduledTask $task, $timer): bool {
|
||||||
@@ -66,15 +72,27 @@ class SubscribersLastEngagement extends SimpleWorker {
|
|||||||
}
|
}
|
||||||
$emailCollate = $this->emailCollationCorrection;
|
$emailCollate = $this->emailCollationCorrection;
|
||||||
|
|
||||||
$this->entityManager->getConnection()->executeStatement("
|
$query = "
|
||||||
UPDATE $subscribersTable as mps
|
UPDATE $subscribersTable as mps
|
||||||
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
|
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
|
||||||
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
|
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
|
||||||
LEFT JOIN (SELECT MAX(post_id) AS post_id, meta_value as email FROM $postsmetaTable WHERE meta_key = '_billing_email' GROUP BY email) AS newestOrderIds ON newestOrderIds.email $emailCollate = mps.email
|
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0)), 0)
|
||||||
LEFT JOIN (SELECT ID, post_date FROM $postsTable WHERE post_type = 'shop_order') AS shopOrders ON newestOrderIds.post_id = shopOrders.ID
|
WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
|
||||||
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0), COALESCE(shopOrders.post_date, 0)), 0)
|
";
|
||||||
WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
|
|
||||||
");
|
// Use more complex query that takes into the account also subscriber's latest WooCommerce order
|
||||||
|
if ($this->wooCommereHelper->isWooCommerceActive()) {
|
||||||
|
$query = "
|
||||||
|
UPDATE $subscribersTable as mps
|
||||||
|
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsOpensTable as mpsoinner GROUP BY mpsoinner.subscriber_id) as mpso ON mpso.subscriber_id = mps.id
|
||||||
|
LEFT JOIN (SELECT max(created_at) as created_at, subscriber_id FROM $statisticsClicksTable as mpscinner GROUP BY mpscinner.subscriber_id) as mpsc ON mpsc.subscriber_id = mps.id
|
||||||
|
LEFT JOIN (SELECT MAX(post_id) AS post_id, meta_value as email FROM $postsmetaTable WHERE meta_key = '_billing_email' GROUP BY email) AS newestOrderIds ON newestOrderIds.email $emailCollate = mps.email
|
||||||
|
LEFT JOIN (SELECT ID, post_date FROM $postsTable WHERE post_type = 'shop_order') AS shopOrders ON newestOrderIds.post_id = shopOrders.ID
|
||||||
|
SET mps.last_engagement_at = NULLIF(GREATEST(COALESCE(mpso.created_at, 0), COALESCE(mpsc.created_at,0), COALESCE(shopOrders.post_date, 0)), 0)
|
||||||
|
WHERE mps.last_engagement_at IS NULL AND mps.id >= $minSubscriberId AND mps.id < $maxSubscriberId;
|
||||||
|
";
|
||||||
|
}
|
||||||
|
$this->entityManager->getConnection()->executeStatement($query);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getHighestSubscriberId(): int {
|
private function getHighestSubscriberId(): int {
|
||||||
|
Reference in New Issue
Block a user