Ich habe vor ein paar Monaten einen Fehlerbericht darüber gepostet ( auf WordPress trac (Widget Instance Form Update Bug) ) und ich dachte, ich würde versuchen, hier auch darüber zu schreiben. Vielleicht hat jemand eine bessere Lösung für dieses Problem als ich.
Grundsätzlich besteht das Problem darin, dass beim Ablegen eines Widgets in einer Seitenleiste das Widget-Formular erst aktualisiert wird, wenn Sie manuell auf Speichern klicken (oder die Seite neu laden).
Dies macht den gesamten Code aus der form()
Funktion, die sich auf die Widget-Instanz-ID stützt, unbrauchbar , um etwas zu tun (bis Sie auf die Schaltfläche Speichern klicken). Jegliche Dinge wie Ajax-Anfragen, jQuery-Dinge wie Farbwähler usw. funktionieren nicht sofort, da es den Anschein hat, dass die Widget-Instanz aufgrund dieser Funktion noch nicht initialisiert wurde.
Ein schmutziger Fix wäre, den Speichern-Button automatisch auszulösen, indem man so etwas wie livequery benutzt :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
und fügen Sie die .needfix
Klasse hinzu, form()
wenn die Widget-Instanz nicht initialisiert aussieht:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Ein Nachteil dieser Lösung ist, dass wenn Sie viele Widgets registriert haben, der Browser viel CPU verbraucht, da sich die Live-Abfrage nach DOM-Änderungen jede Sekunde ändert (obwohl ich dies nicht speziell getestet habe, ist es nur meine Annahme :)
Irgendwelche Vorschläge für einen besseren Weg, um den Fehler zu beheben?
quelle
Antworten:
Ich habe in letzter Zeit mit einer ähnlichen Situation gekämpft. Ajax in Widgets ist kein Witz! Sie müssen einen ziemlich verrückten Code schreiben, damit die Dinge instanzenübergreifend funktionieren. Ich bin mit Live-Abfragen nicht vertraut, aber wenn Sie sagen, dass das DOM jede Sekunde überprüft wird, könnte ich eine weniger intensive Lösung für Sie haben:
Sie können dieser Funktion einen Selektor oder ein jQuery-Objekt übergeben und es wird die Instanz-ID der aktuellen Instanz zurückgegeben. Ich konnte dieses Problem nicht anders lösen. Freut mich zu hören, dass ich nicht der einzige bin :)
quelle
Ich beantworte meine eigene Frage nicht gern, aber ich halte dies für die beste Lösung:
Dadurch wird die Ajax-Anforderung zum Speichern von Widgets ausgelöst, unmittelbar nachdem eine Anforderung zum Speichern von Widgets abgeschlossen wurde (falls keine Antwort mit dem Formular "html" eingegangen ist).
Es muss in der
jQuery(document).ready()
Funktion hinzugefügt werden.Wenn Sie Ihre Javascript-Funktionen jetzt einfach wieder an die neuen DOM-Elemente anhängen möchten, die von der Widget-Formularfunktion hinzugefügt wurden, binden Sie sie einfach an das Ereignis "saved_widget":
quelle
Stieß in letzter Zeit darauf und es scheint, dass in der traditionellen "widgets.php" -Schnittstelle jede JavaScript-Initialisierung direkt für vorhandene Widgets (die in der
#widgets-right
div) und indirekt über daswidget-added
Ereignis für neu hinzugefügte Widgets ausgeführt werden sollte; wohingegen in der customizer "customise.php" -Schnittstelle alle Widgets - existierende und neue - daswidget-added
Ereignis gesendet werden und nur dort initialisiert werden können. Darauf aufbauend ist das Folgende eine Erweiterung derWP_Widget
Klasse, die es einfach macht, eine JavaScript-Initialisierung zum Formular eines Widgets hinzuzufügen, indem eine Funktion überschrieben wirdform_javascript_init()
:Ein Beispiel für ein Test-Widget, das dies verwendet:
quelle
Ich denke, in Wordpress 3.9 gibt es etwas, das Ihnen helfen könnte. Es ist der Widget-aktualisierte Rückruf. Benutze es so (coffeescript):
quelle