Actualizarea Opțiunii Stocate într-un Array Multidimensional

10 mai 2012, 21:55:41
Vizualizări: 22.9K
Voturi: 15

Am date în tabela wp_options stocate momentan ca un array multidimensional (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:"Opțiunea 1";i:1;s:8:"Opțiunea 2";i:2;s:8:"Opțiunea 3";i:3;s:8:"Opțiunea 4";i:4;s:8:"Opțiunea 5";}}

Ceea ce încerc să realizez este actualizarea opțiunii profile_element_order (din cadrul acestor opțiuni). Iată cum arată totul până acum:

function psort_save_order() {

    global $mouldings_options;

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

    // actualizează ordinea
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    // salvează noua ordine
    update_option('profile_element_order', $new_list);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');

Datele sunt postate corect în tabela DB (deoarece pot vedea unele dintre încercările mele eșuate ca intrări noi de opțiuni, cum ar fi mouldings_settings->profile_element_order) -- Am dificultăți în a determina sintaxa corectă pentru update_option() doar pentru acea opțiune specifică. Am încercat lucruri precum (ținând cont că `mouldings_settings` este numele real al opțiunii):

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

dar fără succes momentan. Orice sugestii ar fi foarte apreciate! Mulțumesc!

Actualizare Iată ce am acum -- acțiunea ajax salvează bine, dar când salvez opțiunile plugin-ului, se dublează opțiunile în baza de date și apare aceeași eroare ca înainte:

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:"Opțiunea 5";i:0;s:8:"Opțiunea 1";i:1;s:8:"Opțiunea 2";i:3;s:8:"Opțiunea 4";i:2;s:8:"Opțiunea 3";}i:0;s:8:"Opțiunea 5";i:1;s:8:"Opțiunea 1";i:2;s:8:"Opțiunea 2";i:3;s:8:"Opțiunea 4";i:4;s:8:"Opțiunea 3";}

Funcția:

function psort_save_order() {

    global $mouldings_options;

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

    // actualizează ordinea
    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']);

    // salvează noua ordine
    update_option('mouldings_settings', $mouldings_options);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
0
Toate răspunsurile la întrebare 1
7
42

În ceea ce privește WordPress - matricea ta multidimensională reprezintă o singură opțiune.

Pentru a actualiza doar o parte a matricei multidimensionale, este necesar să preiați întreaga matrice, să o modificați corespunzător și apoi să actualizați întreaga matrice.

Să presupunem că matricea ta multidimensională este următoarea:

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

Și să presupunem că doriți să actualizați valoarea opțiunii 'hello' de la 'world' la 'moon'

//Preia întreaga matrice
$my_options = get_option('my_options');

//Modifică matricea de opțiuni în mod corespunzător
$my_options['inner_array']['hello'] = 'moon';

//Actualizează întreaga matrice
update_option('my_options', $my_options);
11 mai 2012 04:36:16
Comentarii

Salut Steven - Am actualizat întrebarea mea inițială cu ce am acum și, deși funcționează cu Ajax (salvează poziția când reîmprospătez pagina), după ce salvez setările pluginului și reîmprospătez, opțiunile din tabela bazei de date devin puțin dezordonate (par duplicate), ceea ce generează o eroare -- abordez încă greșit acest aspect? Mulțumesc.

Zach Zach
11 mai 2012 15:55:23

Spui că rândul în sine se duplică? Sau că opțiunile tale apar duplicate în interiorul rândului? Încearcă să ștergi opțiunea și să încerci din nou - ar putea fi doar că păstrezi duplicatele din încercările tale anterioare.

Stephen Harris Stephen Harris
11 mai 2012 16:38:25

Salut Stephen - am făcut un pastebin cu pașii mei pentru a reproduce problema: http://pastebin.com/YHg1i7HR Mulțumesc!

Zach Zach
11 mai 2012 17:04:20

Încearcă să elimini array_merge. Acesta cauzează duplicarea. Tu îmbină un array cu un sub-array (cauzând duplicarea sub-array-ului).

Stephen Harris Stephen Harris
11 mai 2012 17:11:53

Salut Stephen - Cred că doar nu sunt sigur cum să scriu asta - acum am doar $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options); care nu are duplicare (și scrie corect în baza de date ceea ce e bine) -- dar la salvarea paginii (salvarea setărilor pluginului), setarea pluginului este încă eliminată din baza de date (ca în ultima parte din acel pastebin).

Zach Zach
11 mai 2012 17:21:44

Asta e o problemă complet separată :). Se pare că pagina ta de setări nu trimite datele profile_element_order. Pune o întrebare nouă?

Stephen Harris Stephen Harris
11 mai 2012 17:24:33

Salut Stephen - bine, mulțumesc pentru ajutor cu asta. Am creat o nouă întrebare special pentru acea parte http://wordpress.stackexchange.com/questions/51889/plugin-settings-not-saving-on-ajax-re-ordered-table. Din nou, mulțumesc ca întotdeauna :)

Zach Zach
11 mai 2012 17:41:56
Arată celelalte 2 comentarii