Menu a tendina select in un widget WordPress
Ok, sto sviluppando il mio widget personalizzato e ho un ENORME problema.
Non so come recuperare e successivamente salvare i valori degli elementi select HTML.
Esempio semplice:
/* inizializza TITOLO */
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters('widget_title', $instance['title'] );
(...)
/* codice di aggiornamento per il TITOLO */
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
(...)
/* creazione del campo TITOLO nell'area amministrativa dei widget */
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Titolo:', '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. Quando scrivo
<?php echo $instance['title'] ?>
Mostrerà il mio titolo!
Ma ho questa lista:
<label for="<?php echo $this->get_field_id( 'example' ); ?> "><?php _e('Tipo di mappa:', '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 Valore</option>
</select>
E
<?php echo $instance['example'] ?>
Non restituisce NULLA. Ho cercato ovunque, incluso default-widgets.php, ma non capisco nulla poiché tutti i plugin predefiniti utilizzano principalmente elenchi di opzioni generati dinamicamente.
Ho utilizzato una lista con un solo elemento, ma in realtà è più lunga, non sono sicuro di come salvare anche l'elemento selezionato, poiché non so come accedere al valore di questo elemento.
Qualche idea? Ho passato l'intera giornata su questo, diventando lentamente matto.
[modificato]
Non ho mostrato la funzione update perché come ho menzionato sopra uso lo stesso codice di aggiornamento per ogni funzione.
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['example'] = strip_tags( $new_instance['example'] );
return $instance;
}

Vedi il mio commento sopra... stai usando get_field_id()
sull'attributo name, dove invece dovresti usare get_field_name()
.
get_field_id()
restituisce 'widget-'.$this->id_base.'-'.$this->number.'-'.$field_name
,
mentre
get_field_name()
restituisce 'widget-'.$this->id_base.'[' . $this->number . '][' . $field_name.']'

Qual è la differenza se uso get_field_id ovunque? Anche nel primo esempio che funziona?

Nel primo esempio stai usando get_field_id()
sull'attributo id e get_field_name()
sull'attributo name. Nel secondo esempio stai usando get_field_id()
su entrambi. Il che non funziona, perché ora il valore del tuo campo viene registrato come $_POST['widget-base-num-name']
invece di $_POST['widget-base']['num']['name']
. Ovviamente, WP mappa $_POST['widget-base']['num']
nel primo parametro di update()
, ma non può farlo, quindi il valore del tuo campo viene perso.

Recentemente ho scritto un articolo sulle caselle di selezione (select box) in WordPress per il backend, potrebbe esservi utile:
