检查POST/页面、小部件和模板文件中的快捷代码

时间:2012-01-31 作者:robertharm

对于我的插件的下一个版本,请访问www.mapsmarker。com我只想在短代码[地图标记器…]的情况下输出插件的css和js文件已使用。对于帖子/和页面,我已经找到了以下工作代码:

function lmm_detect_shortcode()
{
    global $post;
    $pattern = get_shortcode_regex();
    preg_match_all( \'/\'. $pattern .\'/s\', $post->post_content, $matches );

    if( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( \'mapsmarker\', $matches[2] ) )
    {
        echo \'shortcode is used\';
    }
}
add_action( \'wp\', \'lmm_detect_shortcode\' );
问题是,映射也可以通过使用函数do\\u shortcode()直接嵌入到小部件(通过shortcode)或模板文件中(http://www.mapsmarker.com/docs/how-to-add-maps-to-your-site-using-template-tags/)如果这是真的,则上面的代码不会检查-导致地图无法显示。

作为一种解决方法,如果js/css文件只应在短代码添加到帖子或页面并添加描述时添加,我可以在插件设置中添加一个选项,如果地图通过短代码添加到小部件或通过do\\u shortcode()添加到模板文件,则禁用此设置。

由于这不是一个非常有用的解决方案(从长远来看,这会导致一些支持请求),我正在寻找一个解决方案,在这个解决方案中,我可以在默认情况下打开此功能,并且不必向设置中添加选项,因为代码还会检查是否在小部件中添加了短代码,或者是否通过其中一个模板文件中的do\\u shortcode()添加了短代码,如下所示:

....
if( ( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( \'mapsmarker\', $matches[2] ) ) || ( CHECK IF SHORTCODE USED IN WIDGETS == TRUE ) || ( CHECK IF SHORTCODE USED IN TEMPLATE FILES == TRUE ) )
{
    echo \'shortcode is used\';
}
.....
我解决这个问题的第一个方法是检查全局变量,看看是否可以以某种方式过滤掉这些添加的代码,例如通过$wp\\u filter(array)——一个包含所有已添加到过滤器/挂钩的函数的多维数组。不幸的是,我还没有找到解决办法。感谢您的帮助!

1 个回复
SO网友:ungestaltbar

有人可能会纠正我,但我认为从3.3版开始,您可以将帖子的脚本和样式“内联”排队。

意思是:你可以在你的快捷码函数中添加你的wp\\u enqueue\\u脚本/样式,WordPress会将它们添加到页脚。。。因为现在将它们添加到标题已经太晚了。

意思是:只要调用短代码,它就可以工作。

编辑:在回答Nick关于在何处添加排队功能的评论时:我使用codex中的示例短代码进行了快速测试:

function caption_shortcode( $atts, $content = null ) {
    wp_enqueue_script(\'myscript\',\'nonexistinglocation\');
    wp_enqueue_style(\'mystyle\',\'throwmeanerror\');
    return \'<span class="caption">\' . $content . \'</span>\';
}
在post content and text widget中对其进行了测试,并取得了一定的效果(不考虑无效的URL),当然应该在返回之前调用这些函数(是的,请以正确的方式执行,并提前注册您的脚本和样式[lazy])

结束

相关推荐

How to execute a shortcode?

我有一个WordPress选项,可以存储一些数据,例如:<h1>Header</h1> <p>Paragraph</p> [shortcodesomething/] [shortcode]Contents[/shortcode] 我正在使用显示此选项的值echo get_option(\'my_option\'));.当然,短代码不起作用,我想知道如何迫使他们做他们应该做的事情?echo do_shortcode(get_o