2014年11月6日木曜日

Welcartにおけるredirect処理 3/3

Welcartにおけるredirect処理の解説は2回の予定であったが、復習がてらもう一つ解説を加えようと思う。

新規入会フォーム

初回の解説において、例えばlocalhostの場合で、"新規入会フォーム"の"送信する"ボタンを押したときにformのaction属性に指定されている
http://localhost/wordpress/?page_id=55&page=newmember
は、この新規入会フォーム自身であると説明した。しかし、この
http://localhost/wordpress/?page_id=55&page=newmember
がなぜ"新規入会フォーム"ページであり、その元になるファイルが、/wc_templates/member/wc_new_member_page.phpとなるのかについては詳しく触れなかったので、そこを掘り下げていきたいと思う。

regist_actionメソッドを見てみよう

regist_actionメソッドを見ると、
usces_register_action('page_newmember', 'get', 'page', 'newmember', 'page_newmember');
が見つかる。これは噛み砕くと、'get'メソッドで、$_GET['page'] = 'newmember'が渡されてきたときはpage_newmemberメソッドをコールするということである。ここで、先ほどのURLをみると
http://localhost/wordpress/?page_id=55&page=newmember
と、まさに'get'メソッドで$_GET['page'] = 'newmember'が渡っていることが分かる。なので、ad_controllerメソッドにより、page_newmemberメソッドがコールされることが分かる。

page_newmemberメソッド

page_newmemberメソッドは何をしている関数かというと、ソースをみると、
    function page_newmember(){
    
        global $wp_query;
        $this->page = 'newmemberform';
        add_filter('yoast-ga-push-after-pageview', 'usces_trackPageview_newmemberform');
        add_action('the_post', array($this, 'action_memberFilter'));
        add_action('template_redirect', array($this, 'template_redirect'));
    }
のように、$this->page = 'newmemberform';をセットし、template_redirectメソッドをtemplate_redirectアクションにフックしていることが分かる。

template_redirectメソッド

template_redirectメソッドでは、$this->pageが'newmemberform'のときに、
                        if( file_exists(get_stylesheet_directory() . '/wc_templates/member/wc_new_member_page.php') ){
                            $member_regmode = 'newmemberform';
                            include(get_stylesheet_directory() . '/wc_templates/member/wc_new_member_page.php');
                            exit;
                        }
と最初に言ったように/wc_templates/member/wc_new_member_page.phpをインクルードしており、このファイルこそが新規入会フォームを作っているファイルであると分かった。

まとめ

前回まではbuttonなどの要素をクリックし飛んだ場合を説明したが、今回のように直接URLを指定したときも同じ仕組みを利用してどのファイルを利用してどのページを生成するのかが決まっていることが分かった。Welcartにおけるredirect処理におけるモヤモヤがずいぶんと晴れた。

0 件のコメント:

コメントを投稿