Я опубликовал отчет об ошибке несколько месяцев назад ( в WordPress trac (Ошибка обновления формы экземпляра виджета) ), и я решил попробовать написать об этом и здесь. Может быть, у кого-то есть лучшее решение этой проблемы, чем у меня.
В основном проблема заключается в том, что если вы перетащите виджет на боковую панель, форма виджета не будет обновлена, пока вы не нажмете вручную сохранить (или перезагрузить страницу).
Это делает неиспользуемым весь код form()
функции, которая использует идентификатор экземпляра виджета для выполнения чего-либо (пока вы не нажмете кнопку сохранения). Любые вещи, такие как ajax-запросы, jQuery, такие как colorpickers и т. Д., Не будут работать сразу, потому что из этой функции может показаться, что экземпляр виджета еще не был инициализирован.
Грязное исправление состоит в том, чтобы автоматически вызывать кнопку сохранения, используя что-то вроде livequery :
$("#widgets-right .needfix").livequery(function(){
var widget = $(this).closest('div.widget');
wpWidgets.save(widget, 0, 1, 0);
return false;
});
и добавьте .needfix
класс, form()
если экземпляр виджета не выглядит инициализированным:
<div <?php if(!is_numeric($this->number)): ?>class="needfix"<?php endif; ?>
...
</div>
Один из недостатков этого решения заключается в том, что если у вас зарегистрировано много виджетов, браузер будет потреблять много ресурсов ЦП, потому что проверка livequery для DOM меняется каждую секунду (хотя я специально не проверял это, это всего лишь мое предположение :)
Любые предложения для лучшего способа исправить ошибку?
источник
Ответы:
Я недавно сражался с похожей ситуацией. Аякс в виджетах не шутка! Нужно написать довольно сумасшедший код, чтобы заставить вещи работать между экземплярами. Я не знаком с живым запросом, но если вы скажете, что он проверяет DOM каждую секунду, у меня может быть менее интенсивное решение для вас:
Вы можете передать эту функцию объекту селектора или jQuery, и он вернет идентификатор экземпляра текущего экземпляра. Я не мог найти другого пути решения этой проблемы. Рад слышать, что я не единственный :)
источник
Я не люблю отвечать на свой вопрос, но я считаю, что это лучшее решение на данный момент:
Это запустит ajax-запрос виджета-сохранения сразу после того, как запрос-виджет-сохранения будет выполнен (если не было ответа с формой html).
Это нужно добавить в
jQuery(document).ready()
функцию.Теперь, если вы хотите легко повторно присоединить ваши функции javascript к новым элементам DOM, добавленным функцией формы виджета, просто свяжите их с событием «сохраненный_виджет»:
источник
Недавно столкнулся с этим, и кажется, что в традиционном интерфейсе «widgets.php» любая инициализация javascript должна выполняться непосредственно для существующих виджетов (в
#widgets-right
div) и косвенно черезwidget-added
событие для вновь добавленных виджетов; тогда как в интерфейсе настройщика "customize.php" все виджеты - существующие и новые - отправляютсяwidget-added
событию, поэтому их можно просто инициализировать там. Основываясь на этом, следующее является расширениемWP_Widget
класса, которое позволяет легко добавлять инициализацию javascript к форме виджета, переопределяя одну функциюform_javascript_init()
:Пример тестового виджета с использованием этого:
источник
Я думаю, что в Wordpress 3.9 есть что-то, что может вам помочь. Это обновленный виджет обратный вызов. Используйте это так (coffeescript):
источник