diff --git a/mailpoet/lib/Newsletter/NewslettersRepository.php b/mailpoet/lib/Newsletter/NewslettersRepository.php index 3117459658..b4137865cc 100644 --- a/mailpoet/lib/Newsletter/NewslettersRepository.php +++ b/mailpoet/lib/Newsletter/NewslettersRepository.php @@ -23,6 +23,7 @@ use MailPoet\Entities\StatisticsOpenEntity; use MailPoet\Entities\StatisticsWooCommercePurchaseEntity; use MailPoet\Entities\StatsNotificationEntity; use MailPoet\Logging\LoggerFactory; +use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Doctrine\DBAL\Connection; use MailPoetVendor\Doctrine\ORM\EntityManager; @@ -35,11 +36,16 @@ class NewslettersRepository extends Repository { /** @var LoggerFactory */ private $loggerFactory; + /** @var WPFunctions */ + private $wp; + public function __construct( - EntityManager $entityManager + EntityManager $entityManager, + WPFunctions $wp ) { parent::__construct($entityManager); $this->loggerFactory = LoggerFactory::getInstance(); + $this->wp = $wp; } protected function getEntityClassName() { @@ -432,6 +438,18 @@ class NewslettersRepository extends Repository { WHERE ns.`newsletter_id` IN (:ids) ", ['ids' => $ids], ['ids' => Connection::PARAM_INT_ARRAY]); + // Fetch WP Posts IDs and delete them + $wpPostsIds = $entityManager->createQueryBuilder()->select('n.wpPostId') + ->from(NewsletterEntity::class, 'n') + ->where('n.id IN (:ids)') + ->andWhere('n.wpPostId IS NOT NULL') + ->setParameter('ids', $ids) + ->getQuery()->getSingleColumnResult(); + foreach ($wpPostsIds as $wpPostId) { + $this->wp->wpDeletePost(intval($wpPostId), true); + } + + // Delete newsletter entities $queryBuilder = $entityManager->createQueryBuilder(); $queryBuilder->delete(NewsletterEntity::class, 'n') ->where('n.id IN (:ids)') diff --git a/mailpoet/tests/integration/API/JSON/v1/NewslettersTest.php b/mailpoet/tests/integration/API/JSON/v1/NewslettersTest.php index 2a4ddb6eb0..bf01b890da 100644 --- a/mailpoet/tests/integration/API/JSON/v1/NewslettersTest.php +++ b/mailpoet/tests/integration/API/JSON/v1/NewslettersTest.php @@ -88,7 +88,7 @@ class NewslettersTest extends \MailPoetTest { [ 'newslettersResponseBuilder' => new NewslettersResponseBuilder( $this->diContainer->get(EntityManager::class), - new NewslettersRepository($this->diContainer->get(EntityManager::class)), + $this->diContainer->get(NewslettersRepository::class), new NewsletterStatisticsRepository( $this->diContainer->get(EntityManager::class), $this->makeEmpty(WCHelper::class) diff --git a/mailpoet/tests/integration/Newsletter/NewsletterRepositoryTest.php b/mailpoet/tests/integration/Newsletter/NewsletterRepositoryTest.php index 34f09e1e70..a756570584 100644 --- a/mailpoet/tests/integration/Newsletter/NewsletterRepositoryTest.php +++ b/mailpoet/tests/integration/Newsletter/NewsletterRepositoryTest.php @@ -21,6 +21,7 @@ use MailPoet\Entities\StatsNotificationEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository; use MailPoet\Tasks\Sending as SendingTask; +use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Carbon\Carbon; class NewsletterRepositoryTest extends \MailPoetTest { @@ -30,10 +31,14 @@ class NewsletterRepositoryTest extends \MailPoetTest { /** @var ScheduledTaskSubscribersRepository */ private $taskSubscribersRepository; + /** @var WPFunctions */ + private $wp; + public function _before() { parent::_before(); $this->repository = $this->diContainer->get(NewslettersRepository::class); $this->taskSubscribersRepository = $this->diContainer->get(ScheduledTaskSubscribersRepository::class); + $this->wp = $this->diContainer->get(WPFunctions::class); } public function testItBulkTrashNewslettersAndChildren() { @@ -213,6 +218,26 @@ class NewsletterRepositoryTest extends \MailPoetTest { expect($statisticsPurchase->getNewsletter())->null(); } + public function testItDeletesWpPostsBulkDelete() { + $newsletter1 = $this->createNewsletter(NewsletterEntity::TYPE_STANDARD, NewsletterEntity::STATUS_SENDING); + $post1Id = $this->wp->wpInsertPost(['post_title' => 'Post 1']); + $newsletter1->setWpPostId($post1Id); + $newsletter2 = $this->createNewsletter(NewsletterEntity::TYPE_WELCOME, NewsletterEntity::STATUS_SENDING); + $post2Id = $this->wp->wpInsertPost(['post_title' => 'Post 2']); + $newsletter2->setWpPostId($post2Id); + $newsletter3 = $this->createNewsletter(NewsletterEntity::TYPE_STANDARD, NewsletterEntity::STATUS_SENDING); + + expect($this->wp->getPost($post1Id))->isInstanceOf(\WP_Post::class); + expect($this->wp->getPost($post2Id))->isInstanceOf(\WP_Post::class); + + $this->entityManager->flush(); + $this->entityManager->clear(); + + $this->repository->bulkDelete([$newsletter1->getId(), $newsletter2->getId(), $newsletter3->getId()]); + expect($this->wp->getPost($post1Id))->null(); + expect($this->wp->getPost($post2Id))->null(); + } + public function testItGetsArchiveNewslettersForSegments() { $types = [ NewsletterEntity::TYPE_STANDARD,