Wordpress выпадающий список select в виджете

20 февр. 2011 г., 22:04:57
Просмотры: 19.8K
Голосов: 2

Хорошо, я разрабатываю свой собственный виджет и у меня возникла ОГРОМНАЯ проблема.

Я не знаю, как получить и сохранить значения из 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;

}
5
Комментарии

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

Bainternet Bainternet
21 февр. 2011 г. 01:47:15

Не знаю, имеет ли это значение, но разве не должно быть name="<?php echo $this->get_field_name( 'example' );? Вы используете get_field_id() выше.

wyrfel wyrfel
21 февр. 2011 г. 02:57:05

Почему новое поле не находится внутри процедуры обновления? Например: $instance['example'] = your_chosen_sanitization_function( $new_instance['example'] );

t31os t31os
21 февр. 2011 г. 10:49:01

@בניית אתרים готово! :)

Wordpressor Wordpressor
21 февр. 2011 г. 12:54:33

Было бы гораздо проще найти ошибку, если бы был показан полный код. В том, что вы опубликовали, я не вижу ничего неправильного.

t31os t31os
21 февр. 2011 г. 15:41:49
Все ответы на вопрос 2
2

Смотри мой комментарий выше... ты используешь 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.']'

21 февр. 2011 г. 14:13:17
Комментарии

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

Wordpressor Wordpressor
21 февр. 2011 г. 14:56:33

В первом примере вы используете 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(), но он не может этого сделать, поэтому значение вашего поля теряется.

wyrfel wyrfel
21 февр. 2011 г. 18:48:50
0

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

http://wp-dreams.com/wordpress-widget-select-box/

18 мар. 2014 г. 11:48:58