未保存自定义元数据

时间:2016-04-15 作者:Douglas de Moura

我创建了以下类,以便为我的帖子添加自定义元数据库,但数据没有保存。任何人都能说出我的代码有什么问题?

class Anotai_Meta_Box {
    public $prefix = \'anotai\';

    public function __construct() {
        if ( is_admin() ) {
            add_action( \'load-post.php\', array( $this, \'init_metabox\' ) );
            add_action( \'load-post-new.php\', array( $this, \'init_metabox\' ) );
        }
    }

    public function fields() {
        return array(
            array( \'nome\' => \'Título\', \'placeholder\' => \'Insira o título do evento\' ),
            array( \'nome\' => \'Descrição\', \'placeholder\' => \'Descreva o evento em poucas palavras.\', \'nota\' => \'Opcional\' ),
            array( \'nome\' => \'Data\', \'placeholder\' => \'dd/mm/aaaa\' ),
            array( \'nome\' => \'Data amigável\', \'placeholder\' => \'Insira a data de uma maneira mais amigável para as pessoas.\' ),
            array( \'nome\' => \'Endereço\', \'placeholder\' => \'\' )
        );
    }

    public function init_metabox() {
        add_action( \'add_meta_boxes\', array( $this, \'add_metabox\' ) );
        add_action( \'save_post\', array( $this, \'save_metabox\', 10, 2 ) );
    }

    public function add_metabox() {
        add_meta_box(
            $this->prefix . \'anotai\',
            \'Anotaí\',
            array( $this, \'render_metabox\' ),
            \'post\',
            \'advanced\',
            \'default\'
        );
    }

    public function input( $field, $post_id ) {
        $name = str_replace( \'-\', \'_\', sanitize_title( $field[\'nome\'] ) );
        $label = $field[\'nome\'];
        $value = json_decode( get_post_meta( $post_id, \'anotai\', true ) );
        $placeholder = $field[\'placeholder\'];
        echo \'<tr>\';
        echo "  <th><label for=\'{$name}\' class=\'{$name}_label\'>{$label}</label></th>";
        echo "  <td>";
        echo "  <input type=\'text\' autocomplete=\'off\' name=\'anotai[{$name}]\' value=\'{$value[$name]}\' placeholder=\'{$placeholder}\' class=\'large-text\'>";
        echo ( ! empty( $field[\'nota\'] ) ) ? "<span class=\'description\'>{$field[\'nota\']}</span>": \'\';
        echo "  </td>";
        echo \'</tr>\';
    }

    public function render_metabox( $post ) {
        var_dump(get_post_meta( $post->ID ));
        wp_nonce_field( \'anotai_nonce_action\', \'anotai_nonce\' );
        echo \'<table class="form-table">\';
        foreach ( $this->fields() as $field ) {
            $this->input( $field, $post->ID );
        }
        echo \'</table>\';
    }

    public function save_metabox( $post_id, $post ) {
        $nonce_name   = $_POST[\'anotai_nonce\'];
        $nonce_action = \'anotai_nonce_action\';
        if ( ! isset( $nonce_name ) )
            return;

        if ( ! wp_verify_nonce( $nonce_name, $nonce_action ) )
            return;


        if ( ! current_user_can( \'edit_post\', $post_id ) )
            return;

        if ( wp_is_post_autosave( $post_id ) )
            return;

        if ( wp_is_post_revision( $post_id ) )
            return;

        foreach ( $_POST[\'anotai\'] as $key => $value ) {
            $_POST[\'anotai\'][$key] = sanitize_text_field( $value );
        }

        update_post_meta( $post_id, \'anotai\', json_encode( $_POST[\'anotai\'] ) );

    }

}

new Anotai_Meta_Box;

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

add_action( \'save_post\', array( $this, \'save_metabox\', 10, 2 ) );
应该是

add_action( \'save_post\', array( $this, \'save_metabox\' ), 10, 2 );
如果你enable debugging, 你会看到call_user_func_array 由此生成的错误。

还有其他一些事情-

你应该检查一下$_POST[\'anotai_nonce\'] 在您的save_metabox 作用

您不需要对数据进行json编码,数组将自动序列化/取消序列化,并可以直接传递给post元函数。

如果使用下划线作为元键的前缀,它将在默认自定义字段元框中隐藏。

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在