有没有办法确保插件脚本在另一个脚本之前加载?

时间:2020-02-24 作者:Salih K

我创建了一个插件,它在页脚中加载了一些脚本。我想确保在加载任何其他脚本之前加载我的插件脚本。有没有办法做到这一点。过去几天我一直在支持这件事。实际上,我的插件添加了一个短代码,当调用该短代码时,它也会加载一个js文件。示例脚本如下:

add_action(\'after_setup_theme\', function() {
    add_shortcode(\'another-shortcode\', function($atts) {

       wp_enqueue_script(\'another-custom-script\', plugin_dir_url( __FILE__ ) . \'/another-custom-script.js\');
       //for test
        return getdate()[\'year\'];
    });
});

1 个回复
SO网友:WebElaine

短代码是在输出内容时解析的,所以问题可能是其他脚本总是首先包含,因为钩子wp_head() 在WP访问任何内容之前调用。

您可以在wp_enqueue_scripts 钩子,如果您可以找到一个查询条件来隔离希望脚本排队的位置:

<?php
add_action(\'wp_enqueue_scripts\', \'wpse_first_enqueue\', 1);
function wpse_first_enqueue() {
    // Only enqueue on your desired condition
    // In this example, only on individual Posts
    if(is_singular(\'post\')) {
        wp_enqueue_script(\'another-custom-script\', plugin_dir_url( __FILE__ ) . \'/another-custom-script.js\');
    }
}
?>
如果您计划分发插件,并且没有一个查询条件可以始终清楚地隔离脚本需要触发的位置,那么您可以考虑始终在前端以这种低优先级将其排队。您仍然可以让用户输入一个创建div的短代码,然后在JS中,如果内容中存在该div,则启动您的功能。(如果div不存在,请不要开火。)

或者,如果您只是将其用于自己的站点,并且所有JS文件都已正确排队,那么您可以将所有脚本出列,然后将所有依赖项重新排队。您不能说“先让这个脚本排队”,但可以说“确保在下一个脚本排队之前让脚本A排队。”缺点是您需要在每个前端页面上将脚本排队,但您可以再次设置一个等待条件,只有当有人在该页面上使用插件时才会触发。

<?php
add_action(\'wp_enqueue_scripts\', \'wpse_dequeue_and_re_enqueue\', 1);
function wpse_dequeue_and_re_enqueue() {
    // Step 1: Dequeue jQuery
    wp_dequeue_script(\'jquery\');
    // (continue dequeueing all JS scripts)
    // Step 2: Enqueue your script
    wp_enqueue_script(\'another-custom-script\', plugin_dir_url( __FILE__ ) . \'/another-custom-script.js\');
    // Step 3: Re-enqueue everything, with your script as dependency
    wp_enqueue_script(\'jquery\', \'/wp-includes/js/jquery/jquery.js\', array(\'another-custom-script\');
    // (continue re-enqueueing all scripts)
}
?>
您需要小心顺序和依赖关系,维护起来可能会很乏味,但这将保证(在当前主题和插件集的情况下)您的脚本总是包含在其他内容之前。

相关推荐