UPDATE_OPTION不是在保存数组,而是在保存字符串‘Array’

时间:2012-06-16 作者:Jared

我在使用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: 调试(我更新了上面的代码,请参见注释)

这是我从函数内部返回修改后的选项时得到的结果:

enter image description here

这是我使用get_option 再一次

ajax

保存选项并完成表单后,有时我会直接进入当前显示的页面并执行以下操作die( var_dump( get_option( \'vm_fbconnect\', array() ) ); 上面说string(5) \'Array\'.

此外,每次尝试之前,我都会小心地重置选项,并确保我注释掉了delete_option 重试时的函数!:)

2 个回复
最合适的回答,由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;
    }
我知道有更好的方法可以做到这一点,稍后将进行编辑。

SO网友:Evan Mattson

无论出于何种原因,在更新选项之前,您的数组似乎没有被序列化。可能是由于ajax或您的特殊情况。

尝试以下操作:

// ...

$option[ \'apps\' ][] = $new_app;

if( ! is_serialized( $option ) )
    $option = maybe_serialize( $option );

$data = update_option( \'vm_fbconnect\', $option );

// ...

结束

相关推荐

如何让WordPress的URL对AJAX驱动的站点是谷歌友好的?

我们的wordpress站点利用wordpress cms提供json数据,我们通过ajax请求摄取json数据并提供javascript。我想为我的常规wordpress页面/帖子创建URL,这些页面/帖子遵循谷歌推荐的可爬行页面_转义\\u fragment\\uURL permalink结构:For more information on crawlable ajax, read this article.This article also goes into detail about making