Add processing of shortcode in subject in archive page

[MAILPOET-3965]
This commit is contained in:
Rostislav Wolny
2022-01-20 11:27:11 +01:00
committed by Veljko V
parent fac560071a
commit 1630da0917
3 changed files with 50 additions and 5 deletions

View File

@@ -8,6 +8,7 @@ use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Widget; use MailPoet\Form\Widget;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\Segments\SegmentSubscribersRepository; use MailPoet\Segments\SegmentSubscribersRepository;
use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscribers\SubscribersRepository;
@@ -33,12 +34,16 @@ class Shortcodes {
/** @var NewslettersRepository */ /** @var NewslettersRepository */
private $newslettersRepository; private $newslettersRepository;
/** @var NewsletterShortcodes */
private $shortcodeProcessor;
public function __construct( public function __construct(
Pages $subscriptionPages, Pages $subscriptionPages,
WPFunctions $wp, WPFunctions $wp,
SegmentSubscribersRepository $segmentSubscribersRepository, SegmentSubscribersRepository $segmentSubscribersRepository,
SubscribersRepository $subscribersRepository, SubscribersRepository $subscribersRepository,
NewsletterUrl $newsletterUrl, NewsletterUrl $newsletterUrl,
NewsletterShortcodes $shortcodeProcessor,
NewslettersRepository $newslettersRepository NewslettersRepository $newslettersRepository
) { ) {
$this->subscriptionPages = $subscriptionPages; $this->subscriptionPages = $subscriptionPages;
@@ -46,6 +51,7 @@ class Shortcodes {
$this->segmentSubscribersRepository = $segmentSubscribersRepository; $this->segmentSubscribersRepository = $segmentSubscribersRepository;
$this->subscribersRepository = $subscribersRepository; $this->subscribersRepository = $subscribersRepository;
$this->newsletterUrl = $newsletterUrl; $this->newsletterUrl = $newsletterUrl;
$this->shortcodeProcessor = $shortcodeProcessor;
$this->newslettersRepository = $newslettersRepository; $this->newslettersRepository = $newslettersRepository;
} }
@@ -187,9 +193,12 @@ class Shortcodes {
public function renderArchiveSubject(NewsletterEntity $newsletter, $subscriber, SendingQueueEntity $queue) { public function renderArchiveSubject(NewsletterEntity $newsletter, $subscriber, SendingQueueEntity $queue) {
$previewUrl = $this->newsletterUrl->getViewInBrowserUrl($newsletter, $subscriber, $queue); $previewUrl = $this->newsletterUrl->getViewInBrowserUrl($newsletter, $subscriber, $queue);
$this->shortcodeProcessor->setNewsletter($newsletter);
$this->shortcodeProcessor->setSubscriber(null);
$this->shortcodeProcessor->setQueue($queue);
return '<a href="' . esc_attr($previewUrl) . '" target="_blank" title="' return '<a href="' . esc_attr($previewUrl) . '" target="_blank" title="'
. esc_attr(__('Preview in a new tab', 'mailpoet')) . '">' . esc_attr(__('Preview in a new tab', 'mailpoet')) . '">'
. esc_attr((string)$queue->getNewsletterRenderedSubject()) . . esc_attr((string)$this->shortcodeProcessor->replace($queue->getNewsletterRenderedSubject())) .
'</a>'; '</a>';
} }
} }

View File

@@ -1,4 +1,4 @@
<?php <?php declare(strict_types=1);
namespace MailPoet\Newsletter\Shortcodes\Categories; namespace MailPoet\Newsletter\Shortcodes\Categories;
@@ -12,6 +12,8 @@ use MailPoet\WP\Functions as WPFunctions;
class Subscriber implements CategoryInterface { class Subscriber implements CategoryInterface {
const DEFAULT_ALLOWED_ACTIONS = ['firstname', 'lastname', 'displayname'];
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscribersRepository; private $subscribersRepository;
@@ -34,12 +36,22 @@ class Subscriber implements CategoryInterface {
string $content = '', string $content = '',
bool $wpUserPreview = false bool $wpUserPreview = false
): ?string { ): ?string {
if (!($subscriber instanceof SubscriberEntity)) {
return $shortcodeDetails['shortcode'];
}
$defaultValue = ($shortcodeDetails['action_argument'] === 'default') ? $defaultValue = ($shortcodeDetails['action_argument'] === 'default') ?
$shortcodeDetails['action_argument_value'] : $shortcodeDetails['action_argument_value'] :
''; '';
if (
!($subscriber instanceof SubscriberEntity)
&& $this->shouldReturnDefault((string)$shortcodeDetails['action'])
&& !empty($defaultValue)
) {
return $defaultValue;
}
if (!($subscriber instanceof SubscriberEntity)) {
return $shortcodeDetails['shortcode'];
}
switch ($shortcodeDetails['action']) { switch ($shortcodeDetails['action']) {
case 'firstname': case 'firstname':
return (!empty($subscriber->getFirstName())) ? htmlspecialchars($subscriber->getFirstName()) : $defaultValue; return (!empty($subscriber->getFirstName())) ? htmlspecialchars($subscriber->getFirstName()) : $defaultValue;
@@ -69,4 +81,8 @@ class Subscriber implements CategoryInterface {
return null; return null;
} }
} }
private function shouldReturnDefault(string $action): bool {
return in_array($action, self::DEFAULT_ALLOWED_ACTIONS, true);
}
} }

View File

@@ -65,6 +65,26 @@ class ShortcodesTest extends \MailPoetTest {
expect($requestData['newsletter_hash'])->equals($this->newsletter->hash); 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() { public function testItDisplaysManageSubscriptionFormForLoggedinExistingUsers() {
$wpUser = wp_set_current_user(1); $wpUser = wp_set_current_user(1);
expect((new WPFunctions)->isUserLoggedIn())->true(); expect((new WPFunctions)->isUserLoggedIn())->true();