2016-04-22 11 views
2

Während nicht dieses spezielle Problem, ist das Problem, das hier beschrieben - https://wordpress.org/support/topic/select2-conflicting-with-acf-v5 ist im Grunde auch mein Problem.Wie können select2 3.5 und 4.0 Konflikte gelöst werden

Eine Wordpress-Site hat zwei Wordpress-Plugins, eines verwendet select2 Version 3.5, um alle ausgewählten Elemente zu behandeln, das andere (in einem Plugin, das ich geschrieben habe) verwendet 4.0, um einige spezifische zu behandeln. Dies führt zu einem Fehler von

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

Gibt es eine mögliche Lösung für diese Art von Problem? Sollte ich nur versuchen zu erkennen, dass 3.5 geladen ist und versuchen, widersprüchliche Einstellungen zu vermeiden? vielleicht versuchen, "meine" select2 zuerst laden und hoffe, dass, da ich genauer bin, wird es keine Konflikte mit dem Code, der 3,5 verwendet? (Mein Wissen über jQuery Interna fehlt, was passiert, wenn verschiedene Plugins versuchen, den gleichen Namen zu verwenden?)

Antwort

2

Ich bin mit dem gleichen Problem mit meinem Plugin Popup Maker konfrontiert. Ich fand diese select2 multiple versions on same page/site, die nützlich sein kann, das einzige Problem, das ich vorhersehe, ist, dass wir nicht immer kontrollieren können, dass die Bestell-Plugins ihre JS mit wp_enqueue_script laden.

Ok, was ich getan habe, wurde mein Skript erfordert SELECT2 (DUH), dann nur in meinem Skripten Gehäuse habe ich etwas wie das getan.

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

dann später statt .select2() des Aufrufs ich .pumSelect2().

Das funktioniert gut für meine Situation, die ich v4 verwende, andere verwenden v3.5, einige sogar Bootstrap es in ihre eigene admin.js-Datei, so dass es geladen wird, obwohl select2 bereits geladen ist.

Also alles in allem ist es ein Hack, aber da wir es richtig machen, indem wir mit wp_enqueue_script laden.

Ich nehme auch select2 aus der Warteschlange, wenn es eingereiht ist.

// 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'); 

`

letzte Methode For Now

Nach weiteren Tests und da so viele andere Plugins verwenden alte Versionen mit Anpassungen, die wahrscheinlich bricht das ist, was ich kam mit.

In meinem select2.full.js

Für den Öffnungsbereich-Datei, die jQuery und Anrufe Fabrik

(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) { 

Grundsätzlich ich Bootstrap es zu einem neuen Namen in diesem Fall pumselect2 lädt, und wenn es zuvor habe ich eine geladene version wiederhergestellt, ansonsten wische ich die slate ab, so dass bei einem anderen laden kein konflikt entsteht.

Auch ich meine Handle wp_enqueue_script zu pumselect2 geändert, so dass es geladen wird, auch wenn jemand anderes select2 lädt.

Hoffe, dass hilft.

Verwandte Themen