Wordpress выпадающий список select в виджете
Хорошо, я разрабатываю свой собственный виджет и у меня возникла ОГРОМНАЯ проблема.
Я не знаю, как получить и сохранить значения из HTML select.
Простой пример:
/* инициализация ЗАГОЛОВКА */
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters('widget_title', $instance['title'] );
(...)
/* код обновления для ЗАГОЛОВКА */
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
(...)
/* создание поля ЗАГОЛОВКА в админ-панели виджетов */
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Title:', 'hybrid'); ?></label>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" type="text" style="width:100%;" />
</p>
(...)
ОК. Теперь когда я пишу
<?php echo $instance['title'] ?>
Это покажет мой заголовок!
Но у меня есть этот список:
<label for="<?php echo $this->get_field_id( 'example' ); ?> "><?php _e('Map type:', 'example'); ?></label>
<select id="<?php echo $this->get_field_id( 'example' ); ?>" name="<?php echo $this->get_field_name( 'example' ); ?>">
<option value="supervalue" selected="selected">Super Value</option>
</select>
И
<?php echo $instance['example'] ?>
Не выводит НИЧЕГО. Я искал везде, включая default-widgets.php, но я не понимаю ни слова, так как все стандартные плагины используют в основном динамически генерируемые списки опций.
Я использовал список только с одним элементом, но на самом деле он длиннее, я также не уверен, как сохранить выбранный элемент, поскольку я не знаю, как получить доступ к значению этого элемента.
Есть идеи? Я потратил на это целый день, потихоньку схожу с ума.
[отредактировано]
Я не показал вам функцию update, потому что, как я упомянул выше, я использую один и тот же код обновления для каждой функции.
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['example'] = strip_tags( $new_instance['example'] );
return $instance;
}

Смотри мой комментарий выше... ты используешь get_field_id()
для атрибута name, где должно быть get_field_name()
.
get_field_id()
возвращает 'widget-'.$this->id_base.'-'.$this->number.'-'.$field_name
,
тогда как
get_field_name()
возвращает 'widget-'.$this->id_base.'[' . $this->number . '][' . $field_name.']'

Какая разница, если я везде использую get_field_id? И в первом примере это работает?

В первом примере вы используете get_field_id()
для атрибута id и get_field_name()
для атрибута name. Во втором примере вы используете get_field_id()
для обоих. Это не работает, потому что теперь значение вашего поля регистрируется как $_POST['widget-base-num-name']
вместо $_POST['widget-base']['num']['name']
. Очевидно, WordPress преобразует $_POST['widget-base']['num']
в первый параметр update()
, но он не может этого сделать, поэтому значение вашего поля теряется.

Недавно я написал статью о выпадающих списках в админке WordPress, возможно, она будет полезна некоторым из вас:
