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

bes*_*rld 5 php ajax wordpress jquery

我正在使用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
Run Code Online (Sandbox Code Playgroud)

等等...

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

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

是否有可能在ajax调用和正常请求之间进行交换,然后我将如何实现呢?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();
        }
}
Run Code Online (Sandbox Code Playgroud)

Ska*_*ski 4

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

public function get_current_formvalues() {
        global $wp_session;
        return $wp_session['formvalues'];
}
Run Code Online (Sandbox Code Playgroud)

并在set方法中添加

 public function set_formvalues() {
         global $wp_session;           
         //Default values for form
Run Code Online (Sandbox Code Playgroud)

目前的编写方式$wp_session在调用时不可用。您可以在http://php.net/manual/en/language.variables.scope.php上阅读更多内容