Actualizar Opción Almacenada en Array Multidimensional
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');

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

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.

¿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.

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

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).

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).

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?

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 :)
