web-dev-qa-db-fra.com

Impossible d'enregistrer les termes de taxonomie personnalisés dans une métabox personnalisée

J'ai à peu près suivi le tutoriel ici sur la création de "panneaux de saisie de taxonomie personnalisés". J'utilise un type de message personnalisé de homes et une taxonomie personnalisée appelée beds (utilisée pour enregistrer le nombre de lits dans une maison). J'ai les termes de taxonomie apparaissant dans un menu déroulant, mais je ne peux pas les faire enregistrer lorsque la publication est enregistrée. J'ai commencé à simplement poster le code destiné à sauvegarder le terme, mais je me suis rendu compte que je devais poster le code qui crée et affiche également la metabox, pour le contexte. Le nom du type de message personnalisé est 'homes' et le nom de la taxonomie personnalisée est 'lits'. La taxonomie est hiérarchique (pas que je pense que cela compte dans ce cas, mais je peux me tromper).

//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;
        }

Je sais qu’il ya déjà une autre question très similaire , mais sa solution utilise la classe WPAlchemy, et je préfère ne pas le faire.

Des suggestions sur ce que je pourrais avoir tort? Cela fait toute la journée que je regarde ça, alors je m'attends vraiment à découvrir que je viens de recevoir un nom de variable par un caractère ou quelque chose.

EDIT: Voici ce que j'ai changé pour le faire fonctionner correctement:

Au lieu de faire écho au champ caché avec le nonce, j'ai utilisé wp_nonce_field( __FILE__, 'taxonomy_beds' ); et lors de la vérification du nonce, j'ai utilisé if ( !wp_verify_nonce( $_POST['taxonomy_beds'], __FILE__ ) )

2
Travis Northcutt

Je crois que votre problème pourrait être non lié. Je vois que vous faites ce que j'ai fait à un moment donné avec un problème que j'ai rencontré lorsque j'ai essayé de faire des nonces de la façon dont vous les utilisez.

Je citerai @ EAMann à ce sujet:

La méthode standard pour créer ce champ utilise la fonction wp_nonce_field() de WordPress. Il va ajouter le champ caché pour vous:

wp_nonce_field( __FILE__, 'argus_edit_visitor' );

Essayez ça, voyez si ça marche. Je ne vois rien d'autre de mal avec votre code.

Si cela ne fonctionne pas, essayez print_r( $_POST['beds'] ) pour révéler ce qui est soumis dans $_POST['beds'].

1
Zack

Je ne vois pas la fonction de sauvegarde s'accrocher dans save_post

Essayez d'ajouter ceci à la fin.

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