Çok Boyutlu Dizide Saklanan Güncelleme Seçeneği


15

wp_optionsŞu anda çok boyutlu bir dizi ( profile_element_order) depolanan tabloda veri var :

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

Yapmaya çalıştığım şey profile_element_orderseçeneği güncellemektir (bu seçenekler içinde). Şimdiye kadar her şey şu şekilde görünüyor:

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

Veriler doğru DB tablosuna gönderiyor (başarısız girişimlerimin bazılarını yeni seçenek girişleri olarak görebildiğim gibi mouldings_settings->profile_element_order) - update_option()Sadece belirli bir seçeneğin sözdizimini bulmakta zorlanıyorum . (Mouldings_settings gerçek seçenek adı olduğunu unutmayın) gibi şeyler denedim:

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

ama şu anda zar yok. Herhangi bir işaretçiler büyük mutluluk duyacağız! Teşekkürler!

Güncelleme Bu şimdi var - ajax eylem iyi kaydeder, ancak eklenti seçeneklerini kaydettiğinizde, veritabanındaki seçenekleri çoğaltır ve daha önce olduğu gibi aynı hatayı atar:

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

İşlev:

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

Yanıtlar:


36

WordPress söz konusu olduğunda - çok boyutlu diziniz bir seçenektir.

Çok boyutlu dizinin sadece bir bölümünü güncellemek için dizinin tamamını almak gerekir, buna göre değiştirin ve sonra dizinin tamamını güncelleyin.

Çok boyutlu dizinizin aşağıdaki gibi olduğunu varsayalım:

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

Ve 'merhaba' seçeneğinin değerini 'dünya'dan' aya 'güncellemek istediğinizi varsayalım

//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
Merhaba Steven - Orijinal sorumu şu anda sahip olduğum şeyle güncelledim ve eklenti ayarlarını kaydettikten ve yenilediğimde Ajax (çalışırken yenilediğimde) ile çalışırken, DB tablosundaki seçenekler biraz dağınık oluyor ( yinelenen görünüyor) ki bu bir hata atıyor - hala bu yanlış yaklaşıyor muyum? Teşekkürler.
Zach

Satırın kendisinin çoğaldığını mı söylüyorsunuz? Veya seçenekleriniz satırın içinde kopyalanmış olarak görünüyor mu? Seçeneği silmeyi ve tekrar denemeyi deneyin - yinelenenleri önceki girişimlerinizden saklıyor olabilirsiniz.
Stephen Harris

Merhaba Stephen - sorunu yeniden oluşturmak için benim adım bir macun yaptı: pastebin.com/YHg1i7HR Teşekkürler!
Zach

Cihazınızı kaldırmayı deneyin array_merge. Bu kopyalamaya neden oluyor. Bir diziyi alt diziyle birleştiriyorsunuz (alt dizinin çoğaltılmasına neden oluyor).
Stephen Harris

Merhaba Stephen - Sanırım ben sadece o zaman yazmak için emin değilim - Ben sadece $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);şimdi var çoğaltma var (ve iyi DB doğru yazar) - ama sayfa kaydetme (eklenti ayarları kaydetmek) , eklenti ayarı yine de veritabanından kaldırılır (bu macunun son kısmı gibi).
Zach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.