Kilka miesięcy temu opublikowałem raport o tym błędzie ( na WordPress trac (błąd aktualizacji formularza wystąpienia widżetu) ) i pomyślałem, że też spróbuję o tym napisać tutaj. Może ktoś ma lepsze rozwiązanie tego problemu niż ja.
Zasadniczo problem polega na tym, że jeśli upuścisz widżet na pasku bocznym, formularz widżetu nie zostanie zaktualizowany, dopóki nie naciśniesz ręcznie przycisku Zapisz (lub przeładuj stronę).
To sprawia, że nie można użyć całego kodu z form()
funkcji, która polega na identyfikatorze instancji widgetu, aby coś zrobić (dopóki nie naciśniesz przycisku Zapisz). Wszelkie rzeczy, takie jak żądania ajax, rzeczy jQuery, takie jak dobór kolorów itp., Nie będą od razu działać, ponieważ z tej funkcji mogłoby się wydawać, że instancja widgetu nie została jeszcze zainicjowana.
Brudną poprawką byłoby automatyczne uruchamianie przycisku zapisywania przy użyciu czegoś takiego jak zapytanie na żywo :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
i dodaj .needfix
klasę, form()
jeśli instancja widgetu nie wygląda na zainicjowaną:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Wadą tego rozwiązania jest to, że jeśli masz zarejestrowanych wiele widżetów, przeglądarka zje dużo procesora, ponieważ kwerendy sprawdzają zmiany DOM co sekundę (chociaż nie testowałem tego specjalnie, to tylko moje przypuszczenie :)
Wszelkie sugestie dotyczące lepszego sposobu naprawienia błędu?
źródło
Odpowiedzi:
Ostatnio walczyłem z podobną sytuacją. Ajax w widżetach to nie żart! Musisz napisać całkiem zwariowany kod, aby wszystko działało w różnych instancjach. Nie jestem zaznajomiony z zapytaniem na żywo, ale jeśli powiesz, że sprawdza DOM co sekundę, mogę mieć dla ciebie mniej intensywne rozwiązanie:
Możesz przekazać tej funkcji selektor lub obiekt jQuery, który zwróci identyfikator instancji bieżącej instancji. Nie mogłem znaleźć innego rozwiązania tego problemu. Cieszę się, że nie jestem jedyny :)
źródło
Nie lubię odpowiadać na własne pytanie, ale wydaje mi się, że jest to jak dotąd najlepsze rozwiązanie:
Spowoduje to uruchomienie żądania zapisania widgetu zaraz po zakończeniu żądania zapisania widgetu (jeśli nie było odpowiedzi w formularzu HTML).
Należy dodać w
jQuery(document).ready()
funkcji.Teraz, jeśli chcesz łatwo ponownie dołączyć funkcje javascript do nowych elementów DOM dodanych przez funkcję formularza widgetu, po prostu powiąż je ze zdarzeniem „save_widget”:
źródło
Natknąłem się na to niedawno i wydaje się, że w tradycyjnym interfejsie „widgets.php” wszelkie inicjalizacje javascript powinny być uruchamiane bezpośrednio dla istniejących widgetów (tych w
#widgets-right
div) i pośrednio przezwidget-added
zdarzenie dla nowo dodanych widgetów; podczas gdy w dostosowywanym interfejsie „customize.php” wszystkie widżety - istniejące i nowe - są wysyłane dowidget-added
zdarzenia, więc można je tam po prostu zainicjować. W oparciu o to, poniższe rozszerzenie jest rozszerzeniemWP_Widget
klasy, co ułatwia dodanie inicjalizacji javascript do formularza widżetu poprzez przesłanianie jednej funkcjiform_javascript_init()
:Przykładowy widget testowy wykorzystujący to:
źródło
Myślę, że w Wordpress 3.9 istnieje coś, co może ci pomóc. Jest to wywołanie zwrotne zaktualizowane przez widget . Użyj tego w następujący sposób (coffeescript):
źródło