web-dev-qa-db-ja.com

新しいページを追加する際の未定義の 'post_type'エラー

私は次のコードを参照してくださいページのメタボックスを作成しました:

add_action('add_meta_boxes', 'add_metaboxes');

function add_metaboxes() {
    add_meta_box(
        'wpt_slider_meta',
        'Add Slider Image',
        'wpt_slider_meta',
        'slider',
        'normal',
        'default'
    );      
}

function wpt_slider_meta() {
    global $post;

    wp_nonce_field(plugins_url(__FILE__), 'meta_slider_noncename');

    $values = get_post_meta($post->ID, '_meta-slider_img', true);

    // Some html and scripts to upload image.
}

add_action( 'save_post', 'save_slider_img' );
function save_slider_img( $post_id ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;

     if ( 'slider' == $_POST['post_type']  ) {
        if ( !current_user_can( 'edit_page', $post_id ) )
            return;
    } else {
        if ( !current_user_can( 'edit_post', $post_id ) )
            return;
    }

    if(wp_verify_nonce($_POST['meta_slider_noncename'], plugins_url(__FILE__)) )
    {
        $images = $_POST['meta-slider_img'];
        update_post_meta( $post_id, '_meta-slider_img', $images );
    }
}

[新しいページを追加]をクリックすると、2つの警告が表示されます。これを除けば、すべてのコードは問題なく動作します。

Notice: Undefined index: post_type in /var/www/html/transport/wp-content/themes/transport/functions.php on line 192

Notice: Undefined index: meta_slider_noncename in /var/www/html/transport/wp-content/themes/transport/functions.php on line 200

誰でも手伝える?

1
PlanetHackers

postが挿入または更新されたときにsave_postが呼び出されます。新しい投稿にアクセスすると投稿が作成されデータベースに挿入されます。それは実際には下書きです。その時点では$_POSTは空白なので、警告が出ています。

解決策:

最善の選択肢は、nonceが見つからないとすぐに関数を終了することです。そしてisset()を使ってキーが存在するかどうかをチェックします。

例:

function save_slider_img( $post_id ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    } 

    if (!isset($_POST['meta_slider_noncename'])) {
        return;
    }

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

    if ('slider' == $_POST['post_type'] && current_user_can( 'edit_page', $post_id )) { 
        $images = isset($_POST['meta-slider_img']) ? $_POST['meta-slider_img'] : false;
        update_post_meta( $post_id, '_meta-slider_img', $images );
    }
}
2
Sumit