Fix count returned from shortcode mailpoet_subscribers_count
[MAILPOET-3424]
This commit is contained in:
@ -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()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
Reference in New Issue
Block a user