Opção de atualização armazenada na matriz multidimensional

15

Eu tenho dados na wp_optionstabela atualmente armazenados como uma 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";}}

O que estou tentando realizar é atualizar a profile_element_orderopção (dentro dessas opções). Aqui está como tudo parece até agora:

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

Os dados estão sendo postados corretamente na tabela do banco de dados (como eu posso ver algumas das minhas tentativas fracassadas como novas entradas de opções, como mouldings_settings->profile_element_order) - Estou apenas tendo dificuldade em descobrir a update_option()sintaxe dessa opção específica. Eu tentei coisas como (tendo em mente que `mouldings_settings é o nome da opção real):

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

mas não há dados no momento. Qualquer ponteiro seria muito apreciado! Obrigado!

Atualizar É isso que eu tenho agora - a ação do ajax salva muito bem, mas quando eu salvo as opções do plug-in, ele duplica as opções no banco de dados e gera o mesmo erro de 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";}

Função:

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
fonte

Respostas:

36

No que diz respeito ao WordPress - sua matriz multidimensional é uma opção.

Para atualizar apenas parte da matriz multidimensional, é necessário recuperar a matriz inteira, altere-a de acordo e atualize a matriz inteira.

Suponha que sua matriz multidimensional seja a seguinte:

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

E suponha que você queira atualizar o valor da opção 'olá' de 'mundo' para 'lua'

//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
fonte
1
Olá, Steven - Atualizei minha pergunta original com o que tenho agora e, embora ele funcione com o Ajax (salva a posição quando atualizo), depois de salvar as configurações e a atualização do plug-in, as opções na tabela DB ficam um pouco confusas ( parece duplicado), o que está causando um erro - ainda estou me aproximando desse erro? Obrigado.
Zach
Você está dizendo que a própria linha é duplicada? Ou suas opções aparecem duplicadas dentro da linha? Tente excluir a opção e tente novamente - pode ser que você esteja simplesmente mantendo as duplicatas das tentativas anteriores.
Stephen Harris
Olá Stephen - fiz uma pasta dos meus passos para reproduzir o problema: pastebin.com/YHg1i7HR Obrigado!
Zach
Tente remover o seu array_merge. Isso está causando a duplicação. Você está mesclando uma matriz com uma sub-matriz (fazendo com que a sub-matriz seja duplicada).
Stephen Harris
Oi Stephen - Acho que não tenho certeza de como escrever isso então - só tenho $mouldings_options['profile_element_order'] = $new_list;update_option('mouldings_settings', mouldings_options);agora o que não possui duplicação (e grava no banco de dados corretamente, o que é bom) - mas no salvar página (salvar configurações do plugin) , a configuração do plug-in ainda é removida do banco de dados (como a última parte dessa pasta).
Zach