Intereting Posts
Пользовательская таксономия, get_the_terms, перечисление в порядке родительского> дочернего Виджет на правой стороне страницы перекрывается с левой стороны Почему wp_options.ibd будет более 6 ГБ Как включить метаобъект во время поиска? как запросить meta_value имеет массив Форматирование содержимого get_post не позволяет правильному функционированию JS-контента Получить текущий URL (постоянная ссылка) без / page / {pagenum} / почему так много сообщений whoes post_type – это ревизия? будут ли эти записи слишком много места для базы данных? Запрос базы данных не работает Является ли устаревшее расширение PHP mysql требованием для WordPress 4.6? Как создать несколько версий одного сообщения Обновить комментарий meta для всех комментариев конкретной публикации Проблема с URL: www.sitename.com/blog и www.sitename.com/learn, используя ту же установку WP Как получить идентификатор области виджета (идентификатор боковой панели) в widget_update_callback ()? Показывать только сообщения с датой сегодняшнего дня или в будущем (т. Е. Не показывать прошлые сообщения)?

API настроек – самый простой способ проверки флажков?

Я использую API настроек, и я не могу получить флажки, чтобы работать, если они настроены на «ложь», они даже не являются $ _POST, и в этом все дело.

Стивен Харрис и Чип Беннетт объяснили это , но я считаю, что их путь не достаточно простой (особенно для меня, а не для PHP-парня вообще). Мне действительно нужно несколько пользовательских функций PHP и пользовательских кнопок отправки для каждой формы, чтобы заставить эту простую работу работать?

Мои настройки выглядят так:

register_setting('XX_theme_settings', 'XX_theme_settings', 'setting_validate' ); add_settings_section('theme_options', 'Theme Options', 'theme_options_generate', 'page1' ); add_settings_field( 'XX_Option1', 'Option 1', 'checkbox', 'page1', 'theme_options', 'XX_Option1', $args = array('id' => 'checkbox1', 'type' => 'checkbox') ); add_settings_field( 'XX_Option2', 'Option 2', 'checkbox', 'page1', 'theme_options', 'XX_Option2', $args = array('id' => 'checkbox2', 'type' => 'checkbox') ); 

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

 function checkbox($args) { $options = get_option('XX_theme_settings'); echo '<input type="checkbox" name="'. $args['id'] .'" value="true"'; if($options[$args['id']]==true) { echo 'checked="checked'; }; echo '/>'; echo $args['type']; } 

Теперь все, что мне нужно, это хороший ответный ответ:

 function setting_validate($input) { // Firstly it should find all fields of type == "checkbox" // (I'm not sure why should I check which field was just being sent, // is updating all the checkboxes from different sections a big no-no? // it is much easier indeed. // Now set the ones missing to false/0 and the rest to true/1. // Then merge everything like below: $options = get_option('XX_theme_settings'); $merged = array_merge($options, $input); return $merged; } 

Поэтому возникает вопрос: как перечислить все флажки «Настройки Api», а затем установить правильные значения true?

Думаю, это будет выглядеть примерно так:

 $options = array( array( 'id' => 'checkbox1', 'type' => 'checkbox', 'page' => 'page1', ), array( 'id' => 'checkbox2', 'type' => 'checkbox', 'page' => 'page1', ), ); function setting_validate($input) { foreach($options as $option) { if($option['type'] == "checkbox") { //set it to 1 if sent } } $options = get_option('XX_theme_settings'); $merged = array_merge($options, $input); return $merged; } 

Благодаря 🙂

Вот как это делает Чип Беннетт , но даже со всеми этими замечательными комментариями я не могу понять, как это работает.

Если заданная настройка является $setting и является типом флажка, вы проверяете ее следующим образом:

 <?php $valid_input[$setting] = ( isset( $input[$setting] ) && true == $input[$setting] ? true : false ); ?> 

В этом случае $input – это данные формы, переданные в обратный вызов проверки , где $input – массив массивов. Метод проверки известен как « белый список» , где вызывается текущий массив настроек (в данном случае, как $valid_input ), и каждый параметр в массиве настроек обновляется только в том случае, если значение в $input[$setting] проходит проверку.

Если флажки установлены, флажок не установлен , то сам параметр не заполняется в массиве $input . Итак, первым шагом для его проверки является определение, было ли задано значение $input . Второй шаг – убедиться, что значение, которое установлено, является true (или 'true' , или 'on' , или тем, на что вы устанавливаете значение флажка в форме настроек). Если оба этих условия выполнены, верните true ; в противном случае верните false .

Смотрите: это очень просто. 🙂

редактировать

В соответствии с этим:

 function setting_validate($input) { foreach($options as $option) { if($option['type'] == "checkbox") { //set it to 1 if sent } } $options = get_option('XX_theme_settings'); $merged = array_merge($options, $input); return $merged; } 

… это не совсем так, как вы хотите это сделать. Вы хотите ограничить возвращаемое значение допустимыми параметрами; то есть вы хотите явно указать параметры, которые, как известно, вы определили. Если каким-то образом кто-то может заполнить $input дополнительными данными – то есть вредоносным кодом – ваш метод просто передаст эти дополнительные данные прямо в базу данных .

Не делайте array_merge() . Обновляйте каждый параметр $valid_options[$setting] отдельно / отдельно и только возвращайте $valid_options .

Вот этот процесс:

  1. Определите текущие действительные данные:

     $valid_input = get_option( 'XX_theme_settings' ); 
  2. Обновите текущие действительные данные с помощью $input только если $input передает вашу проверку / дезинфекцию.
  3. Затем верните обновленные, в настоящее время действительные данные.

Если поля генерируются динамически, то вы также должны динамически их выполнять в своем обратном вызове проверки. У вас это правильно, с foreach( $options as $option ) .

Объединение всего этого может выглядеть так:

 <?php function setting_validate( $input ) { // Get current setting values $valid_options = get_option( 'XX_theme_options' ); // Get option parameters array // Note: XX_theme_get_option_parameters() function // should be defined to return the array you've // defined for $options $options = XX_theme_get_option_parameters(); // Now step through the option parameters, // and validate each $input[$option] foreach( $options as $option ) { // If $option['type] is a checkbox if( 'checkbox' == $option['type'] ) { // verify that $input[$option] is set // and is set with a valid value; // if so, set $valid_input[$option] to 1 $valid_input[$option] = ( isset( $input[$option] && true == $input[$option] ? 1 : 0 ); } } // Return the updated $valid_input array return $valid_input; } ?>