Lista desplegable select de WordPress en widget
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;
}

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.']'

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

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.

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:
