Publiquei um relatório de bug sobre isso há alguns meses atrás ( no WordPress trac (Bug de atualização do formulário da instância de widget) ) e pensei em tentar escrever sobre isso aqui também. Talvez alguém tenha uma solução melhor para esse problema do que eu.
Basicamente, o problema é que, se você soltar um widget em uma barra lateral, o formulário não será atualizado até que você pressione manualmente salvar (ou recarregar a página).
Isso torna inutilizável todo o código da form()
função que depende do ID da instância do widget para fazer alguma coisa (até você pressionar o botão Salvar). Coisas como solicitações de ajax, coisas do jQuery, como seletores de cores etc. não funcionarão imediatamente, porque a partir dessa função parece que a instância do widget ainda não foi inicializada.
Uma correção suja seria acionar o botão salvar automaticamente usando algo como livequery :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
e adicione a .needfix
classe form()
se a instância do widget não parecer inicializada:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Uma desvantagem desta solução é que, se você tiver muitos widgets registrados, o navegador consumirá muita CPU, porque o livequery verifica se há alterações no DOM a cada segundo (embora eu não testei isso especificamente, é apenas minha suposição :)
Alguma sugestão para uma maneira melhor de corrigir o erro?
fonte
Respostas:
Eu lutei com uma situação semelhante recentemente. Ajax em widgets não é brincadeira! É necessário escrever um código bem louco para que as coisas funcionem entre instâncias. Não estou familiarizado com a consulta ao vivo, mas se você diz que verifica o DOM a cada segundo, talvez eu tenha uma solução menos intensa para você:
Você pode passar para essa função um objeto seletor ou jQuery e ele retornará o ID da instância atual. Não consegui encontrar outra maneira de contornar esse problema. Fico feliz em ouvir que eu não sou o único :)
fonte
Não gosto de responder minha própria pergunta, mas sinto que esta é a melhor solução até agora:
Isso acionará a solicitação ajax de economia de widget, logo após a conclusão de uma solicitação de economia de widget (se não houver resposta com o formulário html).
Ele precisa ser adicionado na
jQuery(document).ready()
função.Agora, se você deseja reconectar facilmente suas funções javascript aos novos elementos DOM adicionados pela função de formulário do widget, basta vinculá-los ao evento "saved_widget":
fonte
Cheguei a isso recentemente e parece que na interface tradicional "widgets.php" qualquer inicialização javascript deve ser executada diretamente para os widgets existentes (aqueles na
#widgets-right
div) e indiretamente através dowidget-added
evento para widgets adicionados recentemente; enquanto na interface "customize.php" do personalizador todos os widgets - existentes e novos - são enviados aowidget-added
evento, para que possam ser inicializados apenas lá. Com base nisso, há uma extensão daWP_Widget
classe que facilita a adição de inicialização javascript ao formulário de um widget, substituindo uma funçãoform_javascript_init()
:Um exemplo de widget de teste usando este:
fonte
Eu acho que existe algo no Wordpress 3.9 que pode ajudá-lo. É o retorno de chamada atualizado pelo widget . Use-o assim (coffeescript):
fonte