web-dev-qa-db-ja.com

設定API-URL、メールアドレス、テキストのサニタイズ

このコードの書き方に関するベストプラクティスに関するアドバイスを求めています。現在、テンプレートに情報を出力するテキストフィールドを備えたシンプルなテーマオプションがあります。現在、このコードをプレーンテキストの設定APIとサニタイズに使用しています。私の質問は、追加の設定フィールドはWebサイトのフィールドであり、電子メールのフィールドでもあります。登録済みの設定を個別に(および各タイプに対して適切に)直接サニタイズできるように、または同じoem_theme_profile_optionsサニタイズ内ですべてを組み合わせることができるように、別のテーマオプション、セクション、およびフィールド全体を作成する必要があるかどうかはわかりません。私はまだ最高のphp男ではありません。したがって、ベストプラクティスの観点からこれを理解することは、将来の教育に役立ち、データベースに複数のオプションを作成することにつながりません。

function oem_theme_initialize_profile_options() {

        if( false == get_option('oem_theme_profile_options')) {
                add_option('oem_theme_profile_options');
        }

        add_settings_section(
                'profile_settings_section',
                'Profile Options',
                'oem_profile_options_callback',
                'oem_theme_profile_options'
        );

            add_settings_field(
                    'personal_name',
                    'Name', 
                    'oem_personal_name_callback',
                    'oem_theme_profile_options',
                    'profile_settings_section'
            );
                     register_setting(
                            'oem_theme_profile_options',
                            'oem_theme_profile_options',
                            'oem_theme_sanitize_profile_options' // Here is where all these options get sanitized the same.
                    );
} // end of oem_theme_initialize_profile_options

add_action('admin_init', 'oem_theme_initialize_profile_options');


function oem_profile_options_callback() {
        echo '<p>Provide the URL to the profile networks you\'d like to display</p>';
} // end oem_profile_options_callback

function oem_personal_name_callback() {

        // First, we read the profile options collection
        $options = get_option('oem_theme_profile_options');

        // Next, we need to make sure the elment is defined in the options. If not, we'll set an empty string.
        $url = '';
        if (isset( $options['personal_name'] )) {
                $url = $options['personal_name'];
        }

        // Render the output
        echo '<input type="text" id="personal_name" name="oem_theme_profile_options[personal_name]" value="' . $options['personal_name'] . '" />';
} // end oem_personal_name_callback

テキストの消毒

function oem_theme_sanitize_profile_options($input) {

        //Define the array for the updated options
        $output = array();

        // Loop through each of the options sanitizing the data
        foreach ($input as $key => $val) {

                if( isset($input[$key]) ) {
                        $output[$key] = strip_tags( stripslashes($input[$key]));
                } // end if
        } // end foreach

        return apply_filters( 'oem_theme_sanitize_profile_options', $output, $input );
} // end oem_theme_sanitize_profile_options
6
chris_s

毎回add_settings_section()とadd_settings_field()を使用する代わりに、オプションの配列を返す関数を作成します。例えば:

function my_theme_options() {
$options = array();

$options[] = array(
                'id' => 'ID',
                'title' => 'Title',
                'type' => 'text_field', // use this value to sanitize/validate input
                'validate' => 'url' // use this value to validate the text as url
                // add as much as you need like description, default value ...
            );

$options[] = array(
                'id' => 'ID_2',
                'title' => 'Title',
                'type' => 'text_field',
                'validate' => 'email' // use this value to validate the text as email
                // add as much as you need like description, default value ...
            );

// every time you want to add a field you'll use this function an create a new array key $options[] = array();

return $options;

}

この関数を使うと、add_settings_field()を使うforeachループで各フィールドを登録できます。

この関数を使用して、register_setting()のためのコールバック関数を1つ作成し、switchを使用して入力を検証することができます。次に例を示します。

// this should be the callback function of register_setting() (last argument)
function validate_settings($input) {
$options = my_theme_options(); // we'll set $options variable equal to the array we created in the function before

$valid_input = array(); // this will be the array of the validated settings that will be saved to the db, of course using one array for all options.

foreach ($options as $option) {
    switch ( $option['type'] ) { // $option['type'] where type is the key we set before in my_theme_options()
        case 'text_field':
            // inside we'll create another switch that will use the validate key we created in my_theme_options()
            switch( $option['validate'] ) {
                case 'url':
                    // validate url code

                break;

                case 'email':
                    // validate email
                break;

                // create a default for regular text fields
                default:
                    // default validation
                break;
            }
        break;

        case 'textarea':
            // your validation code here
        break;

        // you get the idea just keep creating cases as much as you need
    }// end switch
}// end foreach

return $valid_input;
}

各ケースの最後に値を$ valid_input配列に保存する

$valid_input[$option['id']] = $input[$option['id']]

たとえば、URLの検証に使用します。

if ( preg_match('your regex', $input[$option['id']]) ) {
    $valid_input[$option['id']] = $input[$option['id']];
}

options関数と同じように関数を作成することもできますが、セクションを作成してadd_settings_section()を使用するforeachループを作成します。新しい設定フィールドとセクションを追加します。それが役立つことを願っています:)

4
Pierre

最初に データ検証 のコーデックスの節を参照すると思います。実際にはサニタイズしていませんが、有効なEメールのチェック(is_email())を含む、URLや他の入力フィールドをサニタイズするためのたくさんの便利な組み込み関数があります。

次に、$inputで連想配列を取得しているので、特別な場合として扱う特定の入力を分離したい場合は、oem_theme_sanitize_profile_options()内にswitchステートメントを記述することを検討してください。

add_settings_error()の使用を検討してください (入力フィールド(emailフィールドなど)が無効な場合).

0
Tom Auger