Обратный вызов проверки API API

Наконец-то мне удалось создать рабочий обратный вызов проверки для API настроек с большой помощью Chip Bennet, есть только один глюк, который я не знаю, как исправить.

Вот цикл foreach из моей функции проверки:

foreach ($settings as $setting) { $id = $setting['id']; $type = $setting['type']; $option = get_option('XX_theme_settings'); if($type == 'textarea') { $valid_input[$id] = wp_filter_nohtml_kses($input[$id]); } } 

Я перебираю множество параметров и код выше не работает, как ожидалось, если у меня есть 10 текстовых полей в моих настройках, и я редактирую только одно текстовое поле $ input [$ id] для остальных 9 будет NULL, и они он будет немедленно удален.

Я пытался решить это, выполняя дополнительные проверки ввода, такие как:

 //if there is no input for given field leave the old value if($type == 'textarea' && empty($input[$id])) { $valid_input[$id] = wp_filter_nohtml_kses($option[$id]); } //if there's input sent change setting's value else if($type == "textarea" && !empty($input[$id])) { $valid_input[$id] = wp_filter_nohtml_kses($input[$id]); } 

И это в основном работает, но делает невозможным стирание опций. Например, если у меня есть опция «welcome_text» со значением «Приветственные люди», я не могу стереть все символы и оставить это поле пустым, потому что запускается первая инструкция if. Таким образом, значение «welcome_text» может быть «Welcome fol» или «W», но никогда не «».

Я вижу, что мой первый подход работает очень хорошо, я не знаю, почему.

Благодаря 🙂

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

Массив, полученный для проверки, – это данные, полученные из (вашей части) формы. Если данные «пусты», это происходит потому, что данные не были отправлены. Обычно это связано с тем, что пользователь намеренно не отправил никаких данных (то есть опустошил текстовую область).

Если вы пытаетесь сохранить параметры с разных страниц в одном массиве, вам нужно будет определить, были ли пустые данные на самом деле преднамеренными или нет, потому что они не были отправлены, потому что они не были отправлены на страницу.

Обработка только ожидаемых данных

Действительно, что вам нужно определить, какие данные вы ожидаете получить? В вашем случае это будет зависеть от того, на какой странице вы отправляете данные:

 //The 'ids' of data that is expected on the respective page $page1_options = array('textarea_on_page_1','checkbox_1','another_textarea_1'); $page2_options = array('someinput_2','another_textarea'); //An array of arrays of option names the plugin accepts: $expected =array('page1'=>$page1_options,'page2'=>$page2_options); 

Затем, отправляя данные со страницы 1, данные, которые мы ожидаем получить, являются $expected['page1'] .

Поэтому мы только проверяем эти параметры и фильтруем все остальное, чтобы в итоге $valid_input которое содержит все и только ключи, перечисленные в $page1_options . Затем мы берем текущие параметры, объединим их с этим новым допустимым вводом, чтобы получить новый массив настроек:

 $option_array = get_option('XX_theme_settings'); $option_array = array_merge($option_array,$valid_input); //Return this $option_array to be saved to database 

Определение страницы

Чтобы определить, какая страница отправляется, на каждой странице добавьте еще одну «опцию», которая на самом деле является скрытым вводом со значением, установленным для идентификатора страницы, о котором я упоминал выше (например, 'page1' ). Это будет отправлено с параметрами.

Лучший способ

Более простой способ – иметь настройки для каждой страницы, сохраненные как отдельная строка в базе данных (так что у вас есть параметры X (массивы) для X-страниц).