暫無描述

Opens.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace MailPoet\Statistics\Track;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Entities\SendingQueueEntity;
  6. use MailPoet\Entities\StatisticsOpenEntity;
  7. use MailPoet\Entities\SubscriberEntity;
  8. use MailPoet\Entities\UserAgentEntity;
  9. use MailPoet\Statistics\StatisticsOpensRepository;
  10. use MailPoet\Statistics\UserAgentsRepository;
  11. use MailPoet\Subscribers\SubscribersRepository;
  12. class Opens {
  13. /** @var StatisticsOpensRepository */
  14. private $statisticsOpensRepository;
  15. /** @var UserAgentsRepository */
  16. private $userAgentsRepository;
  17. /** @var SubscribersRepository */
  18. private $subscribersRepository;
  19. public function __construct(
  20. StatisticsOpensRepository $statisticsOpensRepository,
  21. UserAgentsRepository $userAgentsRepository,
  22. SubscribersRepository $subscribersRepository
  23. ) {
  24. $this->statisticsOpensRepository = $statisticsOpensRepository;
  25. $this->userAgentsRepository = $userAgentsRepository;
  26. $this->subscribersRepository = $subscribersRepository;
  27. }
  28. public function track($data, $displayImage = true) {
  29. if (!$data) {
  30. return $this->returnResponse($displayImage);
  31. }
  32. /** @var SubscriberEntity $subscriber */
  33. $subscriber = $data->subscriber;
  34. /** @var SendingQueueEntity $queue */
  35. $queue = $data->queue;
  36. /** @var NewsletterEntity $newsletter */
  37. $newsletter = $data->newsletter;
  38. $wpUserPreview = ($data->preview && ($subscriber->isWPUser()));
  39. // log statistics only if the action did not come from
  40. // a WP user previewing the newsletter
  41. if (!$wpUserPreview) {
  42. $oldStatistics = $this->statisticsOpensRepository->findOneBy([
  43. 'subscriber' => $subscriber->getId(),
  44. 'newsletter' => $newsletter->getId(),
  45. 'queue' => $queue->getId(),
  46. ]);
  47. // Open was already tracked
  48. if ($oldStatistics) {
  49. if (!empty($data->userAgent)) {
  50. $userAgent = $this->userAgentsRepository->findOrCreate($data->userAgent);
  51. if ($userAgent->getUserAgentType() === UserAgentEntity::USER_AGENT_TYPE_HUMAN
  52. || $oldStatistics->getUserAgentType() === UserAgentEntity::USER_AGENT_TYPE_MACHINE
  53. ) {
  54. $oldStatistics->setUserAgent($userAgent);
  55. $oldStatistics->setUserAgentType($userAgent->getUserAgentType());
  56. $this->statisticsOpensRepository->flush();
  57. }
  58. }
  59. $this->subscribersRepository->maybeUpdateLastEngagement($subscriber, $userAgent ?? null);
  60. return $this->returnResponse($displayImage);
  61. }
  62. $statistics = new StatisticsOpenEntity($newsletter, $queue, $subscriber);
  63. if (!empty($data->userAgent)) {
  64. $userAgent = $this->userAgentsRepository->findOrCreate($data->userAgent);
  65. $statistics->setUserAgent($userAgent);
  66. $statistics->setUserAgentType($userAgent->getUserAgentType());
  67. }
  68. $this->statisticsOpensRepository->persist($statistics);
  69. $this->statisticsOpensRepository->flush();
  70. $this->subscribersRepository->maybeUpdateLastEngagement($subscriber, $userAgent ?? null);
  71. $this->statisticsOpensRepository->recalculateSubscriberScore($subscriber);
  72. }
  73. return $this->returnResponse($displayImage);
  74. }
  75. public function returnResponse($displayImage) {
  76. if (!$displayImage) return;
  77. // return 1x1 pixel transparent gif image
  78. header('Content-Type: image/gif');
  79. echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
  80. exit;
  81. }
  82. }