web-dev-qa-db-ja.com

未定義のインデックス:カスタムポストメタボックスのat_nonce

カスタムポストメタボックスでこのエラーが発生します。カスタム投稿とメタボックスは正常に動作しますが、デバッグをしていて他のページや投稿を保存しようとするとエラーになります。

Notice:未定義のインデックス:/Users/jay/site/wp-content/themes/mytheme/dogs-post-type.phpの53行目のat_nonce

Notice:未定義のインデックス:/Users/jay/site/wp-content/themes/mytheme/dogs-post-type.phpの53行目のat_nonce

Warning:ヘッダ情報は変更できません - /Users/jay/site/wp-の(/Users/jay/site/wp-content/themes/mytheme/dogs-post-type.php:53から始まる出力)によってすでに送信されているヘッダ876行目のincludes/pluggable.php

私のコード:

 <?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']);
        }

      });

    ?>

Nonceフィールドには問題がありますが、何がわかりません。それが助けになるなら、コード構造はWordPressカスタム投稿タイプのJeffrey Ways The Magicからのものです。

1
jayjay

これらはあなたの問題の行です:

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

$_POSTが設定されていることを確認しますが、$_POST['at_nonce']は確認しません。 $_POSTが設定されていてもそのキーが設定されていない場合は、Noticeが返されます。これは簡単な修正です。

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

そのNoticeが印刷されると、コンテンツがブラウザに送信されます。そのコンテンツは適切なヘッダが送信される前に送信されているため、それらの適切なヘッダが送信されると、「ヘッダ情報を変更できません」という警告が表示されます。

6
s_ha_dum

他の投稿タイプを保存するときにat_nonceは存在しません。あなたがすでに正しい投稿タイプを持っている場合にのみ、ナンスをチェックするべきです。これを交換してみてください

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']);
}

これで(未テスト)

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