Dropdown select nu afișează valoarea selectată în PHP
Folosesc WordPress Settings API
. Totul funcționează cum trebuie, cu excepția acestui dropdown select
. Când selectez o opțiune, valoarea afișată prin echo este corectă, dar în dropdown se afișează valoarea implicită (prima valoare) adică 6
și nu cea selectată. Unde greșesc?
public function someplugin_select() {
$options = get_option('plugin_252calc');
echo $options; // afișează valoarea corectă selectată
$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>';
}
Motivul pentru care condiția ta $item == $option
eșuează întotdeauna este din cauza modului în care PHP compară numerele cu virgulă mobilă!
Încearcă următoarea variantă:
echo "<option value='$item'" . selected(abs($item - $options) <= 0.01, true, false) . ">$item</option>";
Consultă Compararea numerelor cu virgulă mobilă pentru mai multe informații.

pentru cei interesați: problema nu este PHP în sine, ci reprezentarea binară a numerelor cu virgulă mobilă. consultați Comparing Floating Point Numbers, 2012 Edition pentru o discuție bună despre de ce metoda epsilon menționată mai sus nu este ideală în toate cazurile (dar cu siguranță suficient de bună pentru OP).

Am parcurs asta și am observat că există o funcție WP numită selected
, pe care o poți vedea în acest link. Folosește această funcție în loc să faci: if ( $item == $options )
. Și codul tău ar putea arăta astfel:
foreach ( $seconds as $second => $time ) {
?>
<option value="<?php echo $second; ?>" <?php selected( $browser_cache_ttl, $second ); ?>><?php echo $time; ?></option>
<?php
}
Deci acea funcție parcurge $seconds
și obține $second
și $time
, pune $second
ca valoare, apoi apelează funcția selected
unde primul parametru este valoarea de comparat, iar al doilea este valoarea curentă. Dacă aceste valori sunt egale, opțiunea va fi selectată.
Cred că asta cauți. Spune-mi dacă a funcționat.

Înlocuiește select-ul tău cu asta... Sper să funcționeze...
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>';

Nu am răspunsuri mai bune, dar simt că am o problemă suficient de similară pentru a o adăuga la această întrebare în loc să creez una nouă.
Am început cu https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s și am ajuns până la minutul 1:05:00, iar versiunea mea curentă este
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>
<?}
totuși, în loc să compar numere cu virgulă, mă gândeam să compar valori de tip șir de caractere, dar până acum fără succes.
Am încercat de asemenea să atribui o variabilă ca ID al paginii și să folosesc acea variabilă atât ca valoare a opțiunii cât și ca al doilea argument în funcția get_option(), dar tot fără rezultat.

Acest lucru nu răspunde cu adevărat la întrebare. Dacă aveți o altă întrebare, o puteți adresa făcând clic pe Puneți o Întrebare. Pentru a fi notificat atunci când această întrebare primește răspunsuri noi, puteți urmări această întrebare. Odată ce aveți suficientă reputație, puteți de asemenea adăuga un bonus pentru a atrage mai multă atenție asupra acestei întrebări. - De la Recenzie
