Opción de actualización almacenada en matriz multidimensional

15

Tengo datos en la wp_optionstabla actualmente almacenados como una matriz 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:"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";}}

Lo que intento lograr es actualizar la profile_element_orderopción (dentro de esas opciones). Así es como se ve todo hasta ahora:

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

Los datos se publican correctamente en la tabla de base de datos (como puedo ver algunos de mis intentos fallidos como nuevas entradas de opciones, por ejemplo mouldings_settings->profile_element_order) - Me está costando mucho descubrir la update_option()sintaxis de esa opción específica. He intentado cosas como (teniendo en cuenta que `mouldings_settings es el nombre real de la opción):

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

pero no dados por el momento. Cualquier sugerencia sería muy apreciada! ¡Gracias!

Actualización Esto es lo que tengo ahora: la acción ajax ahorra bien, pero cuando guardo las opciones del complemento, duplica las opciones en la base de datos y arroja el mismo error que antes:

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

Función:

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

Respuestas:

36

En lo que respecta a WordPress, su matriz multidimensional es una opción.

Para actualizar solo una parte de la matriz multidimensional, es necesario recuperar la matriz completa, modificarla en consecuencia y luego actualizar toda la matriz.

Suponga que su matriz multidimensional es la siguiente:

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

Y suponga que desea actualizar el valor de la opción 'hola' de 'mundo' 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);
Stephen Harris
fuente
1
Hola Steven: he actualizado mi pregunta original con lo que tengo ahora y, aunque funciona con Ajax (guarda la posición cuando actualizo) una vez que guardo la configuración del complemento y la actualización, las opciones en la tabla DB se vuelven un poco desordenadas ( parece duplicado), lo que arroja un error: ¿sigo acercándome a eso mal? Gracias.
Zach
¿Estás diciendo que la fila misma se duplica? ¿O sus opciones aparecen duplicadas dentro de la fila? Intenta eliminar la opción y vuelve a intentarlo; puede ser que simplemente estés guardando los duplicados de tus intentos anteriores.
Stephen Harris
Hola Stephen: hice un pastebin de mis pasos para reproducir el problema: pastebin.com/YHg1i7HR ¡Gracias!
Zach
Intenta eliminar tu array_merge. Eso está causando la duplicación. Está fusionando una matriz con una matriz secundaria (haciendo que la matriz secundaria se duplique).
Stephen Harris
Hola Stephen: supongo que no estoy seguro de cómo escribir eso entonces, solo tengo $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);ahora que no tiene la duplicación (y escribe en la base de datos correctamente, lo cual es bueno), pero en la página de guardar (guardar la configuración del complemento) , la configuración del complemento aún se elimina de la base de datos (como lo hace la última parte de ese pastebin).
Zach