web-dev-qa-db-fra.com

La case à cocher enregistre mais ne met pas à jour la valeur dans admin

J'ai un menu déroulant de sélection dans ma méta-boîte personnalisée dans la zone d'administration. Il offre deux options approuvées et en cours . Lorsque je sélectionne une option et la sauvegarde, la base de données est mise à jour, mais la valeur dans la zone d'administration ne l'est pas. Ce que je vois est le premier élément de la liste affichée dans la zone de sélection. c’est-à-dire que si je sélectionne en cours et enregistre l’administrateur affiche approuvé en tant que valeur sélectionnée même s’il est enregistré en tant que En cours dans la base de données et affiche En cours au début du site.

Voici mon code:

<label for="myplugin_meta_box_select">Status:</label>
<select name="myplugin_meta_box_select" id="myplugin_meta_box_select">
  <option value="Approved" <?php selected( $selected, 'approved' ); ?>>Approved</option>
  <option value="In Progress" <?php selected( $selected, 'inprogress' ); ?>>In Progress</option>
</select>

Et je le sauve avec ceci:

if( isset( $_POST['myplugin_meta_box_select'] ) )
        update_post_meta( $post_id, 'myplugin_meta_box_select', esc_attr( $_POST['myplugin_meta_box_select'] ) );

Qu'est-ce que j'ai manqué?

1
MrFox

Le deuxième paramètre de selected() doit correspondre à l'attribut value du <option> en cours. Donc, en supposant que vous ayez bourré $selected avec la valeur donnée par la get_post_meta() correspondante, les opérations suivantes devraient fonctionner pour vous:

<label for="myplugin_meta_box_select">Status:</label>
<select name="myplugin_meta_box_select" id="myplugin_meta_box_select">
  <option value="Approved" <?php selected( $selected, 'Approved' ); ?>>Approved</option>
  <option value="In Progress" <?php selected( $selected, 'In Progress' ); ?>>In Progress</option>
</select>

Note latérale: Je préférerais personnellement utiliser la version "lente" (c'est-à-dire inprogress au lieu de In Progress) pour l'attribut value (et donc pour la méta valeur de la publication), mais vous auriez faire des changements sur votre front-end aussi.

2
geomagas

C'est ce qui a fonctionné pour moi à la fin. J'ai utilisé cela pour ajouter un metabox:

<?php add_action( 'add_meta_boxes', 'so_custom_meta_box' );
function so_custom_meta_box($post){
add_meta_box('so_meta_box', 'Additional', 'custom_element_grid_class_meta_box',     'event', 'normal' , 'high');
}
add_action('save_post', 'so_save_metabox');

function so_save_metabox(){ 
global $post;
if(isset($_POST["custom_element_grid_class"])){
    $region = $_POST['region_sel'];
    update_post_meta($post->ID, 'region_sel_meta_box', $region);
}
}
function custom_element_grid_class_meta_box($post){
$region = get_post_meta($post->ID, 'region_sel_meta_box', true);
?>   
<label>Region:  </label>
<select name="region_sel" id="region_sel"> 
    <option value="Region1" <?php selected( $region, 'Region1' ); ?>>Region1</option>
    <option value="Region2" <?php selected( $region, 'Region2' ); ?>>Region2</option>
</select>
<?php } ?>
2
MrFox