Implement WooCommerce product segment filter using Doctrine
[MAILPOET-3077]
This commit is contained in:
committed by
Veljko V
parent
ed059670fb
commit
750014716e
@@ -258,6 +258,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\Segments\SegmentsRepository::class);
|
$container->autowire(\MailPoet\Segments\SegmentsRepository::class);
|
||||||
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\UserRole::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\UserRole::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\EmailAction::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\EmailAction::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct::class)->setPublic(true);
|
||||||
// Services
|
// Services
|
||||||
$container->autowire(\MailPoet\Services\Bridge::class)->setPublic(true);
|
$container->autowire(\MailPoet\Services\Bridge::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Services\AuthorizedEmailsController::class);
|
$container->autowire(\MailPoet\Services\AuthorizedEmailsController::class);
|
||||||
|
@@ -2,19 +2,43 @@
|
|||||||
|
|
||||||
namespace MailPoet\Segments\DynamicSegments\Filters;
|
namespace MailPoet\Segments\DynamicSegments\Filters;
|
||||||
|
|
||||||
|
use MailPoet\Entities\DynamicSegmentFilterEntity;
|
||||||
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
use MailPoetVendor\Doctrine\DBAL\Query\QueryBuilder;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
class WooCommerceProduct implements Filter {
|
class WooCommerceProduct implements Filter {
|
||||||
const ACTION_PRODUCT = 'purchasedProduct';
|
const ACTION_PRODUCT = 'purchasedProduct';
|
||||||
|
|
||||||
/** @var int */
|
/** @var EntityManager */
|
||||||
private $productId;
|
private $entityManager;
|
||||||
|
|
||||||
public function __construct(int $productId) {
|
public function __construct(EntityManager $entityManager) {
|
||||||
$this->productId = $productId;
|
$this->entityManager = $entityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function apply(QueryBuilder $queryBuilder): QueryBuilder {
|
public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filterEntity): QueryBuilder {
|
||||||
return $queryBuilder;
|
global $wpdb;
|
||||||
|
$productId = (int)$filterEntity->getFilterDataParam('product_id');
|
||||||
|
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
|
||||||
|
return $queryBuilder->innerJoin(
|
||||||
|
$subscribersTable,
|
||||||
|
$wpdb->postmeta,
|
||||||
|
'postmeta',
|
||||||
|
"postmeta.meta_key = '_customer_user' AND $subscribersTable.wp_user_id=postmeta.meta_value"
|
||||||
|
)->join('postmeta',
|
||||||
|
$wpdb->prefix . 'woocommerce_order_items',
|
||||||
|
'items',
|
||||||
|
'postmeta.post_id = items.order_id'
|
||||||
|
)->innerJoin(
|
||||||
|
'items',
|
||||||
|
$wpdb->prefix . 'woocommerce_order_itemmeta',
|
||||||
|
'itemmeta',
|
||||||
|
"itemmeta.order_item_id=items.order_item_id AND itemmeta.meta_key='_product_id' AND itemmeta.meta_value=:product"
|
||||||
|
)->andWhere(
|
||||||
|
$subscribersTable . '.status = :status AND
|
||||||
|
postmeta.post_id NOT IN ( SELECT id FROM ' . $wpdb->posts . ' as p WHERE p.post_status IN ("wc-cancelled", "wc-failed"))'
|
||||||
|
)->setParameter('product', $productId
|
||||||
|
)->setParameter('status', SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user