Невозможно сохранить пользовательские термины таксономии в специально созданном метабоксе
Я примерно следовал учебнику здесь о том, как создать "пользовательские панели ввода таксономии". Я использую пользовательский тип записи 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;
}
Я знаю, что здесь уже есть другой очень похожий вопрос, но для его решения используется класс WPAlchemy, и я бы предпочел этого не делать.
Есть какие-нибудь предложения по поводу того, в чем я мог ошибиться? Я смотрел на это весь день, так что я полностью ожидаю узнать, что я просто получил имя переменной на один символ или что-то в этом роде.
РЕДАКТИРОВАТЬ: Вот что я изменил, чтобы заставить его работать правильно:
Вместо того, чтобы повторять скрытое поле с помощью nonce, я использовал wp_nonce_field( __FILE__, 'taxonomy_beds' );
, и при проверке nonce я использовал if ( !wp_verify_nonce( $_POST['taxonomy_beds'], __FILE__ ) )
2 answers
Я полагаю, что ваша проблема может быть не связана с этим. Я вижу, что вы делаете то, что я делал в какой-то момент с проблемой, с которой я столкнулся, когда я попытался сделать не так, как вы их используете.
Я процитирую @Эманна по этому поводу:
Стандартный способ создания этого поля использует WordPress'
wp_nonce_field()
функция. Он добавит скрытое поле для вас:wp_nonce_field( __FILE__, 'argus_edit_visitor' );
Попробуйте это, посмотрите, сработает ли это. Я больше не вижу ничего плохого в вашем коде.
Если это не работает, попробуйте print_r( $_POST['beds'] )
показать, что отправляется в $_POST['beds']
.
Я не вижу, чтобы функция сохранения подключалась к save_post
Попробуйте добавить это в конец.
add_action( 'save_post' , 'save_taxonomy_data' , 1, 2);