API настроек - как обновить несколько параметров вручную?
Я сохраняю все свои параметры с помощью API настроек:
function registerSettings() {
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', 'text_input', 'page1', 'theme_options', 'XX_Option1' );
add_settings_field( 'XX_Option2', 'Option 2', 'text_input', 'page1', 'theme_options', 'XX_Option2' );
};
add_action('admin_init', 'registerSettings');
Допустим, я хочу обновить все параметры вручную (не с помощью форм, а с помощью PHP), как мне это сделать?
Вот как выглядит это обновление для одного параметра:
$my_options= get_option('XX_theme_settings');//retrieve all options
$my_options['XX_Option2'] = 'my new value'; //amend value in array(s)
update_option('XX_theme_settings', $my_options); //update option array
Я совершенно не представляю, как заставить его работать для нескольких (изначально у меня было более 50) полей настроек.
Я пытался сделать так:
$current_options = get_option('XX_theme_settings');
$imported_options = array_merge($current_options , array_intersect_key($_POST["import"], $current_options ));
// $imported_options = $_POST["import"]; - simplified
update_option('XX_theme_settings', $imported_options);
И это не работает, конечно, "импорт" - это не строка но массив.
Вот связанный (мой собственный) вопрос: API настроек - как обновить параметры вручную?
Я думаю, мне все еще нужно создать цикл PHP для каждого и просмотреть все настройки, затем перечислить их, а затем добавить каждый из них через update_option? Как это сделать? Будет ли это медленно, потому что это звучит так?
ОБНОВЛЕНИЕ
Этот код, похоже, не обновляет настройки:
$current_options = get_option( 'XX_theme_settings', array() );
$desired_options = array("existing_field" => "new value");
// $desired_options = array("XX_theme_settings" => array("existing_field" => "new value")); tried this one, but also no luck
$merged_options = wp_parse_args( $current_options, $desired_options );
update_option( 'XX_theme_settings', $merged_options );
ОБНОВЛЕНИЕ II
Это даже незнакомец.
Я поместил приведенный выше код в page.php (только для целей тестирования):
$current_options = get_option( 'XX_theme_settings', array() );
$desired_options = array("existing_field" => "new value");
$merged_options = wp_parse_args( $current_options, $desired_options );
update_option( 'XX_theme_settings', $merged_options );
Я обновляю одну из страниц. Ничего не происходит. Затем я меняю код на этот:
$current_options = get_option( 'XX_theme_settings', array() );
$desired_options = array("existing_field" => "new value");
$merged_options[] = wp_parse_args( $current_options, $desired_options ); //here's the change
update_option( 'XX_theme_settings', $merged_options );
Еще одно обновление, "существующее поле" теперь является emtpy.
Затем я еще раз вставляю первый код и обновляю его в третий раз, и он работает.
Подсказка: может быть, мне следует удалить значение полей перед их обновлением?
1 answers
-
Извлеките текущие параметры и обязательно верните массив, если он пуст:
$current_options = get_option( 'option_name', array() );
-
Убедитесь, что нужные параметры находятся в массиве:
$desired_options = array( /* whatever you need goes here */ );
-
Объедините их, используя
[wp_parse_args()
]1:$merged_options = wp_parse_args( $current_options, $desired_options );
-
Обновление
update_option( 'option_name', $merged_options );
Конечно, хитрость для вас заключается в том, чтобы убедиться, что вы имеете дело с массивом с желаемыми параметрами. Может быть, сделать что-то вроде этого:
$desired_options = array( $_POST['import'] );
(P.S. пожалуйста, сделайте что-нибудь вроде дезинфекция. $_POST
данные по своей сути ненадежны.)
Редактировать
У меня есть около 30 опций, входных данных, логических значений, текстовых областей. Все они хранятся в разделе XX_theme_settings, и один из них называется
existing_field
Просто следуйте описанному выше процессу:
-
Извлеките текущие параметры и обязательно верните массив, если он пуст:
$current_options = get_option( 'XX_theme_settings', array() );
-
Убедитесь, что желаемые параметры находятся в массив:
$desired_options = array( 'existing_field' => 'your string here' );
-
Объедините их, используя
[wp_parse_args()
]1:$merged_options = wp_parse_args( $current_options, $desired_options );
-
Обновление
update_option( 'XX_theme_settings', $merged_options );