web-dev-qa-db-ja.com

ポストメタの選択ボックスの値をサニタイズする方法

Postメタに選択ボックスを追加しました。これがコードです、そしてそれはうまく働きます。私の質問は、ポストメタを更新する前に値をサニタイズする必要があるかということです。そうであれば、どうすればよいでしょうか。

これがメタフィールドの追加方法です。

<?php $value = get_post_meta( $post->ID, 'my_options', true ); ?>
<select name="my_options">
    <option value="option1" <?php selected( $value, 'option1'); ?>><?php _e('Option 1', 'textdomain'); ?></option>
    <option value="option2" <?php selected( $value, 'option2'); ?>><?php _e('Option 2', 'textdomain'); ?></option>
</select>

これが値の更新方法です。

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

ユーザーデータの入力を受け付けるときは、サニタイズだけでなく、可能であればデータ検証を実行する必要があると思います。たとえば、数値、ブール値、テキスト文字列(入力がselectboxの場合でも文字列値を持つことができます)などを想定することができます。そのデータ型に対して数値化することができます。その後、さらに進んで、期待値(整数、浮動小数点、true/false、電子メール、URLなど)に対してデータを検証できます。

あなたのselectboxで行きましょう。値が "option1"と "option2"の2つのオプションがあるので、どちらも文字列で、sanitize_text_fieldでサニタイズできます。

if ( isset( $_POST['my_options'] )){

    $value = sanitize_text_field( $_POST['my_options'] );

    update_post_meta( $post->ID, 'my_options', $value );  

}

しかし、ユーザーはフォーム選択オプションの値をフロントエンドから簡単に変更できるので、彼/彼女はフォームを操作してデータベースに格納する "option1"または "option2"とは異なる値を送信できます。期待値が正確にわかっているので、データのサニタイズとデータの検証を行うことができます。例えば:

if ( isset( $_POST['my_options'] )){

   $valid_values = array(
                       'option1',
                       'option2',
   );

    $value = sanitize_text_field( $_POST['my_options'] );

    if( in_array( $value, $valid_values ) ) {

        update_post_meta( $post->ID, 'my_options', $value );

    }

}

あるいは、 "my_options"オプション用のカスタムサニタイズコールバックを定義してsanitize_metaを使用することもできます。

if ( isset( $_POST['my_options'] ) ){

        $value = sanitize_meta( 'my_options', $_POST['my_options'], 'post' )

        update_post_meta( $post->ID, 'my_options', $value );

}

そして、santitizationコールバックを定義してください。

add_filter( 'sanitize_post_meta_my_options', 'sanitize_my_options_meta' );

function sanitize_my_options_meta( $value ) {

   $value = sanitize_text_field( $value );

   $valid_values = array(
                       'option1',
                       'option2',
   );

   if( ! in_array( $value, $valid_values ) ) {

        wp_die( 'Invalid value, go back and try again.' );
    }

    return $value;
}
5
cybmeta

Wordpressに組み込まれている衛生機能( sanitize_text_field など)を使用できます。あるいは、特定の要素が選択オプションに挿入されるのではないかと心配する場合は、 sanitize_meta 関数を使用して独自の衛生機能を記述できます。

0