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.

Затем я еще раз вставляю первый код и обновляю его в третий раз, и он работает.

Подсказка: может быть, мне следует удалить значение полей перед их обновлением?

Author: Community, 2013-10-29

1 answers

  1. Извлеките текущие параметры и обязательно верните массив, если он пуст:

    $current_options = get_option( 'option_name', array() );
    
  2. Убедитесь, что нужные параметры находятся в массиве:

    $desired_options = array( /* whatever you need goes here */ );
    
  3. Объедините их, используя [wp_parse_args()]1:

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. Обновление

    update_option( 'option_name', $merged_options );
    

Конечно, хитрость для вас заключается в том, чтобы убедиться, что вы имеете дело с массивом с желаемыми параметрами. Может быть, сделать что-то вроде этого:

$desired_options = array( $_POST['import'] );

(P.S. пожалуйста, сделайте что-нибудь вроде дезинфекция. $_POST данные по своей сути ненадежны.)

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

У меня есть около 30 опций, входных данных, логических значений, текстовых областей. Все они хранятся в разделе XX_theme_settings, и один из них называется existing_field

Просто следуйте описанному выше процессу:

  1. Извлеките текущие параметры и обязательно верните массив, если он пуст:

    $current_options = get_option( 'XX_theme_settings', array() );
    
  2. Убедитесь, что желаемые параметры находятся в массив:

    $desired_options = array( 'existing_field' => 'your string here' );
    
  3. Объедините их, используя [wp_parse_args()]1:

    $merged_options = wp_parse_args( $current_options, $desired_options );
    
  4. Обновление

    update_option( 'XX_theme_settings', $merged_options );
    
 4
Author: Chip Bennett, 2013-10-30 01:56:52