Aggiornare un'Opzione Memorizzata in un Array Multidimensionale
Ho dei dati nella tabella wp_options
attualmente memorizzati come array multidimensionale (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:"Opzione 1";i:1;s:8:"Opzione 2";i:2;s:8:"Opzione 3";i:3;s:8:"Opzione 4";i:4;s:8:"Opzione 5";}}
Quello che sto cercando di fare è aggiornare l'opzione profile_element_order
(all'interno di queste opzioni). Ecco come appare tutto finora:
function psort_save_order() {
global $mouldings_options;
$list = $mouldings_options['profile_element_order'];
$new_order = $_POST['list_items'];
$new_list = array();
// aggiorna ordine
foreach($new_order as $v) {
if(isset($list[$v])) {
$new_list[$v] = $list[$v];
}
}
// salva il nuovo ordine
update_option('profile_element_order', $new_list);
die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
I dati vengono correttamente inviati alla tabella del DB (dato che posso vedere alcuni dei miei tentativi falliti come nuove voci di opzioni, come mouldings_settings->profile_element_order
) -- Ho solo difficoltà a capire la sintassi di update_option()
per quella specifica opzione. Ho provato cose come (tenendo presente che `mouldings_settings` è il nome effettivo dell'opzione):
mouldings_settings['profile_element_order']
$mouldings_options['profile_element_order']
profile_element_order
ma senza successo al momento. Qualsiasi suggerimento sarebbe molto apprezzato! Grazie!
Aggiornamento Questo è quello che ho ora -- l'azione ajax salva correttamente, ma quando salvo le opzioni del plugin, duplica le opzioni nel database e mostra lo stesso errore di prima:
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:"Opzione 5";i:0;s:8:"Opzione 1";i:1;s:8:"Opzione 2";i:3;s:8:"Opzione 4";i:2;s:8:"Opzione 3";}i:0;s:8:"Opzione 5";i:1;s:8:"Opzione 1";i:2;s:8:"Opzione 2";i:3;s:8:"Opzione 4";i:4;s:8:"Opzione 3";}
Funzione:
function psort_save_order() {
global $mouldings_options;
$list = $mouldings_options['profile_element_order'];
$new_order = $_POST['list_items'];
$new_list = array();
// aggiorna ordine
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']);
// salva il nuovo ordine
update_option('mouldings_settings', $mouldings_options);
die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');

Per quanto riguarda WordPress - il tuo array multidimensionale è un' opzione.
Per aggiornare solo una parte dell'array multidimensionale è necessario recuperare l'intero array, modificarlo di conseguenza e poi aggiornare l'intero array.
Supponi che il tuo array multidimensionale sia il seguente:
my_options = array(
'option_a'=>'value_a',
'option_b'=>'value_b',
'inner_array'=>array(
'foo' => 'bar',
'hello' => 'world',
),
'option_c'=>'value_c'
)
E supponi che tu voglia aggiornare il valore dell'opzione 'hello' da 'world' a 'moon'
//Recupera l'intero array
$my_options = get_option('my_options');
//Modifica l'array delle opzioni in modo appropriato
$my_options['inner_array']['hello'] = 'moon';
//Aggiorna l'intero array
update_option('my_options', $my_options);

Ciao Steven - ho aggiornato la mia domanda originale con ciò che ho ora e mentre funziona con Ajax (salva la posizione quando aggiorno) una volta che salvo le impostazioni del plugin e ricarico, le opzioni nella tabella del database diventano un po' confuse (sembrano duplicate) il che genera un errore -- sto ancora sbagliando approccio? Grazie.

Stai dicendo che la riga stessa viene duplicata? O che le tue opzioni appaiono duplicate all'interno della riga? Prova a cancellare l'opzione e riprova - potrebbe essere che stai semplicemente mantenendo i duplicati dai tuoi tentativi precedenti.

Ciao Stephen - ho creato un pastebin con i miei passaggi per riprodurre il problema: http://pastebin.com/YHg1i7HR Grazie!

Prova a rimuovere il tuo array_merge
. È quello che causa la duplicazione. Stai unendo un array con un sotto-array (facendo sì che il sotto-array venga duplicato).

Ciao Stephen - Immagino di non essere sicuro di come scriverlo allora - Ora ho solo $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);
che non ha la duplicazione (e scrive correttamente nel DB, il che è positivo) -- ma al salvataggio della pagina (salvataggio delle impostazioni del plugin), l'impostazione del plugin viene ancora rimossa dal database (come nell'ultima parte di quel pastebin).

Questo è un problema completamente separato :). Sembra che la tua pagina delle impostazioni non stia inviando i dati di profile_element_order
. Vuoi fare una nuova domanda?

Ciao Stephen - ok, grazie per il tuo aiuto con questo. Ho creato una nuova domanda specifica per quella parte http://wordpress.stackexchange.com/questions/51889/plugin-settings-not-saving-on-ajax-re-ordered-table. Ancora una volta, grazie come sempre :)
