使用指定值为每个[合作伙伴]快捷代码追加jQuery脚本

时间:2013-10-15 作者:user2537093

我正在尝试做一个快捷代码,它将向wp_footer.

这将是一个短代码示例:

function partners($atts ) {
    global $extra_options, $pslider;
    extract(shortcode_atts(array(  
            \'ids\' => null,
            \'extra_options\' => null
        ), $atts));  

    $pslider = \'partners-slider\'.rand(100,999);
    $ids = explode( \',\', $ids );
    $output = \'<div class="section row-one"><div class="col ps-gradient"><div class="ps-wrap"><div class="\'.$pslider.\'">\';
    foreach($ids as $id) {    
    $img_attr = wp_get_attachment_image_src( $id, \'full\' );
    $alt_text = get_post_meta( $id, \'_wp_attachment_image_alt\', true);
    $output .= \'<div class="pslide"><a href="\' . $alt_text . \'"><img src="\' . $img_attr[0] . \'" /></a></div>\';    
    }
    $output .= \'</div></div></div></div>\';
    return $output;  
}  

add_shortcode(\'partners\', \'partners\');
从上述函数中,我需要获取变量并将其放置在jQuery脚本中:

function print_partners_scripts() {
    global $extra_options, $pslider;
    echo \'<script type="text/javascript">\' . "\\n";
    echo \'jQuery(document).ready( function() {\'. "\\n";
    echo \'  $(".\'.$pslider.\'").bxSlider({
        slideWidth: 924,
        auto: 1,
        autoStart: 1,
        moveSlides: 1,
        minSlides: 7,
        maxSlides: 8,
        pager: false,
        controls: false,
        slideMargin: 5,
        autoHover: true
        \' . $extra_options . \'
        });\' . "\\n";
    echo \'});\' . "\\n";
    echo \'</script>\' . "\\n";
}

add_action( \'wp_footer\', \'print_partners_scripts\' );
好的,目前我有一个可以返回工作滑块的短代码。

但是,如果我在同一页上再次尝试使用此短代码,会怎么样?我已经检查过了,jQuery脚本将只追加一次。

我想为每个[合作伙伴]短代码生成这个jQuery脚本。

例如:

[partners extra_options="something: true"]
[partners extra_options="something: false"]
首先应该将此脚本添加到wp_footer:

<script type="text/javascript">
jQuery(document).ready( function() {
    $(".pslider342").bxSlider({
        slideWidth: 924,
        auto: 1,
        autoStart: 1,
        moveSlides: 1,
        minSlides: 7,
        maxSlides: 8,
        pager: false,
        controls: false,
        slideMargin: 5,
        autoHover: true,
        extra_options: true
    });
});
</script>
它成功了
第二个脚本应使用不同的变量添加相同的脚本:

<script type="text/javascript">
jQuery(document).ready( function() {
        $(".pslider456").bxSlider({
        slideWidth: 924,
        auto: 1,
        autoStart: 1,
        moveSlides: 1,
        minSlides: 7,
        maxSlides: 8,
        pager: false,
        controls: false,
        slideMargin: 5,
        autoHover: true,
        extra_options: false
    });
});
</script>
遗憾的是,没有添加此项。

真的需要你的帮助!

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

问题是,每次处理一个短代码时,您都会用新值覆盖以前的值,因此您总是只会获得最后一个短代码实例的数据。

在现有数据范围内工作的最简单方法是将数据放入数组中。

global $pslider;
// generate a unique identifier
$unique_id = uniqid();
// save your data under that unique key
$pslider[$unique_id] = \'some data\';
// use that unique ID in your markup
$output = \'<div id="partners-slider-\' . $unique_id . \'">\';


// then later in your footer funtion,
// loop over each instance and output your js
global $pslider;
foreach( $pslider as $id => $value ):
    echo \'unique ID: \' . $id;
    echo \'value: \' . $value;
endforeach;
就我个人而言,我避免像瘟疫一样的全球VAR。我会将这整件事包装在一个类中,并使用一个类var来存储您的数据。

结束

相关推荐

Stop parsing shortcodes

我想停止分析中的短代码the_content 但我正在努力寻找正确的过滤器。这不起作用:remove_filter( \'the_content\', \'do_shortcode\', 40 ); remove_filter( \'the_content\', \'run_shortcode\', 40 ); remove_filter( \'the_content\', \'wpautop\', 40 ); remove_filter( \'the_content\', \'a