何时使用ADD_ACTION(‘init’)与ADD_ACTION(‘wp_enQueue_脚本’)

时间:2012-06-20 作者:N2Mystic

在我的主题功能中。php中,我调用add\\u操作以获得对jquery加载位置的控制(在页脚中以及主题的其他脚本中)。

我遇到的问题是,当我使用add\\u action(“wp\\u enqueue\\u scripts”)时,只有在没有加载插件的情况下才会触发。但是,add\\u action(“init”)方法在所有情况下都有效。

我想不起为什么,但我相信在这种情况下,add\\u action(\'wp\\u enqueue\\u scripts\')是首选。如果这是真的,我怎样才能让它在所有情况下都起作用?

在函数中。php

//if(!is_admin()){add_action(\'init\', \'my_theme_init\');} //THIS WORKS ALL THE TIME
//add_action(\'wp_enqueue_scripts\', \'my_theme_init\'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . \'/functions_public.php\');   
}
在functions\\u public中。php

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script(\'jquery\');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script(\'jquery\', get_bloginfo(\'template_directory\').\'/scripts.mythemescripts.js\',false,false,true);

wp_enqueue_script(\'jquery\');

}
第二种方法是使用add\\u action(\'wp\\u enqueue\\u scripts\'),显然在存在插件将脚本依赖性写入主题的情况下无法执行。

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

很多插件开发人员都没有正确的方式进行开发。正确的方法是wp_enqueue_scripts 就像你想做的那样。

但是,以下是在典型请求中运行挂钩的顺序:

加载的多插件分类法/li>

  • init
  • widgets\\u initregister\\u sidebarwp\\u register\\u sidebar\\u widgetwp\\u default\\u scriptswp\\u default\\u stypesadmin\\u initadd\\u admin\\u bar\\u菜单wp\\u加载解析请求
  • 发送\\u头
  • 解析查询pre\\u get\\u posts
  • posts\\u selection
  • wp
  • 模板重定向
  • get\\u header
  • wp_head
  • wp_enqueue_scripts
  • wp\\u print\\u样式。。。更重要的是,一些开发人员最初被告知init 让他们的脚本排队。在我们有wp_enqueue_script 胡克,这是做事情的“正确”方式,而保持这种做法的教程仍然在互联网上流传,腐蚀了其他优秀的开发人员。

    我的建议是将你的职能分为两部分。做你的wp_deregister_script/wp_register_scriptinit 钩住并使用wp_enqueue_scripts 在实际将jQuery排队时挂起。

    这将使您在将脚本排入队列时保持“正确操作”,并通过在将jQuery添加到队列之前将其替换为连接版本,帮助您避免数百名开发人员仍在“错误操作”。

    您还需要添加init 具有高优先级的挂钩:

    add_action( \'init\', \'swap_out_jquery\', 1 );
    function swap_out_jquery() {
        // ...
    }
    

  • SO网友:Chip Bennett

    这里有多个相互关联的问题。

    用于将脚本排队的正确操作挂钩是wp_enqueue_scripts要在页脚中打印脚本,请通过wp_enqueue_script(), 设置$footer 参数到trueadd_action( $hook, $callback ) 呼叫不应包含在任何内容中;让他们直接从functions.php is_admin() 在回调中进行条件检查

  • 无论出于何种原因,都不应该从主题中注销核心捆绑脚本。即使您的目的是脚本连接,这也是插件领域
  • 如果必须注销jquery,则wp_enqueue_scripts 太晚了。将注销/注册代码拆分为挂接到的回调init.get_template_directory() 而不是TEMPLATEPATH
  • 将所有这些放在一起:

    <?php
    function wpse55924_enqueue_scripts() {
        if ( ! is_admin() ) {
    
            // Dequeue jQuery
            wp_dequeue_script( \'jquery\' );
    
            // Register/enqueue a custom script, that includes jQuery
            wp_register_script( \'mythemescripts\', get_template_directory_uri() . \'/scripts.mythemescripts.js\', false, false,true );
            wp_enqueue_script( \'mythemescripts\' ); 
        }
    }
    add_action( \'wp_enqueue_scripts\', \'wpse55924_enqueue_scripts\', 99 );
    
    但是,这确实不是最好的方法。您最好的选择是删除注销核心jQuery的插件add\\u action()回调,或者使用不会像替换核心捆绑jQuery那样鲁莽的插件。

    SO网友:Den Pat

    这个答案并不完全针对您的问题,但代码中还有一个问题。

    You never need to use and should not use:

    wp_enqueue_script(\'jquery\');
    
    如果您想使用WordPress提供的jquery,那么最好的方法是,当您将自己的javascript文件排队时,将jquery作为依赖项传递,这样,它将由WordPress自己处理,您无需手动排队。

    示例:

    wp_enqueue_script( \'myjslib-handle\', get_stylesheet_directory_uri() . \'/js/myfile.js\', array(\'jquery\'), \'1.0.0\', true );
    
    array(\'jquery\') 在上面的代码中,是作为依赖项加载jquery所需的参数。

    结束

    相关推荐

    Custom Post Row Actions

    我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $