Actualizar Opción Almacenada en Array Multidimensional

10 may 2012, 21:55:41
Vistas: 22.9K
Votos: 15

Tengo datos en la tabla wp_options actualmente almacenados como 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:"Opción 1";i:1;s:8:"Opción 2";i:2;s:8:"Opción 3";i:3;s:8:"Opción 4";i:4;s:8:"Opción 5";}}

Lo que estoy tratando de lograr es actualizar la opción profile_element_order (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();

    // actualizar orden
    foreach($new_order as $v) {
        if(isset($list[$v])) {
            $new_list[$v] = $list[$v];
        }
    }

    // guardar el nuevo orden
    update_option('profile_element_order', $new_list);

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

Los datos se están publicando correctamente en la tabla de la BD (ya que puedo ver algunos de mis intentos fallidos como nuevas entradas de opciones, como mouldings_settings->profile_element_order) -- Solo estoy teniendo dificultades para determinar la sintaxis de update_option() para esa opción específica. He probado 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 sin éxito por el momento. ¡Cualquier sugerencia sería muy apreciada! ¡Gracias!

Actualización Esto es lo que tengo ahora -- la acción ajax guarda bien, pero cuando guardo las opciones del plugin, duplica las opciones en la base de datos y lanza 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:"Opción 5";i:0;s:8:"Opción 1";i:1;s:8:"Opción 2";i:3;s:8:"Opción 4";i:2;s:8:"Opción 3";}i:0;s:8:"Opción 5";i:1;s:8:"Opción 1";i:2;s:8:"Opción 2";i:3;s:8:"Opción 4";i:4;s:8:"Opción 3";}

Función:

function psort_save_order() {

    global $mouldings_options;

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

    // actualizar orden
    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']);

    // guardar el nuevo orden
    update_option('mouldings_settings', $mouldings_options);

    die();
}
add_action('wp_ajax_psort_update_order', 'psort_save_order');
0
Todas las respuestas a la pregunta 1
7
42

En lo que respecta a WordPress, tu array multidimensional es una opción.

Para actualizar solo una parte del array multidimensional, es necesario recuperar el array completo, modificarlo adecuadamente y luego actualizar todo el array.

Supongamos que tu array multidimensional es el siguiente:

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

Y supongamos que deseas actualizar el valor de la opción 'hello' de 'world' a 'moon'

//Obtener el array completo
$my_options = get_option('my_options');

//Modificar el array de opciones adecuadamente
$my_options['inner_array']['hello'] = 'moon';

//Actualizar todo el array
update_option('my_options', $my_options);
11 may 2012 04:36:16
Comentarios

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 plugin y actualizo, las opciones en la tabla de la base de datos se ven un poco desordenadas (parecen duplicadas) lo que está generando un error -- ¿Sigo abordando esto de manera incorrecta? Gracias.

Zach Zach
11 may 2012 15:55:23

¿Estás diciendo que la fila misma se duplica? ¿O que tus opciones aparecen duplicadas dentro de la fila? Intenta eliminar la opción y volver a intentarlo - podría ser que simplemente estés conservando las duplicaciones de tus intentos anteriores.

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

Hola Stephen - he creado un pastebin con mis pasos para reproducir el problema: http://pastebin.com/YHg1i7HR ¡Gracias!

Zach Zach
11 may 2012 17:04:20

Intenta eliminar tu array_merge. Eso está causando la duplicación. Estás combinando un array con un sub-array (lo que causa que el sub-array se duplique).

Stephen Harris Stephen Harris
11 may 2012 17:11:53

Hola Stephen - Supongo que no estoy seguro de cómo escribir eso entonces - Ahora solo tengo $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options); lo cual no tiene la duplicación (y escribe correctamente en la base de datos, lo cual es bueno) -- pero al guardar la página (guardar configuraciones del plugin), la configuración del plugin todavía se elimina de la base de datos (como muestra la última parte de ese pastebin).

Zach Zach
11 may 2012 17:21:44

Ese es un problema completamente aparte :). Parece que tu página de configuraciones no está enviando los datos de profile_element_order. ¿Quieres hacer una nueva pregunta?

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

Hola Stephen - está bien, gracias por tu ayuda con eso. He creado una nueva pregunta específicamente para esa parte http://wordpress.stackexchange.com/questions/51889/plugin-settings-not-saving-on-ajax-re-ordered-table. Nuevamente, gracias como siempre :)

Zach Zach
11 may 2012 17:41:56
Mostrar los 2 comentarios restantes