Опція оновлення, що зберігається в багатовимірному масиві


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');

Відповіді:


36

Що стосується WordPress - ваш багатовимірний масив є одним із варіантів.

Для оновлення лише частини багатовимірного масиву необхідно отримати весь масив, змінити його відповідно і потім оновити весь масив.

Припустимо, ваш багатовимірний масив такий:

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

І припустимо, ви хочете оновити значення параметра "привіт" зі "світу" на "місяць"

//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);зараз немає дублювання (і записує в БД правильно, що добре) - але на сторінці збереження (збереження налаштувань плагіна) , налаштування плагіну все ще видаляється з бази даних (як це робить остання частина цієї пастини).
Зак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.