是否多次将脚本入队?

时间:2015-10-06 作者:Rich Jenks

我有一个脚本,该脚本需要通过一个短代码排队,通过wp_localize_script. 脚本在引导文件中注册,然后本地化,并在短代码中排队(因为在短代码中注册太晚了)。。

然而wp_enqueue_script 只允许每个脚本排队一次,因此,如果存在两个短代码实例,则只有具有最后一组参数的版本才能真正排队。

我宁愿不使用字符串替换和wp_footer 钩子多次输出脚本,因为它有点凌乱,但真正的限制是脚本需要通过短代码排队-有人知道如何实现这一点吗?

1 个回复
最合适的回答,由SO网友:Charlie Stanard 整理而成

我将根据米洛上面的回答提交一个答案,以帮助任何人在将来找到这个答案。我只想放一些简单的例子来说明这一点,但这不是经过测试的代码。

在我的示例中,我有一个接受Flickr photoset ID的库的快捷码,例如[flickr_gallery photoset_id="12345"]. 同一页上可以有多个此库实例,每个实例都需要使用唯一的ID进行初始化。

在设置短代码的PHP中,我有一个画廊ID的全局数组——每次呈现短代码时,它都会将唯一的画廊ID添加到数组中。然后,脚本只会排队一次,并且有一个库ID数组,我们可以在JavaScript中循环使用。

$gallery_ids = array();

function render_flickr_gallery_shortcode($atts = [], $content = null) {
    // typical shortcode stuff...

    global $gallery_ids;

    $gallery_ids[] = $atts[\'gallery_id\'];

    // localize previously registered script with array of gallery IDs
    wp_localize_script(\'some-javascript\', \'gallery_settings\', array(
        \'gallery_ids\' => $gallery_ids
    ));
    wp_enqueue_script(\'some-javascript\');
}

add_shortcode(\'flickr_gallery\', \'render_flickr_gallery_shortcode\');
然后在从短代码排队的JavaScript文件中:

jQuery(document).ready(function($) {
    var options = (typeof gallery_settings !== \'undefined\') ? gallery_settings : null;

    if (options && options.gallery_ids.length > 0) {
        for (var i = 0; i < options.gallery_ids.length; i++) {
            var galleryID = options.gallery_ids[i];

            $("#ff-" + galleryID).flexslider({
                animation           : "slide",
                animationLoop       : true,
                controlNav          : false,
                slideshow           : true,
                pauseOnHover        : true,
                smoothHeight        : true
            });
        }
    }
});

相关推荐