diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 553b7fe45b..6ff0a97306 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -274,6 +274,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\Filters\WooCommerceNumberOfOrders::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct::class)->setPublic(true); + $container->autowire(\MailPoet\Segments\DynamicSegments\Filters\WooCommerceSubscription::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\SegmentSaveController::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\FilterDataMapper::class)->setPublic(true); // Services diff --git a/lib/Entities/DynamicSegmentFilterData.php b/lib/Entities/DynamicSegmentFilterData.php index f70a3fae9b..56551134b1 100644 --- a/lib/Entities/DynamicSegmentFilterData.php +++ b/lib/Entities/DynamicSegmentFilterData.php @@ -11,6 +11,7 @@ class DynamicSegmentFilterData { const TYPE_USER_ROLE = 'userRole'; const TYPE_EMAIL = 'email'; const TYPE_WOOCOMMERCE = 'woocommerce'; + const TYPE_WOOCOMMERCE_SUBSCRIPTION = 'woocommerceSubscription'; /** * @ORM\Column(type="serialized_array") diff --git a/lib/Segments/DynamicSegments/Filters/WooCommerceSubscription.php b/lib/Segments/DynamicSegments/Filters/WooCommerceSubscription.php new file mode 100644 index 0000000000..94cf58c0a8 --- /dev/null +++ b/lib/Segments/DynamicSegments/Filters/WooCommerceSubscription.php @@ -0,0 +1,45 @@ +entityManager = $entityManager; + } + + public function apply(QueryBuilder $queryBuilder, DynamicSegmentFilterEntity $filter): QueryBuilder { + global $wpdb; + $filterData = $filter->getFilterData(); + $productId = (int)$filterData->getParam('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" + )->innerJoin('postmeta', + $wpdb->posts, + 'posts', + 'postmeta.post_id = posts.id AND posts.post_type = "shop_subscription" AND posts.post_status = "wc-active"' + )->innerJoin('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" . $filter->getId() + )->setParameter('product' . $filter->getId(), $productId); + } +}