Opzione di aggiornamento memorizzata nell'array multidimensionale


15

Ho dati nella wp_optionstabella attualmente memorizzati come un 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:"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";}}

Quello che sto cercando di realizzare è aggiornare l' profile_element_orderopzione (all'interno di quelle opzioni). Ecco come tutto sembra così lontano:

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

I dati vengono correttamente inseriti nella tabella DB (come posso vedere alcuni dei miei tentativi falliti come nuove voci di opzioni, come mouldings_settings->profile_element_order) - Sto solo facendo fatica a capire la update_option()sintassi solo per quell'opzione specifica. Ho provato cose come (tenendo presente che `mouldings_settings è il nome dell'opzione attuale):

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

ma nessun dado al momento. Qualsiasi suggerimento sarebbe molto apprezzato! Grazie!

Aggiorna Questo è quello che ho ora: l'azione ajax salva bene, ma quando salvo le opzioni del plugin, duplica le opzioni nel database e genera 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:"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";}

Funzione:

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

Risposte:


36

Per quanto WordPress è interessato - la matrice multidimensionale è uno opzione.

Per aggiornare solo una parte dell'array multidimensionale è necessario recuperare l'intero array, modificarlo di conseguenza e quindi aggiornare l'intero array.

Supponiamo 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 supponiamo che tu voglia aggiornare il valore dell'opzione "ciao" da "mondo" a "luna"

//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
Ciao Steven - Ho aggiornato la mia domanda originale con quello che ho adesso e mentre funziona con Ajax (salva la posizione quando aggiorno) una volta salvate le impostazioni del plugin e aggiorna, le opzioni nella tabella DB diventano un po 'confuse ( sembra duplicato) che sta gettando un errore - mi sto ancora avvicinando a quello sbagliato? Grazie.
Zach,

Stai dicendo che la riga stessa viene duplicata? O le tue opzioni appaiono duplicate all'interno della riga? Prova a eliminare l'opzione e riprova: è possibile che tu stia semplicemente mantenendo i duplicati dai tuoi precedenti tentativi.
Stephen Harris,

Ciao Stephen, ho fatto un pastebin dei miei passi per riprodurre il problema: pastebin.com/YHg1i7HR Grazie!
Zach,

Prova a rimuovere il tuo array_merge. Questo sta causando la duplicazione. Stai unendo un array con un sub-array (causando la duplicazione del sub-array).
Stephen Harris,

Ciao Stephen - Immagino di non essere sicuro di come scriverlo allora - Ho solo $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);ora che non ha la duplicazione (e scrive correttamente sul DB che è buono) - Ma al salvataggio della pagina (salvataggio delle impostazioni del plugin) , l'impostazione del plug-in viene rimossa dal database (come fa l'ultima parte di quel pastebin).
Zach,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.