Menú desplegable select no muestra el valor seleccionado en PHP
Estoy usando la WordPress Settings API
. Todo funciona correctamente excepto este menú desplegable select
. Cuando selecciono una opción, el valor que se muestra es correcto pero en el dropdown aparece el valor por defecto primero (es decir 6
) y no el seleccionado. ¿Dónde está el error?
public function someplugin_select() {
$options = get_option( 'plugin_252calc');
echo $options; //muestra el valor seleccionado correcto
$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>';
}

La razón por la que tu condición $item == $option
siempre falla es por la forma en que PHP compara valores flotantes.
Prueba lo siguiente en su lugar:
echo "<option value='$item'" . selected(abs($item - $options) <= 0.01, true, false) . ">$item</option>";
Consulta Comparación de floats para más información.

para quien le interese: el problema no es PHP, per se, es la representación binaria de los floats. Mira Comparando Números de Punto Flotante, Edición 2012 para una buena discusión de por qué el método epsilon mencionado arriba no es ideal en todos los casos (pero ciertamente suficiente para el OP).

Revisé esto y pude notar que hay una función de WP llamada selected
, que puedes ver en este enlace. Usa esta función en lugar de hacer: if ( $item == $options )
. Y tu código podría verse así:
foreach ( $seconds as $second => $time ) {
?>
<option value="<?php echo $second; ?>" <?php selected( $browser_cache_ttl, $second ); ?>><?php echo $time; ?></option>
<?php
}
Entonces, esa función recorre $seconds
y obtiene $second
y $time
, coloca $second
como valor, luego llama a la función selected donde el primer parámetro es el valor a comparar y el segundo es el valor actual. Si esos valores son iguales, se seleccionará.
Creo que eso es lo que buscas. Avísame si funcionó.

Reemplaza tu select con esto... Espero que funcione...
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>';

No tengo mejores respuestas, pero siento que tengo un problema lo suficientemente similar como para agregarlo a esta pregunta en lugar de crear una nueva.
Comencé con https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s y llegué hasta el minuto 1:05:00, y esta es mi versión actual:
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>
<?}
Sin embargo, en lugar de comparar números flotantes, estaba pensando en comparar valores de cadena, pero hasta ahora no he tenido éxito.
También intenté asignar una variable como ID de página y usar esa variable como valor de la opción, así como el segundo argumento en la función get_option(), pero aún sin resultados.

Esto realmente no responde a la pregunta. Si tienes una pregunta diferente, puedes hacerla haciendo clic en Preguntar. Para recibir notificaciones cuando esta pregunta tenga nuevas respuestas, puedes seguir esta pregunta. Una vez que tengas suficiente reputación, también puedes añadir una recompensa para llamar más la atención sobre esta pregunta. - De la revisión
