API настроек – дезинфекция URL-адресов, адресов электронной почты и текста

Я прошу совета по передовым методам написания этого кода. В настоящее время у меня есть простые параметры темы с текстовыми полями, выводя информацию в мой шаблон. В настоящее время я использую этот код для настроек api и дезинфекции обычного текста. Мои вопросы: дополнительное поле настроек – это поле веб-сайта, а также поле электронной почты. Я не уверен, что мне нужно создать еще одну тему, раздел и поле для всей темы, чтобы я мог самостоятельно дезинформировать зарегистрированные параметры отдельно (и правильно для каждого типа) или все это можно объединить в рамках одной и той же 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 

Вместо использования 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; 

}

используя эту функцию, мы можем зарегистрировать каждое поле с циклом foreach, который будет использовать add_settings_field ()

теперь с помощью этой функции вы можете создать одну функцию обратного вызова для register_setting () и использовать переключатель для проверки ввода, например:

 // 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 array

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

например, для проверки использования URL:

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

вы также можете создать функцию, аналогичную функции параметров, но для разделов и создать цикл foreach, который будет использовать add_settings_section (), и вы поймете, что это будет намного проще для вас, вы сэкономите много времени позже, когда захотите для добавления новых полей настроек и раздела. надеюсь, это поможет 🙂

Наверное, я сначала отсылаю вас к разделу Codex по проверке данных . Там вы найдете массу полезных встроенных функций для дезинфекции URL-адресов и других полей ввода, включая проверку действительного адреса электронной почты (is_email ()), хотя на самом деле он не дезинфицирует его.

Затем, поскольку вы получаете ассоциативный массив в $input , подумайте о написании инструкции switch в oem_theme_sanitize_profile_options() если вы хотите изолировать определенные входы, которые будут рассматриваться как особые случаи.

Рассмотрите возможность использования add_settings_error (), если поле ввода (например, поле электронной почты) недействительно.