No Description

WelcomeScheduler.php 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace MailPoet\Newsletter\Scheduler;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Entities\NewsletterOptionFieldEntity;
  6. use MailPoet\Entities\SegmentEntity;
  7. use MailPoet\Entities\SubscriberEntity;
  8. use MailPoet\Models\SendingQueue;
  9. use MailPoet\Newsletter\NewslettersRepository;
  10. use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
  11. use MailPoet\Segments\SegmentsRepository;
  12. use MailPoet\Subscribers\SubscribersRepository;
  13. use MailPoet\Tasks\Sending as SendingTask;
  14. use MailPoet\WP\Functions as WPFunctions;
  15. class WelcomeScheduler {
  16. const WORDPRESS_ALL_ROLES = 'mailpoet_all';
  17. /** @var SubscribersRepository */
  18. private $subscribersRepository;
  19. /** @var SegmentsRepository */
  20. private $segmentsRepository;
  21. /** @var NewslettersRepository */
  22. private $newslettersRepository;
  23. /** @var ScheduledTasksRepository */
  24. private $scheduledTasksRepository;
  25. /** @var WPFunctions|null */
  26. private $wp;
  27. public function __construct(
  28. SubscribersRepository $subscribersRepository,
  29. SegmentsRepository $segmentsRepository,
  30. NewslettersRepository $newslettersRepository,
  31. ScheduledTasksRepository $scheduledTasksRepository,
  32. ?WPFunctions $wp = null
  33. ) {
  34. $this->subscribersRepository = $subscribersRepository;
  35. $this->segmentsRepository = $segmentsRepository;
  36. $this->newslettersRepository = $newslettersRepository;
  37. $this->scheduledTasksRepository = $scheduledTasksRepository;
  38. $this->wp = $wp;
  39. }
  40. public function scheduleSubscriberWelcomeNotification($subscriberId, $segments) {
  41. $newsletters = $this->newslettersRepository->findActiveByTypes([NewsletterEntity::TYPE_WELCOME]);
  42. if (empty($newsletters)) return false;
  43. $result = [];
  44. foreach ($newsletters as $newsletter) {
  45. if ($newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_EVENT) === 'segment' &&
  46. in_array($newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_SEGMENT), $segments)
  47. ) {
  48. $sendingTask = $this->createWelcomeNotificationSendingTask($newsletter, $subscriberId);
  49. if ($sendingTask) {
  50. $result[] = $sendingTask;
  51. }
  52. }
  53. }
  54. return $result ?: false;
  55. }
  56. public function scheduleWPUserWelcomeNotification(
  57. $subscriberId,
  58. $wpUser,
  59. $oldUserData = false
  60. ) {
  61. $newsletters = $this->newslettersRepository->findActiveByTypes([NewsletterEntity::TYPE_WELCOME]);
  62. if (empty($newsletters)) return false;
  63. foreach ($newsletters as $newsletter) {
  64. if ($newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_EVENT) !== 'user') {
  65. continue;
  66. }
  67. $newsletterRole = $newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_ROLE);
  68. if (!empty($oldUserData['roles'])) {
  69. // do not schedule welcome newsletter if roles have not changed
  70. $oldRole = $oldUserData['roles'];
  71. $newRole = $wpUser['roles'];
  72. if ($newsletterRole === self::WORDPRESS_ALL_ROLES ||
  73. !array_diff($oldRole, $newRole)
  74. ) {
  75. continue;
  76. }
  77. }
  78. if ($newsletterRole === self::WORDPRESS_ALL_ROLES ||
  79. in_array($newsletterRole, $wpUser['roles'])
  80. ) {
  81. $this->createWelcomeNotificationSendingTask($newsletter, $subscriberId);
  82. }
  83. }
  84. }
  85. public function createWelcomeNotificationSendingTask(NewsletterEntity $newsletter, $subscriberId) {
  86. $subscriber = $this->subscribersRepository->findOneById($subscriberId);
  87. if (!($subscriber instanceof SubscriberEntity) || $subscriber->getDeletedAt() !== null) {
  88. return;
  89. }
  90. if ($newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_EVENT) === 'segment') {
  91. $segment = $this->segmentsRepository->findOneById((int)$newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_SEGMENT));
  92. if ((!$segment instanceof SegmentEntity) || $segment->getDeletedAt() !== null) {
  93. return;
  94. }
  95. }
  96. if ($newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_EVENT) === 'user') {
  97. $segment = $this->segmentsRepository->getWPUsersSegment();
  98. if ((!$segment instanceof SegmentEntity) || $segment->getDeletedAt() !== null) {
  99. return;
  100. }
  101. }
  102. $previouslyScheduledNotification = $this->scheduledTasksRepository->findByNewsletterAndSubscriberId($newsletter, $subscriberId);
  103. if (!empty($previouslyScheduledNotification)) return;
  104. $sendingTask = SendingTask::create();
  105. $sendingTask->newsletterId = $newsletter->getId();
  106. $sendingTask->setSubscribers([$subscriberId]);
  107. $sendingTask->status = SendingQueue::STATUS_SCHEDULED;
  108. $sendingTask->priority = SendingQueue::PRIORITY_HIGH;
  109. $sendingTask->scheduledAt = Scheduler::getScheduledTimeWithDelay(
  110. $newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_AFTER_TIME_TYPE),
  111. $newsletter->getOptionValue(NewsletterOptionFieldEntity::NAME_AFTER_TIME_NUMBER),
  112. $this->wp
  113. );
  114. return $sendingTask->save();
  115. }
  116. }