无法在自定义构建的Metabox中保存自定义分类术语

时间:2011-02-09 作者:Travis Northcutt

我大致遵循了tutorial here 关于如何创建“自定义分类输入面板”。我正在使用自定义帖子类型homes 还有一种自定义分类法beds (用于记录一所房子的床位数)。我已经在下拉菜单中显示了分类术语,但无法在保存帖子时保存它们。我开始只是发布旨在保存术语的代码,但意识到我应该发布创建和显示元盒的代码,以用于上下文。自定义帖子类型名称为“homes”,自定义分类名称为“beds”。分类法是分层的(我认为这并不重要,但我可能错了)。

//adding metaboxes for the homes post type
function add_homes_metaboxes() {
    add_meta_box( \'blackstone_homes_beds\', \'Beds\', \'blackstone_homes_beds\', \'homes\', \'side\', \'default\' );
}

function add_homes_menus() {
    if ( !is_admin() )
        return;
    add_action( \'admin_menu\', \'add_homes_metaboxes\' );
    /* Use the save_post action to save new post data */
    add_action( \'save_post\', \'save_taxonomy_data\' );
}

add_homes_menus();

function blackstone_homes_beds( $post ) {

    echo \'<input type="hidden" name="beds_noncename" id="beds_noncename" value="\' .
    wp_create_nonce( \'taxonomy_beds\' ) . \'" />\';

    // Get all theme taxonomy terms
    $beds = get_terms( \'beds\', \'hide_empty=0\' );
    $stuff = array( \'this\', \'that\' );
    //print_r($beds);
?>
<select name=\'homes_beds\' id=\'homes_beds\'>
    <!-- Display beds as options -->
<?php
    $names = wp_get_object_terms( $post->ID, \'beds\' );
?>
    <option class=\'beds-option\' value=\'\'
            <?php if ( !count( $names ) )
                echo "selected"; ?>>None</option>
            <?php
            foreach ( $beds as $bed ) {
                if ( !is_wp_error( $names ) && !empty( $names ) && !strcmp( $bed->slug, $names[0]->slug ) )
                    echo "<option class=\'beds-option\' value=\'" . $bed->slug . "\' selected>" . $bed->name . "</option>\\n";
                else
                    echo "<option class=\'beds-option\' value=\'" . $bed->slug . "\'>" . $bed->name . "</option>\\n";
            }
            ?>
            </select>
<?php
        }

        function save_taxonomy_data( $post_id ) {
// verify this came from our screen and with proper authorization.

            if ( !wp_verify_nonce( $_POST[\'beds_noncename\'], \'taxonomy_beds\' ) ) {
                return $post_id;
            }

            // verify if this is an auto save routine. If it is our form has not been submitted, so we dont want to do anything
            if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
                return $post_id;

            // Check permissions
            if ( \'homes\' == $_POST[\'post_type\'] ) {
                if ( !current_user_can( \'edit_page\', $post_id ) )
                    return $post_id;
            } else {
                if ( !current_user_can( \'edit_post\', $post_id ) )
                    return $post_id;
            }

            // OK, we\'re authenticated: we need to find and save the data
            $post = get_post( $post_id );
            if ($post->post_type == \'homes\'){
                $beds = $_POST[\'homes_beds\'];
                wp_set_object_terms( $post_id, $beds, \'beds\' );
            }
            return $beds;
        }
我知道还有一个very similar question 这里已经有了,但它的解决方案使用WPAlchemy类,我不想这样做。

对我可能有什么错有什么建议吗?我整天都在盯着这个,所以我完全希望发现我只是用一个字符或其他什么东西去掉了一个变量名。

编辑:以下是我为使其正常工作所做的更改:

我使用了wp_nonce_field( __FILE__, \'taxonomy_beds\' ); 在验证nonce时,我使用if ( !wp_verify_nonce( $_POST[\'taxonomy_beds\'], __FILE__ ) )

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

我相信你的问题可能与现在有关。我知道你在做我曾经做过的事a problem I had 当我试着用你现在的方式来做nonces的时候。

我会引用@EAMann 关于此:

创建此字段的标准方法是使用WordPress\'wp_nonce_field() 作用它将为您添加隐藏字段:

wp_nonce_field( __FILE__, \'argus_edit_visitor\' );
试试看,看看是否有效。我看不出你的代码还有其他问题。

如果不行,试试看print_r( $_POST[\'beds\'] ) 以显示在中提交的内容$_POST[\'beds\'].

SO网友:Chris_O

我看不到save函数挂接到save_post

尝试将此添加到末尾。

add_action( \'save_post\' , \'save_taxonomy_data\' , 1, 2); 

结束

相关推荐

是否将页面属性Metabox和页面模板添加到帖子编辑页面?

(Moderators note: 标题最初是“如何将“页面属性”和/或“页面属性>模板”选择器添加到帖子编辑器”)WP目前只允许将“模板”分配给页面(即。post_type==\'page\'.) 我还想将此功能扩展到帖子(即。post_type==\'post\'.)如何将“页面属性”元框以及更具体地说,模板切换器添加到帖子编辑器中?我假设这是我将在functions.php 对于我的主题。更新:我成功地将硬编码模板下拉菜单添加到我的帖子编辑器中,只需将选择框html添加到我现有的自定义元选项框