diff --git a/mailpoet/lib/Form/Block/BlockRendererHelper.php b/mailpoet/lib/Form/Block/BlockRendererHelper.php index ab64cbf2f7..3bf852c33a 100644 --- a/mailpoet/lib/Form/Block/BlockRendererHelper.php +++ b/mailpoet/lib/Form/Block/BlockRendererHelper.php @@ -258,6 +258,15 @@ class BlockRendererHelper { return join(' ', $modifiers); } + public function escapeShortCodes(?string $value): ?string { + if ($value === null) { + return null; + } + return preg_replace_callback('/' . $this->wp->getShortcodeRegex() . '/s', function ($matches) { + return str_replace(['[', ']'], ['[', ']'], $matches[0]); + }, $value); + } + private function translateValidationErrorMessage(string $validate): string { switch ($validate) { case 'email': diff --git a/mailpoet/lib/Form/Block/Textarea.php b/mailpoet/lib/Form/Block/Textarea.php index 46f3dd2bf8..c8be5205ef 100644 --- a/mailpoet/lib/Form/Block/Textarea.php +++ b/mailpoet/lib/Form/Block/Textarea.php @@ -55,7 +55,7 @@ class Textarea { $html .= 'style="' . $this->wp->escAttr($styles) . '" '; } - $html .= '>' . $this->rendererHelper->getFieldValue($block) . ''; + $html .= '>' . $this->rendererHelper->escapeShortCodes($this->rendererHelper->getFieldValue($block)) . ''; return $this->wrapper->render($block, $html); } diff --git a/mailpoet/lib/WP/Functions.php b/mailpoet/lib/WP/Functions.php index f3f81b4997..b8bb6c383e 100644 --- a/mailpoet/lib/WP/Functions.php +++ b/mailpoet/lib/WP/Functions.php @@ -881,4 +881,8 @@ class Functions { return false; } + + public function getShortcodeRegex($tagnames = null): string { + return get_shortcode_regex($tagnames); + } } diff --git a/mailpoet/tests/integration/Form/Block/BlockRendererHelperTest.php b/mailpoet/tests/integration/Form/Block/BlockRendererHelperTest.php new file mode 100644 index 0000000000..b52bee9bfd --- /dev/null +++ b/mailpoet/tests/integration/Form/Block/BlockRendererHelperTest.php @@ -0,0 +1,16 @@ +diContainer->get(BlockRendererHelper::class); + $escaped = $rendererHelper->escapeShortCodes($text); + expect($escaped)->equals('[mailpoet_subscribers_count] [gallery attr="attr"]inside[/gallery][unknown]'); + } +} diff --git a/mailpoet/tests/unit/Form/Block/TextareaTest.php b/mailpoet/tests/unit/Form/Block/TextareaTest.php index c979b0d7e8..48727342fa 100644 --- a/mailpoet/tests/unit/Form/Block/TextareaTest.php +++ b/mailpoet/tests/unit/Form/Block/TextareaTest.php @@ -62,6 +62,7 @@ class TextareaTest extends \MailPoetUnitTest { $this->rendererHelperMock->expects($this->once())->method('getInputValidation')->willReturn(' validation="1" '); $this->rendererHelperMock->expects($this->once())->method('getInputModifiers')->willReturn(' modifiers="mod" '); $this->rendererHelperMock->expects($this->once())->method('getFieldValue')->willReturn('val'); + $this->rendererHelperMock->expects($this->once())->method('escapeShortCodes')->will($this->returnArgument(0)); $this->stylesRendererMock->expects($this->once())->method('renderForTextInput')->willReturn('border-radius: 10px;'); $html = $this->textarea->render($this->block, []);