在wordpress中替换排队脚本的正确方法?

时间:2013-11-20 16:49:35

标签: php jquery wordpress jquery-ui wordpress-plugin

我需要从wordpress中删除jquery ui脚本(和其他一些)问题是如果我出列并取消注册它们然后调用它们的插件不起作用,因为脚本“丢失”即使我加载所有的jquery ui通过googleapis链接使用一个脚本。

我有以下内容:

add_action('wp_print_scripts','remove_excess_scripts', 100);
function remove_excess_scripts(){
  wp_dequeue_script( 'jquery-ui-core' );
  wp_dequeue_script( 'jquery-ui-widget' );
  wp_dequeue_script( 'jquery-ui-mouse' );
  wp_dequeue_script( 'jquery-ui-accordion' );
  wp_dequeue_script( 'jquery-ui-autocomplete' );
  wp_dequeue_script( 'jquery-ui-slider' );
  wp_dequeue_script( 'jquery-ui-progressbar' );
  wp_dequeue_script( 'jquery-ui-tabs' );
  wp_dequeue_script( 'jquery-ui-sortable' );
  wp_dequeue_script( 'jquery-ui-draggable' );
  wp_dequeue_script( 'jquery-ui-droppable' );
  wp_dequeue_script( 'jquery-ui-selectable' );
  wp_dequeue_script( 'jquery-ui-position' );
  wp_dequeue_script( 'jquery-ui-datepicker' );
  wp_dequeue_script( 'jquery-ui-tooltip' );
  wp_dequeue_script( 'jquery-ui-resizable' );
  wp_dequeue_script( 'jquery-ui-dialog' );
  wp_dequeue_script( 'jquery-ui-button' );

  wp_deregister_script( 'jquery-ui-core' );
  wp_deregister_script( 'jquery-ui-widget' );
  wp_deregister_script( 'jquery-ui-mouse' );
  wp_deregister_script( 'jquery-ui-accordion' );
  wp_deregister_script( 'jquery-ui-autocomplete' );
  wp_deregister_script( 'jquery-ui-slider' );
  wp_deregister_script( 'jquery-ui-progressbar' );
  wp_deregister_script( 'jquery-ui-tabs' );
  wp_deregister_script( 'jquery-ui-sortable' );
  wp_deregister_script( 'jquery-ui-draggable' );
  wp_deregister_script( 'jquery-ui-droppable' );
  wp_deregister_script( 'jquery-ui-selectable' );
  wp_deregister_script( 'jquery-ui-position' );
  wp_deregister_script( 'jquery-ui-datepicker' );
  wp_deregister_script( 'jquery-ui-tooltip' );
  wp_deregister_script( 'jquery-ui-resizable' );
  wp_deregister_script( 'jquery-ui-dialog' );
  wp_deregister_script( 'jquery-ui-button' );
}

在函数的早期,我正确地注册并将jquery ui排入队列:

wp_register_script(
        'jquery-ui-all',
        "http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js",
        array('jquery'),
        false,
        false
    );

function print_scripts() {
wp_enqueue_script( 'the-bootstrap' );   
}
add_action( 'wp_enqueue_scripts', 'print_scripts' );

(其中-stootstrap具有jquery-ui-all的依赖关系)

所有这一切都起到了从谷歌加载jquery-ui并且不再输出任何单个UI文件的意义 - 问题来自于插件WPFullCalendar用一堆jquery ui将各个脚本作为依赖项排入其脚本并且我猜他们已经取消注册并且出列了它的脚本没有得到输出,因为依赖项丢失了?我收到以下错误(由于没有输出JS文件)

Uncaught ReferenceError: WPFC is not defined 

如何替换脚本,以便其他插件仍然可以将它们排队或依赖它们,但它们都输出相同的文件。我可以这样做取消注册所有的名称然后再次注册与googleapis作为源,但然后我仍然会得到15个不同的HTTP请求所有相同的googleapi链接...我需要所有这些文件指向1 googleapi文件,仅供一个输出。这可能吗? (并且在其他插件已经成功调用/依赖它们之后,不应该将它们从队列中取出 - 在所有插件排队后发生wp_print_scripts,不是吗?)

更新

我已经将下面接受的答案修改为更具体一点,以便在涉及依赖关系时不要破坏任何其他内容。这是更新代码,可以正确地取消注册脚本并从依赖的任何脚本中删除它的依赖关系。确保如果这样做,用于替换取消注册的脚本的脚本在HTML(可能是头部)中加载得足够高,以便之后依赖于它的其他脚本。

//custom deregister scripts
function georgian_deregister_scripts(){
    global $wp_scripts;
    //scripts to deregister
    $deregisteredscripts = array('jquery-ui-core','jquery-ui-widget','jquery-ui-mouse','jquery-ui-accordion','jquery-ui-autocomplete','jquery-ui-slider','jquery-ui-progressbar' ,'jquery-ui-tabs','jquery-ui-sortable','jquery-ui-draggable','jquery-ui-droppable','jquery-ui-selectable','jquery-ui-position','jquery-ui-datepicker','jquery-ui-tooltip','jquery-ui-resizable','jquery-ui-dialog','jquery-ui-button');
    //degregister each script
    foreach($deregisteredscripts as $script)
      wp_deregister_script( $script );
    //remove deregistered scripts as dependencies of any other scripts depending on them  
    if(false != $wp_scripts->queue)
      foreach($wp_scripts->queue as $script)
        if(isset($wp_scripts->registered[$script]))
          $wp_scripts->registered[$script]->deps = array_diff($wp_scripts->registered[$script]->deps, $deregisteredscripts);
}
add_action('wp_enqueue_scripts', 'georgian_deregister_scripts', 101);

1 个答案:

答案 0 :(得分:3)

如果你取消注册脚本,它就不会被排队,所以你有几个无用的命令。

现在,如何删除要排队的(所有)脚本的依赖项?这个功能应该可以解决问题。

function customize_scripts_output(){
    global $wp_scripts;

    if(false != $wp_scripts->queue)
        foreach($wp_scripts->queue as $script)
            if(isset($wp_scripts->registered[$script]))
                $wp_scripts->registered[$script]->deps = array();
}
add_action('wp_enqueue_scripts', 'customize_scripts_output', 101);