我将按照本教程介绍如何创建自定义字段。我以前已经使用过它,而且它很管用,但我只在文本输入时使用它。现在我想做一个下拉菜单,但我不能。事情如预期的那样出现了,但它只是没有保存。。。你能发现我遗漏了什么吗?
add_action( \'add_meta_boxes\', \'cd_meta_box_add\' );
function cd_meta_box_add()
{
add_meta_box( \'sobreOProjeto\', \'Sobre o projeto\', \'projeto_callback\', \'Projetos\', \'normal\', \'default\' );
}
function projeto_callback($post) {
global $post;
$values = get_post_custom( $post->ID );
$text = isset( $values[\'ano\'] ) ? esc_attr( $values[\'ano\'][0] ) : \'\';
$selected = isset( $values[\'estadoDaObra\'] ) ? esc_attr( $values[\'estadoDaObra\'][0] ) : \'\';
$check = isset( $values[\'institucional\'] ) ? esc_attr( $values[\'institucional\'][0] ) : \'\';
wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );
?>
<p>
<label for="ano">Ano de Criação</label>
<input type="text" name="ano" id="ano" value="<?php echo $text; ?>" />
</p>
<p>
<label for="estadoDaObra">Estado da Obra</label>
<select name="estadoDaObra" id="estadoDaObra">
<option value="não construído" <?php selected( $selected, \'nao_construido\' ); ?>>não construído</option>
<option value="em construção" <?php selected( $selected, \'em_construcao\' ); ?>>em construção</option>
<option value="construído" <?php selected( $selected, \'construido\' ); ?>>construído</option>
</select>
</p>
<p>
<input type="checkbox" id="institucional" name="institucional" <?php checked( $check, \'off\' ); ?> />
<label for="institucional">Institucional</label>
</p>
<?php
}
add_action( \'save_post\', \'sobreAObra_salvar\' );
function sobreAObra_salvar( $post_id ){
// Bail if we\'re doing an auto save
if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
// if our nonce isn\'t there, or we can\'t verify it, bail
if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
// if our current user can\'t edit this post, bail
if( !current_user_can( \'edit_post\' ) ) return;
// now we can actually save the data
$allowed = array(
\'a\' => array( // on allow a tags
\'href\' => array() // and those anchors can only have href attribute
)
);
// Make sure your data is set before trying to save it
if( isset( $_POST[\'ano\'] ) )
update_post_meta( $post_id, \'ano\', wp_kses( $_POST[\'ano\'], $allowed ) );
if( isset( $_POST[\'estadoDaObra\'] ) )
update_post_meta( $post_id, \'estadoDaObra\', esc_attr( $_POST[\'estadoDaObra\'] ) );
// This is purely my personal preference for saving check-boxes
$chk = isset( $_POST[\'institucional\'] ) && $_POST[\'estadoDaObra\'] ? \'on\' : \'off\';
update_post_meta( $post_id, \'institucional\', $chk );
}
SO网友:GuiHarrison
我发现了我的问题。这个选择确实被保存了下来,只是没有在编辑器中显示给我(它总是显示给我第一个选择)。问题是,$selected函数将所选输入与所提供的字符串进行比较,在我的例子中,所提供的字符串填写不正确。因此,以下代码:
<select name="estadoDaObra" id="estadoDaObra">
<option value="não construído" <?php selected( $selected, \'nao_construido\' ); ?>>não construído</option>
<option value="em construção" <?php selected( $selected, \'em_construcao\' ); ?>>em construção</option>
<option value="construído" <?php selected( $selected, \'construido\' ); ?>>construído</option>
</select>
实际上应该是:
<select name="estadoDaObra" id="estadoDaObra">
<option value="não construído" <?php selected( $selected, \'não construído\' ); ?>>não construído</option>
<option value="em construção" <?php selected( $selected, \'em construção\' ); ?>>em construção</option>
<option value="construído" <?php selected( $selected, \'construído\' ); ?>>construído</option>
</select>
这是个愚蠢的错误,我很难在这里找到答案,因为我太懒或太累了,无法将这些价值观翻译成英语。
不管怎样,如果你对此感到困惑,只需知道你必须在两个地方都有相同的文本即可。
感谢所有读过这篇文章的人,即使你还没弄明白。