我在使用update_option
函数,我确信我已经尽了我所能让它工作,但不幸的是它没有工作。
我正在使用AJAX提交表单(使用流行的方法described here) 在后端的自定义选项页上。除了update_option
部分我只是不明白,在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() ); // <- this returns \'Array\' as a string
// But regardless, both SAVE \'Array\' as the option\'s value..
header( "content-type: application/json" );
$response = array( \'data\' => $data );
echo json_encode( $response ); // <- this is how I\'m getting the response in the JS console
exit;
}
Edit 1: 调试(我更新了上面的代码,请参见注释)
这是我从函数内部返回修改后的选项时得到的结果:
这是我使用get_option
再一次
保存选项并完成表单后,有时我会直接进入当前显示的页面并执行以下操作die( var_dump( get_option( \'vm_fbconnect\', array() ) );
上面说string(5) \'Array\'
.
此外,每次尝试之前,我都会小心地重置选项,并确保我注释掉了delete_option
重试时的函数!:)
最合适的回答,由SO网友:Jared 整理而成
事实证明,我的问题甚至与AJAX无关,而是与用于验证随附设置的函数有关register_setting
.
问题是它没有深入到数组中,甚至无法保存值。我需要将其修改为这样:
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;
}
我知道有更好的方法可以做到这一点,稍后将进行编辑。