Opsi Pembaruan Disimpan dalam Multi-Dimensi Array

15

Saya memiliki data di wp_optionstabel yang saat ini disimpan sebagai array multi-dimensi ( 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";}}

Yang ingin saya capai adalah memperbarui profile_element_orderopsi (dalam opsi itu). Begini cara semuanya terlihat sejauh ini:

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

Data memposting dengan benar ke tabel DB (seperti saya dapat melihat beberapa upaya saya yang gagal sebagai entri opsi baru, seperti mouldings_settings->profile_element_order) - Saya hanya mengalami kesulitan mencari tahu update_option()sintaks untuk hanya opsi spesifik itu. Saya sudah mencoba hal-hal seperti (mengingat `mouldings_settings adalah nama opsi yang sebenarnya):

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

tetapi tidak ada dadu saat ini. Pointer apa pun akan sangat dihargai! Terima kasih!

Perbarui Ini yang saya miliki sekarang - tindakan ajax menghemat dengan baik, tetapi ketika saya menyimpan opsi plugin, itu menduplikasi opsi dalam database dan memunculkan kesalahan yang sama seperti sebelumnya:

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";}

Fungsi:

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
sumber

Jawaban:

36

Sejauh menyangkut WordPress - array multi-dimensi Anda adalah satu opsi.

Untuk memperbarui hanya sebagian dari array multi-dimensi yang diperlukan untuk mengambil seluruh array, ubah sesuai dan kemudian perbarui seluruh array.

Misalkan array multi-dimensi Anda adalah sebagai berikut:

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

Dan misalkan Anda ingin memperbarui nilai opsi 'halo' dari 'dunia' ke 'bulan'

//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);
Stephen Harris
sumber
1
Halo Steven - Saya telah memperbarui pertanyaan awal saya dengan apa yang saya miliki sekarang dan sementara itu berfungsi dengan Ajax (menyimpan posisi ketika saya me-refresh) setelah saya menyimpan pengaturan plugin dan me-refresh, opsi dalam tabel DB menjadi sedikit berantakan ( terlihat terduplikasi) yang merupakan kesalahan melempar - apakah saya masih mendekati yang salah? Terima kasih.
Zach
Apakah Anda mengatakan bahwa baris itu sendiri diduplikasi? Atau opsi Anda tampak digandakan di dalam baris? Coba hapus opsi dan coba lagi - bisa jadi Anda hanya menyimpan duplikat dari upaya sebelumnya.
Stephen Harris
Hai Stephen - buat pastebin dari langkah saya untuk mereproduksi masalah: pastebin.com/YHg1i7HR Terima kasih!
Zach
Coba hapus array_merge. Itu yang menyebabkan duplikasi. Anda menggabungkan array dengan sub-array (menyebabkan sub-array untuk digandakan).
Stephen Harris
Halo Stephen - Saya kira saya tidak yakin bagaimana cara menulisnya - Saya hanya punya $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);sekarang yang tidak memiliki duplikasi (dan menulis ke DB dengan benar yang baik) - tetapi pada halaman-save (pengaturan plugin save) , pengaturan plugin dihapus dari database masih (seperti bagian terakhir dari pastebin itu).
Zach