Intereting Posts
когда я получаю данные из удаленной базы данных mysql в wordpress, встроенной в функцию wordpress, не работает? Как я могу отобразить комментарий пользователя, зарегистрированного в журнале, в верхней части раздела комментариев в WordPress? Фильтр home_url для пользовательского типа сообщения Вызов отображаемого URL-адреса Как создать пользовательскую панель мониторинга для веб-сайта членства? WordPress публикует сообщения после обновления 3.1 Два плагина с использованием the_title; один не проходящий второй параметр. Как запрашивать сообщения, основанные на координате lat-lng, как почтовая мета? Экспорт плагина пропускает много изображений Виджеты WordPress Порядок меню родительского меню с точки зрения детского меню добавьте значение переменной, возвращаемой в цикле while Почему wp_get_attachment_image не включает «полный» размер в srcset? Buddypress – добавить область действия Вторичная разбивка на отдельные персонализированные почтовые сообщения перенаправляется на первую страницу

Переопределить dynamic_sidebar () в плагине?

Я пишу настраиваемый плагин, который позволяет определенной странице иметь собственную боковую панель с виджетами. Он отлично работает до сих пор, но то, что я хотел бы сделать, это обобщить его больше и позволить плагину «переопределять» динамическую боковую панель любой страницы (если она имеет пользовательскую боковую панель) без необходимости редактировать файлы шаблонов.

Я пробовал несколько крючков и немного углубился в код, но пока ничего не стоит или работает.

Чтобы сэкономить некоторое время, я подумал, что увижу, есть ли у кого-нибудь какие-либо рабочие решения для этой проблемы? Я мог бы решить эту проблему, но это напрягает мой мозг «после рабочего дня».

Если это невозможно, я был бы более чем готов иметь короткий код или вызов функции, который сделает это для меня, но я действительно хотел бы сделать это доказательством идиота и просто заставить его работать без каких-либо изменений шаблона.

dynamic_sidebar() вызывает wp_get_sidebars_widgets() чтобы получить список всех боковых панелей и их виджетов. Этот выход фильтруется через sidebars_widgets , поэтому вы можете изменить его для добавления или удаления виджетов .

Этот массив содержит только идентификаторы виджетов, поэтому вам нужно также зарегистрировать экземпляр виджета (он должен быть в глобальном массиве $wp_registered_widgets ). Я думаю, вы можете сделать это с помощью wp_register_sidebar_widget() , но возможно, что это более старый код с момента, когда у виджета не было нескольких экземпляров.

Да, это вполне возможно, но не самое простое, что можно сделать. Мне потребовалось около двух месяцев, чтобы улучшить его, когда я работал над Total Widget Control , но я смог это сделать.

Это не является прямым переопределением того, что происходит, так это то, что dynamic_sidebar загружает $registered_widgets global и циклически перемещается через виджеты, вызывая обратный вызов для каждого из этих виджетов.

Шаг первый Итак, что я закончил делать, это захват этого зарегистрированного_widgets глобального, резервное копирование его до моего собственного глобального, а затем замена исходных обратных вызовов пустой функцией обратного вызова.

Таким образом, dynamic_sidebars все еще вызывался, но на самом деле ничего не делает.

Шаг второй Следующий шаг был немного сложнее и немного отлаживался. Мне пришлось взять общее количество исходных виджетов для данной боковой панели, а затем следить за тем, какой цикл был включен dynamic_sidebars. Когда dynamic_sidbars достиг своего последнего виджета, я назвал свой собственный do_action ('trigger_new_sidebar').

Это в основном позволяет мне добавлять действия к этому триггеру и отображать любые виджеты, которые я хотел отобразить.

Удачи!