Я хотел бы программно добавить виджеты на мои две боковые панели, которые у меня есть. Я не мог найти какой-либо официальный способ сделать это?
Я начал искать в базе данных. Я обнаружил, что это опция 'sidebars_widgets', которая помещает виджеты на боковые панели. При просмотре опций к именам виджетов добавляется номер, добавленный в конец, например: widget_name-6. Откуда этот номер?
Есть идеи, как это исправить?
Ответы:
Когда я начал этот ответ, это была просто небольшая заметка. Ну, я потерпел неудачу. Сожалею! Оставайся со мной, там в глубине души спрятано ...
Как хранятся виджеты WordPress
Список виджетов хранится в опции с именем
'sidebars_widgets'
. Аvar_export()
может дать что-то вроде следующего:Игнорировать
'wp_inactive_widgets'
и'array_version'
. Мы не должны заботиться о них.Другие ключи являются идентификаторами для зарегистрированных боковых панелей. В этом случае боковые панели могут быть зарегистрированы с этим кодом:
По умолчанию боковые панели пусты после регистрации. Конечно.
Для каждого зарегистрированного класса виджетов создается отдельная опция, содержащая все необходимые опции. Опция начинается с строки
widget_
. Чтобы получить опции для всех активных виджетов RSS, мы должны изучить…Возможный вывод:
Обратите внимание на номер 2 . Все аргументы для нескольких экземпляров хранятся в одной опции, отсортированной по номерам.
Чтобы увидеть, какие классы виджетов уже известны WordPress, перейдите
wp-admin/options.php
и прокрутите вниз, пока не увидите что-то вроде этого:Да, сериализованные данные. Нет, вы не можете прочитать их здесь. Не волнуйся, тебе не нужно.
Демо-виджет
Чтобы лучше проиллюстрировать внутреннюю работу, я написал очень простой демонстрационный виджет:
Обратите внимание на конструктор:
't5_demo_widget'
это$id_base
идентификатор этого виджета. Как вы можете видеть на скриншоте, его аргументы сохраняются в опцииwidget_t5_demo_widget
. Все ваши пользовательские виджеты будут обрабатываться следующим образом. Вам не нужно угадывать имя. И поскольку вы написали свои виджеты (вероятно), вы знаете все аргументы из параметров вашего класса$instance
.Основы темы
Сначала вы должны зарегистрировать некоторые боковые панели и пользовательский виджет. Правильное действие для этого легко запомнить
'widgets_init'
. Поместите все в контейнер - класс или функцию. Для простоты я буду использовать функцию с именемt5_default_widget_demo()
.Весь следующий код входит в
functions.php
. Класс ужеT5_Demo_Widget
должен быть загружен. Я просто положил его в тот же файл ...Пока все просто. Наша тема теперь готова к виджетам, демо-виджет известен. Теперь самое интересное.
Вы действительно не хотите уничтожать пользовательские настройки. Если на боковых панелях уже есть какой-то контент, ваш код не должен выполняться поверх него. Вот почему мы остановимся в этом случае.
Хорошо, предполагается, что боковые панели пусты ... нам нужен счетчик:
Виджеты пронумерованы . Эти числа являются вторыми идентификаторами для WordPress.
Давайте получим массив для его изменения:
Нам тоже нужен счетчик (об этом позже):
И вот как мы используем счетчик, имена боковой панели и аргументы виджета (ну, у нас есть только один аргумент:)
text
.Обратите внимание, как создается идентификатор виджета:
id_base
минус-
и счетчик. Содержание виджета хранится в другой переменной$demo_widget_content
. Здесь счетчик ключа и аргументы виджета хранятся в массиве.Мы увеличиваем счетчик на единицу, когда закончим, чтобы избежать столкновений.
Это было просто. Теперь RSS виджет. Больше полей, больше веселья!
Вот что-то новое:
update_option()
это будет хранить аргумент виджета RSS в отдельной опции. WordPress найдет их автоматически позже.Мы не сохранили аргументы демо-виджета, потому что теперь добавляем второй экземпляр на нашу вторую боковую панель…
... и сохранить все аргументы для
t5_demo_widget
в один раз. Нет необходимости обновлять один и тот же параметр два раза.Ну, хватит на сегодня виджетов, давайте тоже сохраним
sidebars_widgets
:Теперь WordPress будет знать, что есть несколько зарегистрированных виджетов и где хранятся аргументы для каждого виджета. А
var_export()
на sidebar_widgets будет выглядеть так:Полный код еще раз:
Если вы зайдете
wp-admin/widgets.php
сейчас, вы увидите три предустановленных виджета:Вот и все. Используйте ...
... чтобы распечатать виджеты.
Есть небольшой глюк: вы должны загрузить интерфейс два раза для первоначальной регистрации. Если кто-то может помочь здесь, я буду очень благодарен.
источник
widget_t5_demo_widget
относится к здесьupdate_option( 'widget_t5_demo_widget', $demo_widget_content );
:?Спасибо, что поделились своим решением. Я использовал то, что было описано в этом вопросе, чтобы создать фрагмент кода, который можно использовать для очень простой инициализации боковых панелей. Он очень гибкий, вы можете создавать столько виджетов, сколько захотите, без необходимости вообще изменять код. Просто используйте зацепки фильтра и передайте аргументы в массиве. Вот прокомментированный код:
Это вспомогательная функция, которая проверяет наличие содержимого боковой панели:
Теперь нам нужно создать функцию, которая подключается к действию sidebar_init.
А теперь инициализация виджета:
Последнее действие - создать виджеты на каждой боковой панели:
Эта функция используется для отслеживания того, сколько экземпляров определенного виджета уже было определено:
Последнее, что нам нужно сделать, - это назначить значения. Используйте эти функции фильтра:
А также:
В идеале вы должны вызывать initialize_sidebars в функции установки, которая вызывается при активации плагина или темы, например: Активация темы:
Активация плагина:
Чтобы суммировать использование этого конгломерата функций:
создайте функцию, которая инициализирует боковые панели, которая подключена к фильтру 'alter_initialization_sidebars'.
создайте функцию для каждой добавленной вами боковой панели, которая подключается к фильтру 'alter_initialization_widgets_ $ sidebarname'. Замените $ sidebarname на имя каждой боковой панели, созданной на шаге 1.
Вы также можете просто скопировать этот незакомментированный код в файл функций и сразу же приступить к созданию функций фильтра: Код на pastie (без функций фильтра инициализации)
источник
Прежде всего, спасибо @toscho за подробный ответ.
Это простой пример для тех, кто ищет простое решение и параметры виджета по умолчанию:
Примечание 1: Вы можете
sidebar-id
перейти в меню виджетов и проверить нужную боковую панель. Первый<div id="widgets-holder-wrap">
«s<div>
ребенок имеетsidebar-id
.Примечание 2: Вы можете
widget_name
перейти в меню виджетов и проверить нужный виджет. Вы увидите что-то подобное<div id="widget-6_widget_name-__i__" class="widget ui-draggable">
.Я желаю, чтобы это помогло.
источник
Вот как вы это делаете:
(ВНИМАНИЕ, это может УДАЛИТЬ все предыдущие виджеты, если вы не вернули исходные виджеты в
widgets
массив.)-Number можно использовать, если позже вы захотите добавить опции к виджету примерно так:
источник
$widgets = get_option( 'sidebars_widgets' );