update_option não está guardando uma matriz, mas salvando a string ‘Array’

Eu encontrei um problema bastante estranho ao usar a function update_option , e tenho certeza de que tentei tudo o que posso pensar para fazê-lo funcionar, mas, infelizmente, não é.

Estou usando o AJAX para enviar um formulário (usando o método popular descrito aqui ) no backend, em uma página de opções personalizadas. Tudo está funcionando, exceto para a parte update_option . Eu simplesmente não entendo, há um problema com o uso dessa function em uma chamada de retorno da function AJAX?

  public function vmAddApp() { parse_str( stripslashes( $_POST[ 'data' ] ), $data ); $nonce = $_POST[ 'nonce' ]; $app_info = $data[ 'vm_fbconnect' ]; $option = get_option( 'vm_fbconnect', array() ); $appId = $data[ 'vm_fbconnect' ][ 'appId' ]; $secret = $data[ 'vm_fbconnect' ][ 'secret' ]; $app_response = wp_remote_get( 'https://graph.facebook.com/' . $appId ); $response_body = json_decode( $app_response[ 'body' ] ); $app_name = $response_body->name; $new_app = array( 'name' => $app_name, 'id' => $appId, 'secret' => $secret ); $option[ 'apps' ][] = $new_app; $data = update_option( 'vm_fbconnect', $option ); // UPDATE: // If I put either: // $data = $option; // <- this returns the option correctly, see below // or // $data = get_option( 'vm_fbconnect', array() ); //  $data ); echo json_encode( $response ); // <- this is how I'm getting the response in the JS console exit; } 

Editar 1: Depuração (atualizei o código acima, veja os comentários)

Isto é o que eu recebo ao retornar a opção modificada dentro da function:

insira a descrição da imagem aqui

Isso é o que eu recebo quando uso get_option novamente.

ajax

Depois que a opção foi salva e acabei com o formulário, às vezes eu vou direto para a página atualmente exibida e die( var_dump( get_option( 'vm_fbconnect', array() ) ); e diz apenas string(5) 'Array' .

Além disso, eu sempre tenho o cuidado de redefinir a opção antes de tentar cada vez, e cuidado para ter certeza de que eu comentei a function delete_option ao tentar novamente! 🙂

Solutions Collecting From Web of "update_option não está guardando uma matriz, mas salvando a string ‘Array’"

Parece que sua matriz não está sendo serializada antes de atualizar a opção por qualquer motivo. Talvez devido ao ajax ou apenas à sua situação particular.

Tente isso:

 // ... $option[ 'apps' ][] = $new_app; if( ! is_serialized( $option ) ) $option = maybe_serialize( $option ); $data = update_option( 'vm_fbconnect', $option ); // ... 

Acontece que minha pergunta nem tinha que ver com o AJAX, tinha que ver com a function usada para validar as configurações fornecidas com register_setting .

O problema com isso era que não estava indo suficientemente fundo na matriz para salvar os valores. Eu precisava modificá-lo para parecer assim:

  public function settingsValidate( $todo ) { $option = get_option( 'vm_fbconnect', array() ); if( !empty( $todo ) && is_array( $todo ) ) { foreach( $todo as $name => $value ) { if( is_array( $value ) ) { foreach( $value as $nam => $val ) { if( is_array( $val ) ) { foreach( $val as $n => $v ) { $option[ $name ][ $nam ][ $n ] = wp_filter_nohtml_kses( $v ); } } else { $option[ $name ][ $nam ] = wp_filter_nohtml_kses( $val ); } } } else { $option[ $name ] = wp_filter_nohtml_kses( $value ); } } } return $option; } 

Eu sei que há uma maneira melhor de fazer isso, vai editar algum tempo depois.