在一个我称为file-a.php的文件中,我创建了一个短代码,该短代码将打印以下(简化的)HTML标记:
<div><a href="#"><span>Link text</span></a></div>
在文件b.php中,我恢复了[简码]并将其放入javascript变量中:
var myvariable = "<?php print do_shortcode('[shortcode]'); ?>";
这是我打印“ myvariable”时得到的HTML标记:
<div><a href="#"><span>Link text
实际上,当检测到第一个“ /”时,标记会中断。
我尝试咨询一些资源,但尚未找到任何解决方案。请考虑我对PHP和JS的了解。谢谢,如果您能为我提供一个可能的解决方案。
答案 0 :(得分:1)
您必须使用目标语言(JavaScript)的规则对do_shortcode()
返回的值进行编码。
对字符串进行编码以生成JavaScript代码的最佳PHP方法是json_encode()
。
您的代码应为:
var myvariable = <?php print json_encode(do_shortcode('[shortcode]')); ?>;
不再需要用引号引起来。如果提供了字符串,json_encode()
会产生输入字符串的表示形式,该表示形式是有效的JavaScript字符串源代码。
例如,如果do_shortcode('[shortcode]')
返回<div><a href="#"><span>Link text</span></a></div>
,则上面的代码行将产生:
var myvariable = "<div><a href=\"#\"><span>Link text<\/span><\/a><\/div>"
是有效的JavaScript代码,它将上述字符串放入JavaScript变量myvariable
中。
答案 1 :(得分:0)
谢谢您的回答。这是file-a.php(functions.php,WordPress)中的代码:
function shortcode_function() {
print '<p>Test</p>';
}
add_shortcode( 'shortcode', 'shortcode_function' );
这是file-b.php(footer.php,WordPress)中的代码:
<script>
jQuery(document).ready(function($) {
var myvariable = "<?php print do_shortcode('[shortcode]'); ?>";
$( '.footer' ).prepend( myvariable );
});
</script>
如您所见,这将返回一个损坏的
标签。
<script>
jQuery(document).ready(function($) {
var myvariable = "<p>Test";
$( '.footer' ).prepend( 'myvariable );
});
</script>
</body>
</html>
这是带有json_encode()(带引号和不带引号)的结果,在公共页面上看不到任何内容:
var myvariable = "<?php print json_encode(do_shortcode('[shortcode]')); ?>";
var myvariable = "<p>Test""";
var myvariable = <?php print json_encode(do_shortcode('[shortcode]')); ?>;
var myvariable = <p>Test"";
在实践中,我试图在页脚区域之前打印一些动态数据,即通过PHP查询从数据库提取的数据。 动态数据已正确打印,但HTML标记不正确。
答案 2 :(得分:0)
这是我的解决方案。它以其基本形式工作,现在我正在扩展它。
我在functions.php中使用反斜杠转义了斜杠>
print "<p class='red'>RED<\/p>";
这将在footer.php中返回以下代码:
var str = "<p class='red'>RED<\/p>";
我所要做的就是清理字符串,就像这样:
var sanitized_str = str.replace(/\\/g, '');
Javascript变量...
sanitized_str
...已正确渲染,打印时可以在网上看到正确的HTML标记,如下所示:
$( '.footer' ).prepend( sanitized_str );
页面标记中的所有标签均未正确关闭(例如
,但公共结果已被清理且清晰可见。