是否可以在ajax调用和正常请求之间交换会话数据? (在Wordpress中)

时间:2015-08-14 12:06:25

标签: php jquery ajax wordpress

我正在使用https://wordpress.org/plugins/wp-session-manager/插件,如果我只是设置并获取变量,它就可以工作。 (所以实际的会话管理工作)

我想要的是在ajax调用和“浏览器的正常请求”之间交换会话数据。这甚至可能吗?

的functions.php

add_action( 'wp_ajax_nopriv_set_formvalues', array ('FormHandler', 'set_formvalues') );
add_action( 'wp_ajax_set_formvalues', array ('FormHandler', 'set_formvalues') );

//Use of Plugin WP Session manager (so we can use sessions for storing current form values)                
//(do this with ajax before submitting the form)
global $wp_session;
$wp_session = WP_Session::get_instance();        
$formhandler = new FormHandler();

class FormHandler {                
        public function get_current_formvalues() {
                return $wp_session['formvalues'];
        }

        public function set_formvalues() {           
                //Default values for form
                $formvalues = array('name' => '', 
                                                            'address' => '', 
                                                            'plz' => '', 
                                                            'city' => '', 
                                                            'phone' => '',
                                                            'fax' => '',
                                                            'contactfirstname' => '',
                                                            'contactlastname' => '',
                                                            'contactanrede' => '',
                                                            'email' => '',
                                                            'contactphone' => '',
                                                            'recall' => '',
                                                            'newsletter' => '',
                                                            'messageText' => '');

                //Change values in formvalues-array if values are posted
                foreach($formvalues as $key => $value) {
                        if (isset($_POST[$key])) {
                                $formvalues[$key] = $_POST[$key];
                        }
                }
                $wp_session['formvalues'] = $formvalues;       
                echo json_encode( $wp_session );
                die(); //Needed for wordpress ajax
        }

    public function __construct() {
        $formvalues = $this->get_current_formvalues();
        echo $formvalues //doesn't echo out nothing
    }

}

$n = new FormHandler(); //doesn't echo out anything

等...

从javascript我通过ajax调用set_formvalues()并正确返回值(作为json)。

我必须将表单提交到另一个域,但在我必须以某种方式保存formvalues之前,因为我发布的域重定向了我的页面,但只有状态代码。我的想法是我可以通过ajax发送这些formvalues,然后在下次访问我的页面时获取它们,这样如果用户犯了一个错误,访问者将不必填写所有值。

是否可以在ajax-calls和普通请求之间进行交换,然后我将如何实现呢? unfornutenaly我必须忍受“来自其他服务器的重定向解决方案”。也许这是可能的但是我做错了什么呢?有什么想法吗?

更新 即使我使用全局变量,我也不满意。它真的不喜欢全局,但我以前想不到这样做的方法,但现在我有一个解决方案,如果有人偶然遇到类似的问题,我认为我想与你分享:

class FormHandler {      
        private $wp_session = null; //Use of Plugin WP Session manger, so we can handle sessions

        public function get_current_formvalues() {
                return $this->wp_session['formvalues'];
        }

        public function set_formvalues() {    
                if ($this->wp_session === null) {
                    $this->wp_session = WP_Session::get_instance();                
                }

                //set $formvalues based on posted fields...

                $this->wp_session['formvalues'] = $formvalues;

                echo json_encode( $this->wp_session );
                die(); //Needed for wordpress ajax
        }

        public function __construct() {                
                //This makes it possible to use $this within function set_formvalue when using ajax in Wordpress    
                add_action( 'wp_ajax_nopriv_set_formvalues', array ( $this, 'set_formvalues') );
                add_action( 'wp_ajax_set_formvalues', array  ($this, 'set_formvalues') );                
                $this->wp_session = WP_Session::get_instance();
        }

        public function display_contactform() {
                $formvalues = $this->get_current_formvalues();
        }
}

1 个答案:

答案 0 :(得分:4)

全局关键字应位于您要使用它的函数内部,如下所示:

public function get_current_formvalues() {
        global $wp_session;
        return $wp_session['formvalues'];
}

并将其添加到set方法

 public function set_formvalues() {
         global $wp_session;           
         //Default values for form

当前编写的方式,$wp_session在调用时无法使用。 您可以在http://php.net/manual/en/language.variables.scope.php

上阅读更多内容