Adds option to replace shortcodes in one string using contents from
another string Adds unit tests
This commit is contained in:
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user