Lista desplegable select de WordPress en widget

20 feb 2011, 22:04:57
Vistas: 19.8K
Votos: 2

Ok, estoy desarrollando mi propio widget y tengo un ENORME problema.

No sé cómo obtener y eventualmente guardar los valores de los select html.

Ejemplo simple:

/* inicializar TÍTULO */
function widget( $args, $instance ) {
        extract( $args );
        $title = apply_filters('widget_title', $instance['title'] );

(...)

/* código de actualización para TÍTULO */
    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags( $new_instance['title'] );

(...)

/* creando campo TÍTULO en el área de administración de widgets */

 <p>
    <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Título:', '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>

(...)

OK. Cuando escribo

<?php echo $instance['title'] ?>

¡Me mostrará mi título!

Pero tengo esta lista:

<label for="<?php echo $this->get_field_id( 'example' ); ?> "><?php _e('Tipo de mapa:', 'example'); ?></label>
<select id="<?php echo $this->get_field_id( 'example' ); ?>" name="<?php echo $this->get_field_id( 'example' ); ?>">
     <option value="supervalue" selected="selected">Valor Super</option>
</select>

Y

<?php echo $instance['example'] ?>

No devuelve NADA. He estado buscando en todas partes incluyendo default-widgets.php pero no entiendo nada ya que todos los plugins predeterminados utilizan principalmente listas de opciones generadas dinámicamente.

He usado una lista de un solo elemento, pero en realidad es más larga, tampoco estoy seguro de cómo guardar el elemento seleccionado, ya que no sé cómo acceder al valor de este elemento.

¿Alguna idea? He pasado todo el día en esto, volviéndome loco lentamente.

[editado]

No les mostré la función update porque como mencioné arriba uso el mismo código de actualización para cada función.

function update( $new_instance, $old_instance ) {

    $instance = $old_instance;
    $instance['example'] = strip_tags( $new_instance['example'] );    

    return $instance;

}
5
Comentarios

Asumo que estás usando una declaración de clase para el widget, así que publica tu función de actualización y creo que sé cuál es el problema.

Bainternet Bainternet
21 feb 2011 01:47:15

No sé si esto importa, pero ¿no debería ser name="<?php echo $this->get_field_name( 'example' );? Estás usando get_field_id() arriba.

wyrfel wyrfel
21 feb 2011 02:57:05

¿Por qué el nuevo campo no está dentro de la rutina de actualización? Por ejemplo, $instance['example'] = tu_funcion_de_saneamiento_elegida( $new_instance['example'] );

t31os t31os
21 feb 2011 10:49:01

@בניית אתרים ¡hecho! :)

Wordpressor Wordpressor
21 feb 2011 12:54:33

Sería mucho más fácil depurar tu problema si se pudiera mostrar el código completo, no hay nada incorrecto hasta donde puedo ver con lo que has publicado.

t31os t31os
21 feb 2011 15:41:49
Todas las respuestas a la pregunta 2
2

Mira mi comentario anterior... estás usando get_field_id() en el atributo name, donde debería ser get_field_name().

get_field_id() devuelve 'widget-'.$this->id_base.'-'.$this->number.'-'.$field_name,
mientras que
get_field_name() devuelve 'widget-'.$this->id_base.'[' . $this->number . '][' . $field_name.']'

21 feb 2011 14:13:17
Comentarios

¿Cuál es la diferencia si uso get_field_id en todas partes? ¿También en el primer ejemplo que está funcionando?

Wordpressor Wordpressor
21 feb 2011 14:56:33

En el primer ejemplo estás usando get_field_id() en el atributo id y get_field_name() en el atributo name. En el segundo ejemplo estás usando get_field_id() en ambos. Lo cual no funciona, porque ahora tu valor de campo se registra como $_POST['widget-base-num-name'] en lugar de $_POST['widget-base']['num']['name']. Obviamente, WP mapea $_POST['widget-base']['num'] al primer parámetro de update(), pero no puede hacer eso, por lo que se pierde el valor de tu campo.

wyrfel wyrfel
21 feb 2011 18:48:50
0

Recientemente escribí un artículo sobre los cuadros de selección (select boxes) en el backend de WordPress, podría ser de ayuda para algunos de ustedes:

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

18 mar 2014 11:48:58