web-dev-qa-db-fra.com

Index non défini: at_nonce dans Custom Post Metabox

Je reçois cette erreur avec mon post personnalisé metabox. La publication personnalisée et metabox fonctionnent bien, mais si je dois déboguer et quand j'essaie de sauvegarder une autre page ou une publication, j'obtiendrai une erreur:

Avis: Index non défini: at_nonce dans /Users/jay/site/wp-content/themes/mytheme/dogs-post-type.php à la ligne 53.

Avis: Index non défini: at_nonce dans /Users/jay/site/wp-content/themes/mytheme/dogs-post-type.php à la ligne 53.

Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par (sortie démarrée à /Users/jay/site/wp-content/themes/mytheme/dogs-post-type.php:53) dans/Users/jay/site/wp- includes/pluggable.php à la ligne 876

Mon code:

 <?php

      // Add new custom post for dogs
      function example_dogs_custom_init() {
          $args = array( 
            'label' => 'Dogs',
            'public' => true,
            'capability_type' => 'post',
            'hierarchical' => true,
            'has_archive' => true,
            'menu_position' => 5,
            'supports' => array('title', 'editor'),
            'rewrite' => array('slug' => 'pets/dogs', 'with_front' => false)
          );
          register_post_type( 'dogs', $args );
      }
      add_action( 'init', 'example_dogs_custom_init' );


      // METABOX breed
      add_action("add_meta_boxes", 'test_add_post_meta_boxes_breed');

      function test_add_post_meta_boxes_breed() {
        add_meta_box(
        'breed-meta',      // Unique ID
        'Breed',   // Title
        'breed_cb',   // Callback function
        'dogs',         // Admin page (or post type)
        'side',         // Context
        'default'         // Priority
        );
      }

      function breed_cb() {
        global $post;
        $breed_input = get_post_meta($post->ID, 'breed_field', true);

        // unique identifier, name of hidden field
        wp_nonce_field(__FILE__, 'at_nonce');
        ?>
        <label for="breed_field">Breed:</label>
        <input type="text" name="breed_field" id="breed_field" value="<?php echo $breed_input; ?>" />
        <br><span></span><?php
      }

      add_action('save_post', function() {
        global $post;
        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return;
        // security check - nonce

        // verify this came from the our screen and with proper authorizarion,
        // because save_post can be triggered at other times
        if ( $_POST && !wp_verify_nonce($_POST['at_nonce'], __FILE__) ) {
            return;
        }

        if ( isset($_POST['breed_field']) ) {
              update_post_meta($post->ID, 'breed_field', $_POST['breed_field']);
        }

      });

    ?>

Il y a quelque chose qui cloche dans le champ nonce mais je ne peux pas comprendre quoi. Si cela vous aide, la structure du code est tirée du cours sur les types de publications personnalisées WordPress de Jeffrey Ways.

1
jayjay

Ce sont vos lignes de problèmes:

if ( $_POST && !wp_verify_nonce($_POST['at_nonce'], __FILE__) ) {
    return;
}

Vous vérifiez que $_POST est défini, mais vous ne cochez pas $_POST['at_nonce']. Si $_POST est défini mais que cette clé ne l’est pas, vous obtiendrez une Notice. C'est une solution simple:

if ( isset($_POST['at_nonce']) && !wp_verify_nonce($_POST['at_nonce'], __FILE__) ) {
    return;
}

Lorsque cette Notice est imprimée, le contenu est envoyé au navigateur. Étant donné que ce contenu est envoyé avant que les en-têtes appropriés ne soient envoyés, vous recevez l'avertissement "Impossible de modifier les informations d'en-tête".

6
s_ha_dum

at_nonce n'existe pas lorsque vous enregistrez un autre type de message - d'où l'avis. Vous ne devriez vérifier le nonce que si vous avez déjà le bon type de message. Essayez de remplacer ceci

if ( $_POST && !wp_verify_nonce($_POST['at_nonce'], __FILE__) ) {
    return;
}

if ( isset($_POST['breed_field']) ) {
      update_post_meta($post->ID, 'breed_field', $_POST['breed_field']);
}

avec cela (non testé)

   if ( isset( $_POST['dogs'] ) && wp_verify_nonce( $_POST['at_nonce'], __FILE__  ) ) {
        update_post_meta($post->ID, 'breed_field', $_POST['breed_field']););
    }
0
vancoder