2016-08-23 20 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'); 
    } 
}