Publiqué un informe de error sobre esto hace unos meses ( en WordPress trac (Error de actualización de formulario de instancia de widget) ) y pensé en intentar escribir sobre él aquí también. Quizás alguien tenga una mejor solución a este problema que yo.
Básicamente, el problema es que si suelta un widget en una barra lateral, el formulario del widget no se actualiza hasta que presiona guardar manualmente (o vuelve a cargar la página).
Esto hace inutilizable todo el código de la form()
función que se basa en el ID de la instancia del widget para hacer algo (hasta que presione el botón Guardar). Cualquier cosa como solicitudes de ajax, cosas de jQuery como selectores de color, etc., no funcionarán de inmediato, porque desde esa función parecería que la instancia del widget aún no se ha inicializado.
Una solución sucia sería activar el botón Guardar automáticamente usando algo como livequery :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
y agregue la .needfix
clase form()
si la instancia del widget no parece inicializada:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Un inconveniente de esta solución es que si tiene muchos widgets registrados, el navegador consumirá mucha CPU, porque livequery verifica los cambios de DOM cada segundo (aunque no lo probé específicamente, es solo mi suposición :)
¿Alguna sugerencia para una mejor manera de corregir el error?
fuente
Respuestas:
Luché con una situación similar recientemente. ¡Ajax en widgets no es broma! Necesito escribir un código bastante loco para que las cosas funcionen en todas las instancias. No estoy familiarizado con la consulta en vivo, pero si dice que comprueba el DOM cada segundo, podría tener una solución menos intensa para usted:
Puede pasar esta función un selector o un objeto jQuery y devolverá el ID de instancia de la instancia actual. No pude encontrar otra forma de solucionar este problema. Me alegra saber que no soy el único :)
fuente
No me gusta responder mi propia pregunta, pero creo que esta es la mejor solución hasta ahora:
Esto activará la solicitud ajax de guardar widget, justo después de que se haya completado una solicitud de guardar widget (si no hubo respuesta con el formulario html).
Necesita ser agregado en la
jQuery(document).ready()
función.Ahora, si desea volver a adjuntar fácilmente sus funciones de JavaScript a los nuevos elementos DOM agregados por la función de formulario de widget, simplemente vincúlelos al evento "saved_widget":
fuente
Me encontré con esto recientemente y parece que en la interfaz tradicional "widgets.php" cualquier inicialización de JavaScript debe ejecutarse directamente para los widgets existentes (aquellos en el
#widgets-right
div), e indirectamente a través delwidget-added
evento para widgets recién agregados; mientras que en la interfaz "personalizar.php" del personalizador, todos los widgets, existentes y nuevos, envían elwidget-added
evento, por lo que solo se pueden inicializar allí. En base a esto, la siguiente es una extensión de laWP_Widget
clase que facilita la adición de la inicialización de JavaScript al formulario de un widget anulando una funciónform_javascript_init()
:Un widget de prueba de ejemplo que usa esto:
fuente
Creo que existe algo en Wordpress 3.9 que podría ayudarte. Es la devolución de llamada actualizada por widget . Úselo así (coffeescript):
fuente