web-dev-qa-db-ja.com

オプション配列を検証する

テーマオプションを検証するために、デフォルトのWordPress register_setting()関数を使います。この呼び出しは、例えば:

register_setting( 'options-group', 'option1', 'intval' );

$option1が整数かどうかを検証します。

配列の各メンバを検証するためにオプションの配列を渡すために使用できるものは何ですか?

例えば:

$options = array(
    'options1' => 4,              // intval
    'options2' => '127.0.0.1',    // IP address
    'options3' => '[email protected]' // Email address
);
3
Ünsal Korkmaz

あなたがする必要があるのはあなた自身のデータ検証機能を構築することです。 Ozhは 素晴らしいチュートリアル についてこれ以前に書いたが、ここにその要旨がある….

Options配列が$my_optionsであり、3つのフィールド'text''age'、および'isauthorized'が含まれているとします。

それでも同じ方法で登録します。

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

しかし、3番目のパラメータにカスタムコールバックをどのように使用したかわかりますか。それでは、そのカスタム関数を定義するだけです。

function my_validation_function( $input ) {
    // Validate age as an integer
    $input['age'] = intval( $input['age'] );

    // Strip HTML tags from text to make it safe
    $input['text'] = wp_filter_nohtml_kses( $input['text'] );

    // Make sure isauthorized is only true or false (0 or 1)
    $input['isauthorized'] = ( $input['isauthorized'] == 1 ? 1 : 0 );

    return $input;
}

または

検証機能をもう少し柔軟にしたい場合は、WordPressの組み込みフィルタを使用してコードを繰り返す必要がなくなります。あなたはまだあなたの検証を同じ方法で登録します:

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

しかし、検証関数内で配列の各要素をチェックする代わりに、配列を反復処理してフィルタに委任します。

function my_validation_function( $input ) {
    foreach( $input as $key => $value ) {
        $input[$key] = apply_filters( 'my_validation_' . $key, $value );
    }

    return $input
}

今、あなたはあなたが必要とするどんなバリデーションロジックででもフックすることができます:

add_filter( 'my_validation_age', 'validate_numeric' );
function validate_numeric( $numeric ) {
    return intval( $numeric );
}

add_filter( 'my_validation_text', 'validate_text' );
function validate_text( $text ) {
    return wp_filter_nohtml_kses( $text );
}

add_filter( 'my_validation_isauthorized', 'validate_bool' );
function validate_bool( $bool ) {
    return $bool == 1 ? 1 : 0;
}

オプションの1つにフィルタを追加しないと、オプションの値は変わりません。フィルタはまた、 return contentという関数を使いたい方法でもあり、好きなだけ追加したり、フィルタを任意のフィールドに添付することもできます。

配列に2つの数値フィールドagenumberChildrenがあるとしましょう。 numberChildrenフィールドを処理できる追加の検証関数を作成する代わりに、それをフィルタに追加するだけです。

add_filter( 'my_validation_numberChildren', 'validate_numeric' );
11
EAMann

「配列内のオプションごとに異なる関数の使い方」の解決策は私の夢のようではないようですが、これでうまくいくはずです。

register_setting( 'my_setting', 'my_options', 'my_validation_function' );

function my_validation_function( $input ) {
    foreach ($input as $option=>$value){
        do_action('my_validation_'.$option, $option, $value);
    }
    return $input;
}

それから私はこのように各オプションの検証にカスタム関数を使用することができます:

add_action('my_validation_age', 'my_validation_function_for_age', 10, 2);
function my_validation_function_for_age($option, $value) {
    $input[$option] = intval( $value );
}

add_action('my_validation_text', 'my_validation_function_for_text', 10, 2);
function my_validation_function_for_text($option, $value) {
    $input[$option] = wp_filter_nohtml_kses( $value );
}

add_action('my_validation_isauthorized', 'my_validation_function_for_isauthorized', 10, 2);
function my_validation_function_for_isauthorized($option, $value) {
    $input[$option] = ( $value == 1 ? 1 : 0 );
}

将来の訪問者のためにここに書いてください。 EAMannの解決策を受け入れる。

1
Ünsal Korkmaz