Невозможно сохранить пользовательские термины таксономии в специально созданном метабоксе


Я примерно следовал учебнику здесь о том, как создать "пользовательские панели ввода таксономии". Я использую пользовательский тип записи 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__ ) )

Author: Community, 2011-02-09

2 answers

Я полагаю, что ваша проблема может быть не связана с этим. Я вижу, что вы делаете то, что я делал в какой-то момент с проблемой, с которой я столкнулся, когда я попытался сделать не так, как вы их используете.

Я процитирую @Эманна по этому поводу:

Стандартный способ создания этого поля использует WordPress'wp_nonce_field() функция. Он добавит скрытое поле для вас:

wp_nonce_field( __FILE__, 'argus_edit_visitor' );

Попробуйте это, посмотрите, сработает ли это. Я больше не вижу ничего плохого в вашем коде.

Если это не работает, попробуйте print_r( $_POST['beds'] ) показать, что отправляется в $_POST['beds'].

 1
Author: Zack, 2017-04-13 12:37:34

Я не вижу, чтобы функция сохранения подключалась к save_post

Попробуйте добавить это в конец.

add_action( 'save_post' , 'save_taxonomy_data' , 1, 2); 
 0
Author: Chris_O, 2011-02-09 22:14:03