保存自定义POST类型的下拉菜单数据

时间:2014-12-03 作者:GuiHarrison

我将按照本教程介绍如何创建自定义字段。我以前已经使用过它,而且它很管用,但我只在文本输入时使用它。现在我想做一个下拉菜单,但我不能。事情如预期的那样出现了,但它只是没有保存。。。你能发现我遗漏了什么吗?

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 );
    }

1 个回复
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>
这是个愚蠢的错误,我很难在这里找到答案,因为我太懒或太累了,无法将这些价值观翻译成英语。

不管怎样,如果你对此感到困惑,只需知道你必须在两个地方都有相同的文本即可。

感谢所有读过这篇文章的人,即使你还没弄明白。

结束

相关推荐

更改标准POST格式Metabox

我在我的主题(WordPress admin)中添加了一个用于视频、图像、图库和聊天的元框,但我无法为标准帖子添加元框。当我为“Standard”添加帖子类型支持时,admin中的标准帖子格式是重复的。当从列表中选择第二个“标准”时,会添加一个元框,但它应该为第一个“标准”添加元框,并且不会显示两次。