Я пишу настраиваемый плагин, который позволяет определенной странице иметь собственную боковую панель с виджетами. Он отлично работает до сих пор, но то, что я хотел бы сделать, это обобщить его больше и позволить плагину «переопределять» динамическую боковую панель любой страницы (если она имеет пользовательскую боковую панель) без необходимости редактировать файлы шаблонов.
Я пробовал несколько крючков и немного углубился в код, но пока ничего не стоит или работает.
Чтобы сэкономить некоторое время, я подумал, что увижу, есть ли у кого-нибудь какие-либо рабочие решения для этой проблемы? Я мог бы решить эту проблему, но это напрягает мой мозг «после рабочего дня».
Если это невозможно, я был бы более чем готов иметь короткий код или вызов функции, который сделает это для меня, но я действительно хотел бы сделать это доказательством идиота и просто заставить его работать без каких-либо изменений шаблона.
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').
Это в основном позволяет мне добавлять действия к этому триггеру и отображать любые виджеты, которые я хотел отобразить.
Удачи!