web-dev-qa-db-ja.com

$ POSTでは変数値が空だが$ _REQUESTでは利用可能なのはなぜ?

チュートリアルに従って、カスタムメタボックスをテーマに追加しようとしています。 https://www.sitepoint.com/adding-meta-boxes-post-types-wordpress/ .

私はメタボックスを見ることができ、それはデータベースから値を取得します(手動でpost-metaを更新することによって試みられます)。しかし、それは決して更新されません。 var_dump()を使って$_POST配列をデバッグしてみました。変数の値は空ですが、値は$_REQUESTにあります。誰もがこの理由を知っていますか?

不足している変数はpost-excerptです。これが私のコードです。

function buziness_add_custom_box() {
// Adding layout meta box for page
 add_meta_box(
    'offer-post-excerpt',
    esc_html__( 'Excerpt', 'buziness'),
    'buziness_post_excerpt',
    'post',
    'normal',
    'default'
 );
}

次はコールバック関数です:

function buziness_post_excerpt($post){
// Add a nonce field so we can check for it later
// Use nonce for verification
wp_nonce_field( basename( __FILE__ ) , 'custom_excerpt_nonce' );

$value = get_post_meta($post->ID, '_excerpt', true );

echo '<textarea style="width:100%" id="post_excerpt" name="post_excerpt">' . esc_attr( $value ) . '</textarea>';
echo "<p>Excerpts are optional hand-crafted summaries of your content that can be used in your theme</p>";

}

これはsave_postフックにフックされた関数です

add_action('save_post', 'buziness_save_post_excerpt');
/**
* save the custom excerpt metabox data
* @hooked to save_post hook
*/
function buziness_save_post_excerpt($post_id) {
    // Checks save status

    var_dump($_POST);
    var_dump($_REQUEST);
    wp_die($_REQUEST);
    $is_autosave = wp_is_post_autosave( $post_id );

    $is_valid_nonce = ( isset( $_POST[ 'custom_excerpt_nonce' ] ) && wp_verify_nonce( $_POST[ 'custom_excerpt_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

    // Exits script depending on save status
    if ( $is_autosave || !$is_valid_nonce ) {
       return;
    }

    // Check the user's permissions.
    if ( isset( $_POST['post_type'] ) && 'post' == $_POST['post_type'] ) {

        if ( ! current_user_can( 'edit_page', $post_id ) ) {
           return;
       }

   }
   else {

        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }
   }


   // Checks for input and sanitizes/saves if needed
   if( isset( $_POST[ 'post_excerpt' ] ) ) {
       update_post_meta( $post_id, '_excerpt', sanitize_text_field( $_POST[ 'post_excerpt' ] ) );
   }
}

これはvar_dump($_POST)からの出力の一部です。

'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string '' (length=0)
'post_mime_type' => string '' (length=0)
'ID' => int 96

そしてvar_dump($_REQUEST)からの出力の一部

'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string 'TES t ' (length=6)

ご覧のとおり、post_excerptの出力では '$_POST'の値は空です。

2
Digvijayad

$_REQUESTを使うのは悪い習慣です。 postリクエスト、getリクエスト、およびcookieの間では、実際のユーザ入力を処理していることを確信できず、URLやブラウザのメモリにゴミが残っているわけではありません。

メタボックスは "投稿"されているので、それらを処理するときは$_POSTのみを使用してください。

あなたのコードの他の側面は、あなたが "あなたのコード"に属さないものにアクセスしようとしているということです。グローバルな場所からアクセスするのではなく、常にそのためのAPIを使用することをお勧めします。私が誰かがそれをする理由はわからないが、ある時点ではある人は想像上の(あるいは想像上の理由ではない)理由で何らかの値を$_POSTから削除することをお勧めします。さらに、セーブハンドラのようなAPIは、ブラウザからは発生しなかった「セーブ」を処理するために呼び出されます。空またはゴミが入っています。

Ohhhhhhhhhhhhあなたは自分のフィールドの名前を使っていますが、名前の頭には付けられていません。それはそれ自体でワームの大きな缶です。グローバルスコープにあるすべてのものに常に接頭辞を付けます。

1
Mark Kaplun