Fix count returned from shortcode mailpoet_subscribers_count

[MAILPOET-3424]
This commit is contained in:
Jan Lysý
2021-03-04 12:13:56 +01:00
committed by Veljko V
parent abdcbb245a
commit fb68f1a7d8
2 changed files with 40 additions and 6 deletions

View File

@ -2,11 +2,12 @@
namespace MailPoet\Config; namespace MailPoet\Config;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Widget; use MailPoet\Form\Widget;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\Segments\SegmentSubscribersRepository;
use MailPoet\Subscription\Pages; use MailPoet\Subscription\Pages;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -17,9 +18,17 @@ class Shortcodes {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
public function __construct(Pages $subscriptionPages, WPFunctions $wp) { /** @var SegmentSubscribersRepository */
private $segmentSubscribersRepository;
public function __construct(
Pages $subscriptionPages,
WPFunctions $wp,
SegmentSubscribersRepository $segmentSubscribersRepository
) {
$this->subscriptionPages = $subscriptionPages; $this->subscriptionPages = $subscriptionPages;
$this->wp = $wp; $this->wp = $wp;
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
} }
public function init() { public function init() {
@ -75,10 +84,7 @@ class Shortcodes {
return $this->wp->numberFormatI18n(Subscriber::filter('subscribed')->count()); return $this->wp->numberFormatI18n(Subscriber::filter('subscribed')->count());
} else { } else {
return $this->wp->numberFormatI18n( return $this->wp->numberFormatI18n(
SubscriberSegment::whereIn('segment_id', $segmentIds) $this->segmentSubscribersRepository->getSubscribersCountBySegmentIds($segmentIds, SubscriberEntity::STATUS_SUBSCRIBED)
->select('subscriber_id')->distinct()
->filter('subscribed')
->findResultSet()->count()
); );
} }
} }

View File

@ -56,6 +56,34 @@ class SegmentSubscribersRepository {
return (int)$result; return (int)$result;
} }
public function getSubscribersCountBySegmentIds(array $segmentIds, string $status = null): int {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$subscribersSegmentsTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
$queryBuilder = $this->entityManager
->getConnection()
->createQueryBuilder()
->select("count(DISTINCT $subscribersTable.id)")
->from($subscribersTable)
->join(
$subscribersTable,
$subscribersSegmentsTable,
'subsegment',
"subsegment.subscriber_id = $subscribersTable.id"
)->andWhere("$subscribersTable.deleted_at IS NULL")
->andWhere("subsegment.segment_id IN (:segmentIds)")
->setParameter('segmentIds', $segmentIds, Connection::PARAM_INT_ARRAY);
if ($status) {
$queryBuilder->andWhere("$subscribersTable.status = :status")
->andWhere("subsegment.status = :status")
->setParameter('status', $status);
}
$statement = $this->executeQuery($queryBuilder);
$result = $statement->fetchColumn();
return (int)$result;
}
public function getSubscribersWithoutSegmentCount(): int { public function getSubscribersWithoutSegmentCount(): int {
$queryBuilder = $this->getSubscribersWithoutSegmentCountQuery(); $queryBuilder = $this->getSubscribersWithoutSegmentCountQuery();
return (int)$queryBuilder->getQuery()->getSingleScalarResult(); return (int)$queryBuilder->getQuery()->getSingleScalarResult();