我的插件Popup Maker 面临完全相同的问题。我发现这个select2 multiple versions on same page/site 可能有用,我预见到的唯一问题是我们不能总是控制插件使用 wp_enqueue_script 加载其 JS 的顺序。
好吧,我所做的就是让我的脚本需要 select2 (DUH),然后在我的脚本外壳内我做了类似的事情。
$.fn.pumSelect2 = $.fn.select2;
然后我使用.pumSelect2(),而不是调用.select2()。
这非常适合我的情况,即我使用 v4,其他人使用 v3.5,有些甚至将其引导到他们自己的 admin.js 文件中,因此即使 select2 已经加载,它也会加载。
总而言之,这是一个 hack,但因为我们通过使用 wp_enqueue_script 加载以正确的方式进行操作。
如果 select2 已入队,我也会将其出队。
// Deregister older versions, loaded by Types, Advanced Custom Fields etc.
if ( wp_script_is( 'select2', 'registered' ) ) {
wp_deregister_script( 'select2' );
}
wp_register_script( 'select2', $js_dir . 'select2.full' . $suffix, array( 'jquery' ), '4.0.1' );
`
目前的最终方法
经过进一步测试,并且由于许多其他插件使用旧版本的自定义可能会破坏这就是我想出的。
在我的 select2.full.js 文件中
对于加载jQuery并调用工厂的开头部分
(function (factory) {
var existingVersion = jQuery.fn.select2 || null;
if (existingVersion) {
delete jQuery.fn.select2;
}
if (typeof define === 'function' && define.amd !== undefined && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node/CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
jQuery.fn.pumselect2 = jQuery.fn.select2;
if (existingVersion) {
delete jQuery.fn.select2;
jQuery.fn.select2 = existingVersion;
}
}(function (jQuery) {
在这种情况下,我基本上将它引导到一个新名称 pumselect2,如果之前有加载版本,我会恢复它,否则我会擦除石板,以便在加载另一个版本时不会出现冲突。
我还将我的 wp_enqueue_script 句柄修改为 pumselect2,这样即使其他人加载了 select2,它也会被加载。
希望对您有所帮助。