Mostrar datos guardados de Meta Box en un menú desplegable con selected()

10 jul 2012, 22:30:23
Vistas: 2.56K
Votos: 0

Tengo un meta-box personalizado para ciertos tipos de contenido personalizados, y uno de los campos en el meta-box es un menú desplegable.

Estoy proporcionando el campo correctamente, guardando la información, e incluso llamándola correctamente (así que sé que se está guardando adecuadamente), sin embargo, cuando vuelves a editar la entrada, o actualizas, el menú desplegable siempre muestra la primera opción del <select>, lo que me preocupa que pueda confundir a algunas personas que editen estos tipos de contenido en el futuro.

Por ejemplo, si un editor selecciona "Opción 2", luego presiona Publicar o Actualizar, "Opción 2" se guarda y se llama en el loop, pero el menú desplegable inmediatamente muestra "Opción 1" nuevamente.

¿Hay alguna manera de que la opción 'seleccionada' que se guardó se muestre en la parte superior, o al principio de la lista, para que aparezca al editor como guardada?

Mi código de funciones:

function meta_options(){
    global $post;
    $custom = get_post_custom($post->ID);
    $price = $custom["price"][0];
    $selected = isset( $values['location'] ) ? esc_attr( $values['location'][0] ) :'';  
?>
<label>Precio:</label><input name="price" value="<?php echo $price; ?>" />
<label>Ubicación : </label>  <br />
<select name="location" id="location">  
    <option value="Opción 1" <?php selected( $selected, 'Opción 1' ); ?>>Opción 1</option>  
    <option value="Opción 2" <?php selected( $selected, 'Opción 2' ); ?>>Opción 2</option>  
</select>
<?php } ?>

y luego guardando esa información:

function save_price(){
    global $post;
    update_post_meta($post->ID, "price", $_POST["price"]);
    update_post_meta( $post->ID, 'location', esc_attr( $_POST['location'] ));  
}

¿Estoy haciendo esto correctamente? ¿Hay una manera fácil de lograr esto?

Muchas gracias.

2
Comentarios

Entonces, aparentemente <?php selected() ?> debería hacer esto por mí, pero no estoy seguro de dónde está mi error en este punto. Si estoy guardando la selección (porque cuando llamo al valor seleccionado en el bucle, es correcto), ¿por qué la función no está almacenando ese valor como $selected y comparándolo correctamente usando la función selected()?

RCNeil RCNeil
10 jul 2012 22:47:39

¿Por qué escapas una vez al guardar y otra vez al extraer los datos?

Bainternet Bainternet
10 jul 2012 22:58:17
Todas las respuestas a la pregunta 1
0

<?php selected() ?> compara el valor de los datos almacenados y qué opción debería aparecer primero, mi error fue que no estaba almacenando correctamente la variable para compararla.

$selected = isset( $values['location'] ) ? esc_attr( $values['location'][0] ) : '';

debería cambiarse a:

$selected = isset( $custom['location'] ) ? esc_attr( $custom['location'][0] ) : '';

Fue un simple error de sintaxis de mi parte, ya que estaba refiriéndome a la variable incorrectamente. Una vez que se realizó ese cambio, la función <?php selected( $selected, 'Opción 1' ); ?> comparará la variable vs. el texto en su lugar y luego mostrará selected="selected" para colocar ese elemento del menú desplegable en la parte superior.

11 jul 2012 20:27:40