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\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 '<a href="' . esc_attr($previewUrl) . '" target="_blank" title="'
. esc_attr(__('Preview in a new tab', 'mailpoet')) . '">'
. esc_attr((string)$queue->getNewsletterRenderedSubject()) .
. esc_attr((string)$this->shortcodeProcessor->replace($queue->getNewsletterRenderedSubject())) .
'</a>';
}
}

View File

@@ -1,4 +1,4 @@
<?php
<?php declare(strict_types=1);
namespace MailPoet\Newsletter\Shortcodes\Categories;
@@ -12,6 +12,8 @@ use MailPoet\WP\Functions as WPFunctions;
class Subscriber implements CategoryInterface {
const DEFAULT_ALLOWED_ACTIONS = ['firstname', 'lastname', 'displayname'];
/** @var SubscribersRepository */
private $subscribersRepository;
@@ -34,12 +36,22 @@ class Subscriber implements CategoryInterface {
string $content = '',
bool $wpUserPreview = false
): ?string {
if (!($subscriber instanceof SubscriberEntity)) {
return $shortcodeDetails['shortcode'];
}
$defaultValue = ($shortcodeDetails['action_argument'] === 'default') ?
$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']) {
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);
}
}

View File

@@ -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();