我大致遵循了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__ ) )