来自元盒子的值不在$_POST上

时间:2020-06-23 作者:hgodinho

我有一个cpt的元框,无法从表单中获取值update_post_meta

cpt declaration:

    function hgod_fichas()
    {
        $labels = array( … );

        $args = array(
            \'label\' => __(\'Fichas\', \'hgodinho\'),
            \'description\' => __(\'Fichamento\', \'hgodinho\'),
            \'labels\' => $labels,
            \'supports\' => array(\'title\', \'editor\', \'thumbnail\', \'revisions\'),
            \'hierarchical\' => false,
            \'public\' => true,
            \'show_ui\' => true,
            \'show_in_menu\' => true,
            \'menu_position\' => 5,
            \'show_in_admin_bar\' => true,
            \'show_in_nav_menus\' => true,
            \'can_export\' => true,
            \'has_archive\' => \'fichas\',
            \'exclude_from_search\' => false,
            \'publicly_queryable\' => true,
            \'capability_type\' => \'post\',
            \'show_in_rest\' => true,
        );
        register_post_type(\'hgod_fichas\', $args);
    }

meta-box declaration:

    function hgod_add_metabox($post_type)
    {
        $post_type = get_post_type();
    
        add_meta_box(
            $post_type . \'_metabox\',
            __(\'Ficha\', \'hgod\'),
            $post_type . \'_render\',
            $post_type,
        );
    }

meta-box callback:

    function hgod_fichas_render( $post )
    {
        $mb = get_post_meta($post->ID);   
        wp_nonce_field( basename( __FILE__ ), \'_hgod_fichas_mb_nonce\');
        ?>
        <p>
            <label for="ficha_tipo">Tipo:
            </label>
            <select name="ficha_tipo" id="ficha_tipo">
                <option value="none" selected disable hidden>Selecione o…</option>
                <option value="livro">livro</option>
                <option value="texto">texto</option>
                <option value="webpage">webpage</option>
                <option value="imagem">imagem</option>
                <option value="video">video</option>
                <option value="audio">audio</option>
                <option value="codigo">codigo</option>
            </select>
        </p>
    …

    }

Save function

问题在于这里,我无法从nounce中获取值,也无法从select字段中获取值,也无法从我的hgod_fichas_render() 函数的第一个条件返回:

    function hgod_save_ficha($post_id){
    
        if ( ! isset( $_POST[\'_hgod_fichas_mb_nonce\'] ) ) {
            return; // RETURN HERE
        }
     
        if ( ! wp_verify_nonce( $_POST[\'_hgod_fichas_mb_nonce\'], \'_hgod_fichas_mb_nonce\' ) ) {
            return;
        }
     
        if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
            return;
        }
     
        if ( ! current_user_can( \'edit_hgod_fichas\', $post_id ) ) {
            return;
        }
    
        $tipo_ficha = $_POST[\'ficha_tipo\'];
        
        $update_ficha = update_post_meta($post_id, \'_hgod_ficha_livro_autor\', $tipo_ficha);
        if ( !$update_ficha ){
            wp_die(\'nao salvou\' );
        } 
        
    }
有人能解释一下吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我在第一个条件下被返回

你确定吗?因为在我看来,这可能是第二个验证nonce的。

if ( ! wp_verify_nonce( $_POST[\'_hgod_fichas_mb_nonce\'], \'_hgod_fichas_mb_nonce\' ) ) {
    return;
}
但是,即使第一个条件也正在退出函数,您也应该知道wp_verify_nonce() 应匹配传递给的第一个参数wp_nonce_field().

因此

因为您使用wp_nonce_field( basename( __FILE__ ), \'_hgod_fichas_mb_nonce\');

  • 那么你应该使用wp_verify_nonce( $_POST[\'_hgod_fichas_mb_nonce\'], basename( __FILE__ ) ).