Menu a tendina non mostra il valore selezionato in PHP
Sto utilizzando la WordPress Settings API
. Tutto funziona correttamente tranne questo menu a tendina select
. Quando seleziono un'opzione, il valore visualizzato è corretto ma nel menu a tendina viene mostrato il valore predefinito iniziale, cioè 6
, e non quello selezionato. Dove sbaglio?
public function someplugin_select() {
$options = get_option( 'plugin_252calc');
echo $options; //mostra il valore selezionato corretto
$items = array();
for ($i=6; $i <=10; $i+= 0.1)
{
$items[] = $i;
}
echo '<select id="cf-nb" name="cf-nb">';
foreach ( $items as $item )
{
echo '<option value="'. $item .'"';
if ( $item == $options ) echo' selected="selected"';
echo '>'. $item .'</option>';
}
echo '</select>';
}
Il motivo per cui la tua condizione $item == $option
fallisce sempre è dovuto al modo in cui PHP confronta i float (numeri decimali)!
Prova invece con questo codice:
echo "<option value='$item'" . selected(abs($item - $options) <= 0.01, true, false) . ">$item</option>";
Vedi Confronto tra float per maggiori informazioni.

per chi fosse interessato: il problema non è PHP in sé, ma la rappresentazione binaria dei float. vedi Comparing Floating Point Numbers, 2012 Edition per una buona discussione sul perché il metodo epsilon sopra citato non sia ideale in tutti i casi (ma certamente sufficiente per l'OP).

Ho esaminato questo e ho potuto notare che c'è una funzione di WordPress chiamata selected
, che puoi vedere in questo link. Usa questa funzione invece di fare: if ( $item == $options )
. E il tuo codice potrebbe apparire così:
foreach ( $seconds as $second => $time ) {
?>
<option value="<?php echo $second; ?>" <?php selected( $browser_cache_ttl, $second ); ?>><?php echo $time; ?></option>
<?php
}
Quindi quella funzione scorre $seconds
e ottiene $second
e $time
, imposta $second
come valore, poi chiama la funzione selected dove il primo parametro è il valore da confrontare e il secondo è il valore corrente: se quei valori sono uguali, verrà selezionato.
Penso che sia quello che stai cercando. Fammi sapere se ha funzionato.

Sostituisci il tuo select con questo... Spero funzioni...
echo '<select id="cf-nb" name="cf-nb">';
foreach ( $items as $item ){
$if_selected = $item == $options ? "selected='selected'" : "";
echo "<option value='{$item}' {$if_selected}>$item</option>";
}
echo '</select>';

Non ho risposte migliori, ma sento di avere un problema abbastanza simile da aggiungere a questa domanda invece di crearne una nuova.
Ho iniziato con https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s e sono arrivato fino a 1:05:00 e questa è la mia versione attuale:
function selectpageHTML() {?>
<select name="lp_actPage">
<?
$pages = get_pages(); foreach ( $pages as $page ) {
$title = $page->post_title;
echo "<option value='$title'" . selected(get_option('lp_actPage', $title)) .">$title</option>";
} ?>
</select>
<?}
tuttavia, invece di confrontare valori float, stavo pensando di confrontare valori stringa, ma finora senza successo.
Ho anche provato ad assegnare una variabile come ID della pagina e a utilizzare quella variabile come valore dell'opzione oltre che come secondo argomento nella funzione get_option(), ma ancora nulla.

Questa risposta non risponde realmente alla domanda. Se hai una domanda diversa, puoi porla cliccando su Fai una domanda. Per ricevere una notifica quando questa domanda riceve nuove risposte, puoi seguire questa domanda. Una volta che avrai abbastanza reputazione, potrai anche aggiungere una ricompensa per attirare più attenzione su questa domanda. - Da Revisione
