web-dev-qa-db-ja.com

カスタムメイドのメタボックスにカスタム分類用語を保存することができません

「カスタム分類入力パネル」の作成方法については、 チュートリアル をおおまかに説明しました。私は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クラスを使用します。

私が間違っている可能性があるものについて何か提案はありますか?私はこれを一日中見てきたので、変数名が1文字か何か離れていることに気付くことを十分に期待しています。

編集:これは私がそれが正しく動作するように変更したものです:

隠しフィールドをナンスでエコーする代わりにwp_nonce_field( __FILE__, 'taxonomy_beds' );を使用し、ノンスを検証するときはif ( !wp_verify_nonce( $_POST['taxonomy_beds'], __FILE__ ) )を使用しました。

2

あなたの問題は一時的なものではないと思います。私はあなたがそれらを使用している方法でナンスをやろうとしたとき私が 私が抱えていた問題 で私がしたことをしていたようです。

これについて@EAMannを引用します。

このフィールドを作成する標準的な方法はWordPressのwp_nonce_field()関数を使うことです。隠しフィールドが追加されます。

wp_nonce_field( __FILE__, 'argus_edit_visitor' );

試してみて、それが機能するかどうかを確認してください。私はあなたのコードに何か問題があるとは思わない。

それでもうまくいかない場合は、print_r( $_POST['beds'] )を試して、送信されている内容を$_POST['beds']に表示してください。

1
Zack

Save関数がsave_postにフックしているのがわかりません

最後にこれを追加してみてください。

add_action( 'save_post' , 'save_taxonomy_data' , 1, 2); 
0
Chris_O