Опция обновления хранится в многомерном массиве

15

У меня есть данные в wp_optionsтаблице в настоящее время хранятся в виде многомерного массива ( profile_element_order):

a:12:{s:17:"img_base64_enable";s:1:"1";s:25:"moulding_combination_page";s:0:"";s:24:"moulding_collection_page";s:0:"";s:25:"idea_gallery_thumb_height";s:3:"200";s:24:"idea_gallery_thumb_width";s:3:"200";s:23:"collection_thumb_height";s:3:"200";s:22:"collection_thumb_width";s:3:"200";s:20:"profile_item_columns";s:1:"4";s:17:"idea_item_columns";s:1:"2";s:24:"collections_item_columns";s:1:"2";s:25:"combinations_item_columns";s:1:"4";s:21:"profile_element_order";a:5:{i:0;s:8:"Option 1";i:1;s:8:"Option 2";i:2;s:8:"Option 3";i:3;s:8:"Option 4";i:4;s:8:"Option 5";}}

То, что я пытаюсь сделать, это обновить profile_element_orderопцию (в этих опциях). Вот как все выглядит так далеко:

function psort_save_order() {

    global $mouldings_options;

    $list = $mouldings_options['profile_element_order'];
    $new_order = $_POST['list_items'];
    $new_list = array();

    // update order
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    // save the new order
    update_option('profile_element_order', $new_list);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');

Данные правильно отправляются в таблицу БД (как я вижу некоторые из моих неудачных попыток в виде записей новых опций mouldings_settings->profile_element_order) - мне просто трудно разобраться в update_option()синтаксисе только для этой конкретной опции. Я пробовал что-то вроде (имея в виду, `mouldings_settings это фактическое имя опции):

mouldings_settings['profile_element_order']
$mouldings_options['profile_element_order']
profile_element_order

но на данный момент нет игры в кости. Любые указатели будут с благодарностью! Благодарность!

Обновление Это то, что у меня сейчас - действие ajax сохраняет нормально, но когда я сохраняю параметры плагина, он дублирует параметры в базе данных и выдает ту же ошибку, что и раньше:

a:17:{s:17:"img_base64_enable";s:1:"1";s:25:"moulding_combination_page";s:0:"";s:24:"moulding_collection_page";s:0:"";s:25:"idea_gallery_thumb_height";s:3:"200";s:24:"idea_gallery_thumb_width";s:3:"200";s:23:"collection_thumb_height";s:3:"200";s:22:"collection_thumb_width";s:3:"200";s:20:"profile_item_columns";s:1:"4";s:17:"idea_item_columns";s:1:"2";s:24:"collections_item_columns";s:1:"2";s:25:"combinations_item_columns";s:1:"4";s:21:"profile_element_order";a:5:{i:4;s:8:"Option 5";i:0;s:8:"Option 1";i:1;s:8:"Option 2";i:3;s:8:"Option 4";i:2;s:8:"Option 3";}i:0;s:8:"Option 5";i:1;s:8:"Option 1";i:2;s:8:"Option 2";i:3;s:8:"Option 4";i:4;s:8:"Option 3";}

Функция:

function psort_save_order() {

    global $mouldings_options;

    $list = $mouldings_options['profile_element_order'];
    $new_order = $_POST['list_items'];
    $new_list = array();

    // update order
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    $mouldings_options['profile_element_order'] = $new_list;
    $mouldings_options = array_merge($mouldings_options,$mouldings_options['profile_element_order']);

    // save the new order
    update_option('mouldings_settings', $mouldings_options);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
Zach
источник

Ответы:

36

Что касается WordPress - ваш многомерный массив является одним из вариантов.

Чтобы обновить только часть многомерного массива, необходимо извлечь весь массив, изменить его соответствующим образом и затем обновить весь массив.

Предположим, ваш многомерный массив выглядит следующим образом:

my_options = array(
  'option_a'=>'value_a',
  'option_b'=>'value_b',
  'inner_array'=>array(
       'foo' => 'bar',
       'hello' => 'world',
   ),
  'option_c'=>'value_c'
)

И предположим, что вы хотите обновить значение опции 'hello' с 'world' на 'moon'

//Get entire array
$my_options = get_option('my_options');

//Alter the options array appropriately
$my_options['inner_array']['hello'] = 'moon';

//Update entire array
update_option('my_options', $my_options);
Стивен Харрис
источник
1
Привет, Стивен. Я обновил свой первоначальный вопрос тем, что у меня есть сейчас, и, хотя он работает с Ajax (сохраняет позицию при обновлении), после сохранения настроек плагина и обновления параметры в таблице БД становятся немного беспорядочными ( выглядит дублированным), который выбрасывает ошибку - я все еще подхожу к этому неправильно? Благодарю.
Зак
Вы говорите, что сам ряд дублируется? Или ваши варианты дублируются внутри строки? Попробуйте удалить эту опцию и повторить попытку - возможно, вы просто сохраняете дубликаты из ваших предыдущих попыток.
Стивен Харрис
Привет, Стивен, я сделал из моих шагов наклейку, чтобы воспроизвести проблему: pastebin.com/YHg1i7HR Спасибо!
Зак
Попробуйте удалить свой array_merge. Это вызывает дублирование. Вы объединяете массив с вложенным массивом (что приводит к дублированию вложенного массива).
Стивен Харрис
Привет, Стивен - я думаю, я просто не уверен, как написать это тогда - у меня просто $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);сейчас, который не имеет дублирования (и пишет в БД правильно, что хорошо) - но при сохранении страницы (сохранение настроек плагина) настройка плагина по-прежнему удаляется из базы данных (как и последняя часть этого кода).
Зак