2016-08-23 49 views
0

首先,我要求你们所有人在点击负向箭头前全部阅读这个问题,我真的在这里遇到一个非常有线的问题,而且没有在网上找到任何类似的答案。如何在wordpress短代码中多次停止排队同一个脚本

我想要做的事:

我创建一个WordPress插件安装,你只需要添加一个短代码,并通过一些参数与简码后,然后它会显示一个滑块根据您的参数数据在您的文章中。

现在,因为它是一个滑块,它主要是基于jQuery做花哨的东西。现在将shortcode参数传递给jquery,我正在接受wp_localize_script()的帮助,以便我可以访问我的jquery脚本中的shortcode参数。

问题:

正如我传递简码属性值的本地化剧本,我必须要调用wp_register_script()wp_localize_script()wp_enqueue_script()所有add_shortcode()块内。

因为如果我在add_shortcode()之外创建另一个函数来排列我的脚本wp wp_enqueue_scripts动作,那么即使在执行短代码之前它也会被触发。所以wp_localize_script()不能将shortcode属性传递给jquery脚本。现在

add_shortcode('some_shortcode', function($atts) { 
    //extracting the shortcode attributes 
    $shortcode_data = shortcode_atts(array(
     'arg1' => '', 
     'arg2' => '' 
     ..... so on.... 

    ), $atts); 

    extract($shortcode_data); 

    // doing my programming with the shortcode 

    // in the end echoing some html 

    /*--------------------------------------*/ 

    // Now coming the script adding part 

    $dir = plugin_dir_url(__FILE__); 

    /* CSS */ 
    wp_enqueue_style('some_style', $dir . 'assets/css/some_style.css', null, null); 

    /* JS */ 
    wp_register_script ('some_script', $dir . 'assets/js/some_script.js'); 
    wp_localize_script('some_script', 'someData', $shortcode_data); 
    wp_enqueue_script('some_script', true); 
    wp_enqueue_script('some_other_script', $dir . 'assets/js/some_other_script.js'); 

}); 

我的插件工作得很好,没有任何问题,但无论如何现在而来的大问题。如果我在一个或多个页面中包含这个短代码超过1次,那么每次执行短代码时都会推送相同的css和js文件。

因此,最终,没有一个短代码能够正常工作,因为整个系统会混淆哪些数据传递给哪个js脚本。

如果你们中的任何人都可以帮助我解决这个奇怪的问题,那将会非常有帮助。我真的没有了解如何解决这个奇怪问题的线索。

+2

你确定同一个脚本获得双入列吗?你见过这个吗? WP入队系统是为了防止这种情况发生,只要名称标识符和版本每次都是相同的(在你的情况下它们会是)。 –

+0

使用oop你可以解决这个问题。只需将脚本排入类的构造函数中即可。 –

+0

让我重新审视。给我2分钟 – iSaumya

回答

1

您可以创建一个不同的函数来检查帖子中是否存在短代码,并为您的滑块排入必需的javascript和css。

例如

// Shortcode handler 
add_shortcode('some_shortcode', function($atts) { 

    $a = shortcode_atts(array(
     'arg1' => '', 
     'arg2' => '' 

    ), $atts); 
    /** I would avoid using script localization unless you need script dependancy based on generated js from 
     * atts data. you can just return the js script directly on your content. 
     * 
     */ 
    $script = '<script>(function {'; 
    $script .= "var arg1 = {$a['arg1']},"; 
    $script .= " arg2 = {$a['arg2']}"; 
    $script .= '})(jQuery);</scipt>'; 
    return script; 
}); 

// Script Dependancy Handling 
add_action('wp_enqueue_scripts', 'script_style_handler'); 
function script_style_handler() { 
    global $post; 
    //check shortcode existence in post content and enque script/style if found 
    if(is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'some_shortcode') && !is_admin()) { 
     wp_enqueue_style('some_style', $dir . 'assets/css/some_style.css', null, null); 
     wp_enqueue_script('some_other_script', $dir . 'assets/js/some_other_script.js'); 
    } 
}