From 1630da09178c43307bd3930fa44aa18e61d91a5e Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Thu, 20 Jan 2022 11:27:11 +0100 Subject: [PATCH] Add processing of shortcode in subject in archive page [MAILPOET-3965] --- mailpoet/lib/Config/Shortcodes.php | 11 ++++++++- .../Shortcodes/Categories/Subscriber.php | 24 +++++++++++++++---- .../integration/Config/ShortcodesTest.php | 20 ++++++++++++++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/mailpoet/lib/Config/Shortcodes.php b/mailpoet/lib/Config/Shortcodes.php index a7fbaaadd4..93f193b96c 100644 --- a/mailpoet/lib/Config/Shortcodes.php +++ b/mailpoet/lib/Config/Shortcodes.php @@ -8,6 +8,7 @@ use MailPoet\Entities\SubscriberEntity; use MailPoet\Form\Widget; use MailPoet\Models\Subscriber; use MailPoet\Newsletter\NewslettersRepository; +use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes; use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Segments\SegmentSubscribersRepository; use MailPoet\Subscribers\SubscribersRepository; @@ -33,12 +34,16 @@ class Shortcodes { /** @var NewslettersRepository */ private $newslettersRepository; + /** @var NewsletterShortcodes */ + private $shortcodeProcessor; + public function __construct( Pages $subscriptionPages, WPFunctions $wp, SegmentSubscribersRepository $segmentSubscribersRepository, SubscribersRepository $subscribersRepository, NewsletterUrl $newsletterUrl, + NewsletterShortcodes $shortcodeProcessor, NewslettersRepository $newslettersRepository ) { $this->subscriptionPages = $subscriptionPages; @@ -46,6 +51,7 @@ class Shortcodes { $this->segmentSubscribersRepository = $segmentSubscribersRepository; $this->subscribersRepository = $subscribersRepository; $this->newsletterUrl = $newsletterUrl; + $this->shortcodeProcessor = $shortcodeProcessor; $this->newslettersRepository = $newslettersRepository; } @@ -187,9 +193,12 @@ class Shortcodes { public function renderArchiveSubject(NewsletterEntity $newsletter, $subscriber, SendingQueueEntity $queue) { $previewUrl = $this->newsletterUrl->getViewInBrowserUrl($newsletter, $subscriber, $queue); + $this->shortcodeProcessor->setNewsletter($newsletter); + $this->shortcodeProcessor->setSubscriber(null); + $this->shortcodeProcessor->setQueue($queue); return '' - . esc_attr((string)$queue->getNewsletterRenderedSubject()) . + . esc_attr((string)$this->shortcodeProcessor->replace($queue->getNewsletterRenderedSubject())) . ''; } } diff --git a/mailpoet/lib/Newsletter/Shortcodes/Categories/Subscriber.php b/mailpoet/lib/Newsletter/Shortcodes/Categories/Subscriber.php index 9af203c0ae..a480cbb85c 100644 --- a/mailpoet/lib/Newsletter/Shortcodes/Categories/Subscriber.php +++ b/mailpoet/lib/Newsletter/Shortcodes/Categories/Subscriber.php @@ -1,4 +1,4 @@ -shouldReturnDefault((string)$shortcodeDetails['action']) + && !empty($defaultValue) + ) { + return $defaultValue; + } + + if (!($subscriber instanceof SubscriberEntity)) { + return $shortcodeDetails['shortcode']; + } + switch ($shortcodeDetails['action']) { case 'firstname': return (!empty($subscriber->getFirstName())) ? htmlspecialchars($subscriber->getFirstName()) : $defaultValue; @@ -69,4 +81,8 @@ class Subscriber implements CategoryInterface { return null; } } + + private function shouldReturnDefault(string $action): bool { + return in_array($action, self::DEFAULT_ALLOWED_ACTIONS, true); + } } diff --git a/mailpoet/tests/integration/Config/ShortcodesTest.php b/mailpoet/tests/integration/Config/ShortcodesTest.php index a44f9514e6..5a6a6b7867 100644 --- a/mailpoet/tests/integration/Config/ShortcodesTest.php +++ b/mailpoet/tests/integration/Config/ShortcodesTest.php @@ -65,6 +65,26 @@ class ShortcodesTest extends \MailPoetTest { expect($requestData['newsletter_hash'])->equals($this->newsletter->hash); } + public function testItRendersShortcodeDefaultsInSubject() { + $shortcodes = ContainerWrapper::getInstance()->get(Shortcodes::class); + $this->queue->newsletterRenderedSubject = 'Hello [subscriber:firstname | default:reader]'; + $this->queue->save(); + WordPress::interceptFunction('apply_filters', function() use($shortcodes) { + $args = func_get_args(); + $filterName = array_shift($args); + switch ($filterName) { + case 'mailpoet_archive_date': + return $shortcodes->renderArchiveDate($args[0]); + case 'mailpoet_archive_subject': + return $shortcodes->renderArchiveSubject($args[0], $args[1], $args[2]); + } + return ''; + }); + $result = $shortcodes->getArchive($params = false); + WordPress::releaseFunction('apply_filters'); + expect((string)$result)->stringContainsString('Hello reader'); + } + public function testItDisplaysManageSubscriptionFormForLoggedinExistingUsers() { $wpUser = wp_set_current_user(1); expect((new WPFunctions)->isUserLoggedIn())->true();