Fiz um metabox que é para selecionar, dentro do post, um autor para aparecer. O autor é o título de um custom post type. Está funcionando e refletindo corretamente no front. O problema é que quando salvo/atualizo o post, a lista sempre vai mostrar o primeiro nome da lista e não o que foi selecionado.
<?php
//ADICIONANDO O META BOX
add_action( 'add_meta_boxes', 'vinil_meta_box_add' );
function vinil_meta_box_add(){
add_meta_box( 'my-meta-box-id', 'Autor Convidado', 'vinil_meta_box_vinil', 'post', 'normal', 'high' );
}
//FORMULARIO PARA SALVAR OS DADOS
function vinil_meta_box_vinil(){
$values = get_post_custom( $post->ID );
$selected = isset( $values['meta_box_select'] ) ? esc_attr( $values['meta_box_select'][0] ) : '';
wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
?>
<p>
<label for="meta_box_select">Autor Convidado</label>
<select name="meta_box_select" id="meta_box_select">
<?php
global $post;
$args = array(
'post_type' => 'wpll_convidado',
'order' => 'ASC',
);
$posts = query_posts($args);
?>
<?php foreach ( $posts as $post ) : setup_postdata($post);?>
<option value="<?php echo the_title() ?>" <?php selected( $selected, the_title() ); ?>><?php echo the_title() ?></option>
<?php endforeach;?>
</select>
</p>
<?php
}
add_action( 'save_post', 'vinil_meta_box_save' );
function vinil_meta_box_save( $post_id )
{
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
if( !current_user_can( 'edit_post' ) ) return;
if( isset( $_POST['meta_box_select'] ) )
update_post_meta( $post_id, 'meta_box_select', esc_attr( $_POST['meta_box_select'] ) );
}
?>
A estrutura do metabox peguei daqui: https://tableless.com.br/usando-meta-box-em-seu-tema-wordpress/