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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.