Adds option to replace shortcodes in one string using contents from

another string
Adds unit tests
This commit is contained in:
Vlad
2017-07-30 11:24:52 -04:00
committed by pavel-mailpoet
parent 334c3ff420
commit 7c30192a03
4 changed files with 45 additions and 6 deletions

View File

@ -94,7 +94,13 @@ class Newsletter {
// extract and save newsletter posts // extract and save newsletter posts
PostsTask::extractAndSave($rendered_newsletter, $newsletter); PostsTask::extractAndSave($rendered_newsletter, $newsletter);
// update queue with the rendered and pre-processed newsletter // update queue with the rendered and pre-processed newsletter
$queue->newsletter_rendered_subject = Shortcodes::process($newsletter->subject, $newsletter, null, $queue); $queue->newsletter_rendered_subject = ShortcodesTask::process(
$newsletter->subject,
$rendered_newsletter['html'],
$newsletter,
null,
$queue
);
$queue->newsletter_rendered_body = $rendered_newsletter; $queue->newsletter_rendered_body = $rendered_newsletter;
$queue->save(); $queue->save();
// catch DB errors // catch DB errors
@ -123,6 +129,7 @@ class Newsletter {
); );
$prepared_newsletter = ShortcodesTask::process( $prepared_newsletter = ShortcodesTask::process(
$prepared_newsletter, $prepared_newsletter,
null,
$newsletter, $newsletter,
$subscriber, $subscriber,
$queue $queue

View File

@ -1,4 +1,5 @@
<?php <?php
namespace MailPoet\Cron\Workers\SendingQueue\Tasks; namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
@ -6,8 +7,8 @@ use MailPoet\Newsletter\Shortcodes\Shortcodes as NewsletterShortcodes;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Shortcodes { class Shortcodes {
static function process($content, $newsletter, $subscriber, $queue) { static function process($content, $content_source = null, $newsletter = null, $subscriber = null, $queue = null) {
$shortcodes = new NewsletterShortcodes($newsletter, $subscriber, $queue); $shortcodes = new NewsletterShortcodes($newsletter, $subscriber, $queue);
return $shortcodes->replace($content); return $shortcodes->replace($content, $content_source);
} }
} }

View File

@ -91,12 +91,18 @@ class Shortcodes {
return $processed_shortcodes; return $processed_shortcodes;
} }
function replace($content, $categories = false) { function replace($content, $content_source = null, $categories = null) {
$shortcodes = $this->extract($content, $categories); $shortcodes = $this->extract($content, $categories);
if(!$shortcodes) { if(!$shortcodes) {
return $content; return $content;
} }
$processed_shortcodes = $this->process($shortcodes, $content); // if content contains only shortcodes (e.g., [newsletter:post_title]) but their processing
// depends on some other content (e.g., "post_id" inside a rendered newsletter),
// then we should use that content source when processing shortcodes
$processed_shortcodes = $this->process(
$shortcodes,
($content_source) ? $content_source : $content
);
$shortcodes = array_intersect_key($shortcodes, $processed_shortcodes); $shortcodes = array_intersect_key($shortcodes, $processed_shortcodes);
return str_replace($shortcodes, $processed_shortcodes, $content); return str_replace($shortcodes, $processed_shortcodes, $content);
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace MailPoet\Test\Cron\Workers\SendingQueue\Tasks; namespace MailPoet\Test\Cron\Workers\SendingQueue\Tasks;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes; use MailPoet\Cron\Workers\SendingQueue\Tasks\Shortcodes;
@ -8,6 +9,16 @@ use MailPoet\Models\SendingQueue;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class ShortcodesTest extends \MailPoetTest { class ShortcodesTest extends \MailPoetTest {
function _before() {
$this->WP_post = wp_insert_post(
array(
'post_title' => 'Sample Post',
'post_content' => 'contents',
'post_status' => 'publish',
)
);
}
function testItCanReplaceShortcodes() { function testItCanReplaceShortcodes() {
$queue = $newsletter = (object)array( $queue = $newsletter = (object)array(
'id' => 1 'id' => 1
@ -18,12 +29,26 @@ class ShortcodesTest extends \MailPoetTest {
'last_name' => 'Doe' 'last_name' => 'Doe'
); );
$rendered_body = '[subscriber:firstname] [subscriber:lastname]'; $rendered_body = '[subscriber:firstname] [subscriber:lastname]';
$result = Shortcodes::process($rendered_body, $newsletter, $subscriber, $queue); $result = Shortcodes::process($rendered_body, null, $newsletter, $subscriber, $queue);
expect($result)->equals('John Doe'); expect($result)->equals('John Doe');
} }
function testItCanReplaceShortcodesInOneStringUsingContentsFromAnother() {
$wp_post = get_post($this->WP_post);
$content = 'Subject line with one shortcode: [newsletter:post_title]';
$content_source = '<a data-post-id="' . $this->WP_post . '" href="#">latest post</a>';
// [newsletter:post_title] depends on the "data-post-id" tag and the shortcode will
// get replaced with an empty string if that tag is not found
expect(trim(Shortcodes::process($content)))->equals('Subject line with one shortcode:');
// when tag is found, the shortcode will be processed and replaced
expect(Shortcodes::process($content, $content_source))->equals('Subject line with one shortcode: ' . $wp_post->post_title);
}
function _after() { function _after() {
\ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
\ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
wp_delete_post($this->WP_post, true);
} }
} }