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

10 мая 2012 г., 21:55:41
Просмотры: 22.9K
Голосов: 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:"Опция 1";i:1;s:8:"Опция 2";i:2;s:8:"Опция 3";i:3;s:8:"Опция 4";i:4;s:8:"Опция 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();

    // обновляем порядок
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    // сохраняем новый порядок
    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:"Опция 5";i:0;s:8:"Опция 1";i:1;s:8:"Опция 2";i:3;s:8:"Опция 4";i:2;s:8:"Опция 3";}i:0;s:8:"Опция 5";i:1;s:8:"Опция 1";i:2;s:8:"Опция 2";i:3;s:8:"Опция 4";i:4;s:8:"Опция 3";}

Функция:

function psort_save_order() {

    global $mouldings_options;

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

    // обновляем порядок
    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']);

    // сохраняем новый порядок
    update_option('mouldings_settings', $mouldings_options);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
0
Все ответы на вопрос 1
7
42

Что касается 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'

// Получаем весь массив
$my_options = get_option('my_options');

// Изменяем нужную часть массива
$my_options['inner_array']['hello'] = 'moon';

// Обновляем весь массив
update_option('my_options', $my_options);
11 мая 2012 г. 04:36:16
Комментарии

Привет, Стивен - я обновил свой исходный вопрос тем, что у меня сейчас есть, и хотя это работает с Ajax (сохраняет позицию при обновлении), как только я сохраняю настройки плагина и обновляю, опции в таблице БД становятся немного запутанными (выглядят дублированными), что вызывает ошибку -- я всё ещё неправильно подхожу к этому? Спасибо.

Zach Zach
11 мая 2012 г. 15:55:23

Ты имеешь в виду, что сама строка дублируется? Или твои опции выглядят дублированными внутри строки? Попробуй удалить опцию и повторить попытку - возможно, ты просто сохраняешь дубликаты от предыдущих попыток.

Stephen Harris Stephen Harris
11 мая 2012 г. 16:38:25

Привет, Стивен - сделал pastebin с моими шагами для воспроизведения проблемы: http://pastebin.com/YHg1i7HR Спасибо!

Zach Zach
11 мая 2012 г. 17:04:20

Попробуйте удалить ваш array_merge. Это вызывает дублирование. Вы объединяете массив с подмассивом (что приводит к дублированию подмассива).

Stephen Harris Stephen Harris
11 мая 2012 г. 17:11:53

Привет, Стивен - похоже, я просто не уверен, как это правильно написать - сейчас у меня просто $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);, что не вызывает дублирования (и правильно записывает в БД, что хорошо) -- но при сохранении страницы (сохранении настроек плагина), настройка плагина всё равно удаляется из базы данных (как показано в последней части того pastebin).

Zach Zach
11 мая 2012 г. 17:21:44

Это совершенно другая проблема :). Похоже, ваша страница настроек не отправляет данные profile_element_order. Может, зададите новый вопрос?

Stephen Harris Stephen Harris
11 мая 2012 г. 17:24:33

Привет, Стивен - хорошо, спасибо за помощь с этим. Я создал новый вопрос специально по этой части http://wordpress.stackexchange.com/questions/51889/plugin-settings-not-saving-on-ajax-re-ordered-table. Ещё раз спасибо, как всегда :)

Zach Zach
11 мая 2012 г. 17:41:56
Показать остальные 2 комментариев