No Description

SubscriptionUrlFactory.php 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace MailPoet\Subscription;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\DI\ContainerWrapper;
  5. use MailPoet\Entities\SubscriberEntity;
  6. use MailPoet\Router\Endpoints\Subscription as SubscriptionEndpoint;
  7. use MailPoet\Router\Router;
  8. use MailPoet\Settings\Pages as SettingsPages;
  9. use MailPoet\Settings\SettingsController;
  10. use MailPoet\Subscribers\LinkTokens;
  11. use MailPoet\WP\Functions as WPFunctions;
  12. class SubscriptionUrlFactory {
  13. /** @var SubscriptionUrlFactory */
  14. private static $instance;
  15. /** @var WPFunctions */
  16. private $wp;
  17. /** @var SettingsController */
  18. private $settings;
  19. /** @var LinkTokens */
  20. private $linkTokens;
  21. public function __construct(
  22. WPFunctions $wp,
  23. SettingsController $settings,
  24. LinkTokens $linkTokens
  25. ) {
  26. $this->wp = $wp;
  27. $this->settings = $settings;
  28. $this->linkTokens = $linkTokens;
  29. }
  30. public function getCaptchaUrl($sessionId) {
  31. $post = $this->getPost($this->settings->get('subscription.pages.captcha'));
  32. return $this->getSubscriptionUrl($post, 'captcha', null, ['captcha_session_id' => $sessionId]);
  33. }
  34. public function getCaptchaImageUrl($width, $height, $sessionId) {
  35. $post = $this->getPost($this->settings->get('subscription.pages.captcha'));
  36. return $this->getSubscriptionUrl(
  37. $post,
  38. 'captchaImage',
  39. null,
  40. ['width' => $width, 'height' => $height, 'captcha_session_id' => $sessionId]
  41. );
  42. }
  43. public function getConfirmationUrl(SubscriberEntity $subscriber = null) {
  44. $post = $this->getPost($this->settings->get('subscription.pages.confirmation'));
  45. return $this->getSubscriptionUrl($post, 'confirm', $subscriber);
  46. }
  47. public function getConfirmUnsubscribeUrl(SubscriberEntity $subscriber = null, int $queueId = null) {
  48. $post = $this->getPost($this->settings->get('subscription.pages.confirm_unsubscribe'));
  49. $data = $queueId && $subscriber ? ['queueId' => $queueId] : null;
  50. return $this->getSubscriptionUrl($post, 'confirm_unsubscribe', $subscriber, $data);
  51. }
  52. public function getManageUrl(SubscriberEntity $subscriber = null) {
  53. $post = $this->getPost($this->settings->get('subscription.pages.manage'));
  54. return $this->getSubscriptionUrl($post, 'manage', $subscriber);
  55. }
  56. public function getUnsubscribeUrl(SubscriberEntity $subscriber = null, int $queueId = null) {
  57. $post = $this->getPost($this->settings->get('subscription.pages.unsubscribe'));
  58. $data = $queueId && $subscriber ? ['queueId' => $queueId] : null;
  59. return $this->getSubscriptionUrl($post, 'unsubscribe', $subscriber, $data);
  60. }
  61. public function getSubscriptionUrl(
  62. $post = null,
  63. $action = null,
  64. SubscriberEntity $subscriber = null,
  65. $data = null
  66. ) {
  67. if ($post === null || $action === null) return;
  68. $url = $this->wp->getPermalink($post);
  69. if ($subscriber !== null) {
  70. $subscriberData = [
  71. 'token' => $this->linkTokens->getToken($subscriber),
  72. 'email' => $subscriber->getEmail(),
  73. ];
  74. $data = array_merge($data ?? [], $subscriberData);
  75. } elseif (is_null($data)) {
  76. $data = [
  77. 'preview' => 1,
  78. ];
  79. }
  80. $params = [
  81. Router::NAME,
  82. 'endpoint=' . SubscriptionEndpoint::ENDPOINT,
  83. 'action=' . $action,
  84. 'data=' . Router::encodeRequestData($data),
  85. ];
  86. // add parameters
  87. $url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . join('&', $params);
  88. $urlParams = parse_url($url);
  89. if (!is_array($urlParams) || empty($urlParams['scheme'])) {
  90. $url = $this->wp->getBloginfo('url') . $url;
  91. }
  92. return $url;
  93. }
  94. /**
  95. * @return SubscriptionUrlFactory
  96. */
  97. public static function getInstance() {
  98. if (!self::$instance instanceof SubscriptionUrlFactory) {
  99. $linkTokens = ContainerWrapper::getInstance()->get(LinkTokens::class);
  100. self::$instance = new SubscriptionUrlFactory(new WPFunctions, SettingsController::getInstance(), $linkTokens);
  101. }
  102. return self::$instance;
  103. }
  104. private function getPost($post = null) {
  105. if ($post) {
  106. $postObject = $this->wp->getPost($post);
  107. if ($postObject) {
  108. return $postObject;
  109. }
  110. }
  111. // Resort to a default MailPoet page if no page is selected
  112. $pages = SettingsPages::getMailPoetPages();
  113. return reset($pages);
  114. }
  115. }