2016-04-22 160 views
2

雖然不是那個特定的問題,但這裏描述的問題 - https://wordpress.org/support/topic/select2-conflicting-with-acf-v5基本上也是我的問題。如何解決select2 3.5和4.0衝突

一個WordPress網站有兩個WordPress插件,一個使用選擇2 3.5版來處理所有的選擇元素,其他(包含在一個插件我寫的),使用4.0來處理某些特定的人。這導致錯誤

Error: select2.min.js?ver=3.4.5:21 Uncaught Error: Option 'multiple' is not allowed for Select2 when attached to a element.

有沒有可能的解決方案來解決這類問題?我應該嘗試檢測3.5是否已加載並嘗試避免衝突的設置?也許嘗試讓「我的」select2首先加載,並希望由於我更具體,不會與使用3.5的代碼衝突? (我的jQuery內部知識缺乏,當不同的插件嘗試使用相同的名稱時會發生什麼?)

回答

2

我面對與我的插件Popup Maker完全相同的問題。我發現這select2 multiple versions on same page/site可能是有用的,我唯一的問題是,我們不能總是控制訂單插件使用wp_enqueue_script加載他們的JS。

好吧,我所做的是讓我的腳本需要select2(DUH),然後就在我的腳本框中,我做了這樣的事情。

$.fn.pumSelect2 = $.fn.select2;

然後以後,而不是調用.select2()我用.pumSelect2()

這個偉大的工程我的情況是,我使用V4,其他人使用V3.5,有的甚至引導它變成自己的admin.js文件,使其加載,即使選擇2已經加載。

所以在其所有的黑客攻擊所有,但因爲我們是通過裝載使用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,如果有之前是一個加載的版本我恢復它,否則我擦除板岩,以便如果另一個加載沒有衝突出現。

我也修改爲pumselect2我wp_enqueue_script把手,使其被加載,即使別人負荷選擇2。

希望有所幫助。