Listă dropdown în widget WordPress
Ok, dezvolt propriul meu widget și am o problemă MAJORĂ.
Nu știu cum să preiau și să salvez valorile din selecturile HTML.
Exemplu simplu:
/* inițializare TITLU */
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters('widget_title', $instance['title'] );
(...)
/* cod de actualizare pentru TITLU */
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = strip_tags( $new_instance['title'] );
(...)
/* crearea câmpului TITLU în zona de administrare a widget-urilor */
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Titlu:', '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. Când scriu
<?php echo $instance['title'] ?>
Va afișa titlul meu!
Dar am această listă:
<label for="<?php echo $this->get_field_id( 'example' ); ?> "><?php _e('Tip hartă:', 'example'); ?></label>
<select id="<?php echo $this->get_field_id( 'example' ); ?>" name="<?php echo $this->get_field_name( 'example' ); ?>">
<option value="supervalue" selected="selected">Valoare Super</option>
</select>
Și
<?php echo $instance['example'] ?>
Nu returnează NIMIC. Am căutat peste tot, inclusiv în default-widgets.php, dar nu înțeleg nimic deoarece toate plugin-urile implicite folosesc în mare parte liste de opțiuni generate dinamic.
Am folosit o listă cu un singur element, dar de fapt e mai lungă, și nu sunt sigur cum să salvez elementul selectat, pentru că nu știu cum să accesez valoarea acestui element.
Aveți idei? Am petrecut toată ziua cu asta și încep să înnebunesc încetul cu încetul.
[editat]
Nu v-am arătat funcția de actualizare deoarece, așa cum am menționat mai sus, folosesc același cod de actualizare pentru fiecare funcție.
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['example'] = strip_tags( $new_instance['example'] );
return $instance;
}

Vezi comentariul meu de mai sus...folosești get_field_id()
pe atributul name, unde ar trebui să fie get_field_name()
.
get_field_id()
întoarce 'widget-'.$this->id_base.'-'.$this->number.'-'.$field_name
,
în timp ce
get_field_name()
întoarce 'widget-'.$this->id_base.'[' . $this->number . '][' . $field_name.']'

Care este diferența dacă folosesc get_field_id peste tot? Și în primul exemplu care funcționează?

În primul exemplu folosești get_field_id()
pe atributul id și get_field_name()
pe atributul name. În al doilea exemplu folosești get_field_id()
pe ambele. Ceea ce nu funcționează, deoarece acum valoarea câmpului tău este înregistrată ca $_POST['widget-base-num-name']
în loc de $_POST['widget-base']['num']['name']
. Evident, WP mapează $_POST['widget-base']['num']
în primul parametru al update()
, dar nu poate face asta, așa că valoarea câmpului tău se pierde.

Recent am scris un articol despre casetele de selectare WordPress în interfața de administrare, ar putea fi util pentru unii dintre voi:
