Não sou especialista em jQuery, mas deparei com o mesmo problema e acredito que tenho uma solução viável. O problema é que toda vez que você executa o wp_localize_script, ele cria uma variável javascript usando a configuração $ name. No seu caso, isso é 'carouselvars'. Como isso é definido antes do jQuery em execução, somente os últimos valores passados para a variável são 'vistos' por jQuery, então, novamente no seu caso, settingObj.autoscroll sempre será o valor definido na última instância do shortcode .
Minha solução é definir um nome de variável dinâmica para a chamada wp_localize_script, algo como:
wp_localize_script('owlcarouselcustom', 'carouselvars' . $instance, array(
'autoscroll' => $autoscroll
)
);
em que $ instance pode ser o que o usuário quiser definir. Então, o uso seria:
[recent_products_slider instance=1 autoscroll=0]
[recent_products_slider instance=2 autoscroll=1]
e seu código para extrair as configurações precisariam ser:
extract(shortcode_atts(array(
'title' => 'Recent Products',
'order' => 'DESC',
'orderby' => 'date',
'mousewheel' => 'false',
'autoscroll' => '1',
'swipe' => 'false',
'scroll' => '1',
'items' => 6,
'instance' => 1
), $atts));
Tenho certeza de que há uma maneira mais inteligente de fazer isso, portanto nenhuma instância precisa ser definida, mas, como eu disse, não sou especialista em jQuery.
Em seguida, o truque é obter os dados corretos para acessar a instância correta do shortcode. Eu fiz isso usando tipos de dados html5. Então, na parte php do seu código, acho que seria melhor fazer isso:
<div id="owl-' . $instance . '" class="owl-carousel" data-instance="' . $instance . '">
Então o seu jQuery ficaria assim:
jQuery(document).ready(function($) {
$('.owl-carousel').each(function( index ) {
var instance = $( this ).data('instance');
SetOwlCarousel(instance);
});
});
function SetOwlCarousel(instance) {
var settingObj = window["carouselvars"+instance];
var owlcontainer = $("#owl-" + instance);
if(settingObj.autoscroll == 1) {settingObj.autoscroll = true;} else {settingObj.autoscroll = false;}
jQuery(owlcontainer).owlCarousel({
autoPlay: settingObj.autoscroll,
});
});
}
Portanto, este script jQuery fará um loop em cada instância de '.owl-carrossel' e executará a função SetOwlCarousel nele. Chamar o objeto window ao definir settingObj permite que você avalie "carouselvars" + instance para a variável que você definiu usando wp_localize_script, portanto, no meu exemplo carouselvars1 e carouselvars2.
Se alguém tiver uma maneira mais limpa de fazer isso, eu adoraria usá-lo, mas isso deve dar a você o que você está procurando. Eu não testei este código, mas é substancialmente o mesmo que eu usei, o que funcionou.