こんにちは。
現在ローカルで試しているのですが、2つのwordpressのログインをそれぞれのサイトで行うのが面倒なので、片方でログインしたら双方ログイン状態にできないかと思い試験的に作成しています。
【前提】
1、ユーザー管理はプラグイン[wp-members]を使用。
2、プラグイン[wp-members]内の[wp-members-core.php]のlogin()ファンクション内でサインオンの処理が完了した後にAPIでもう片方のサイトにもログイン処理をしておく。
3、ユーザー情報自体は別々のデータベースで管理しているが、まったく同じユーザー情報が入っている(後々同期処理を行う処理を追加予定)
4、ローカルでは現在MANPを使用中
【ファイル構成】
MAMP/htdocs
wordpress1 (localhost:8888/wordpress1)
→wordpressapi
「synchro_login.php」
→wp-admin
→wp-content
→wp-includes .etc.....
wordpress2 (localhost:8888/wordpress2)
→wordpressapi
「synchro_login.php」
→wp-admin
→wp-content
→wp-includes .etc.....
【ログイン処理側】
PHP
1/* localhost:8888/wordpress1/wp-content/plugin/wp-members/wp-members-core.php内 */ 2 3$user = wp_signon( $creds, false ); 4 if( ! is_wp_error( $user ) ) { 5 //サイト間ログイン同期処理追加 6 $another_site = get_option('st_link_url');//localhost:8888/wordpress2/ 7 $url = $another_site."wordpressapi/synchro_login.php"; 8 $data = array('access_token' => $user_token,'userid' => $user->ID,'password' => $user_pass); 9 10 $ch=curl_init(); 11 curl_setopt($ch,CURLOPT_URL,$url); 12 curl_setopt($ch,CURLOPT_POST, TRUE); 13 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 14 curl_setopt($ch,CURLOPT_HEADER,FALSE); 15 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); 16 curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE); 17 //ユーザーエージェントをIEに偽装する処理 18 curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'); 19 $result = json_decode(url_exec($ch), false); 20 $rcode = $result->rcode; 21 $error_code = $result->errorcode; 22 curl_close($ch); 23 24 if($rcode){ 25 wp_clear_auth_cookie(); 26 nocache_headers(); 27 return "loginfailed"; 28 } 29 30 //サイト間ログイン同期処理追加 31 } else { 32 return "loginfailed"; 33}
【API側】
PHP
1/* localhost:8888/wordpress1/wordpressapi/synchro_login.php内 */ 2 3header("Access-Control-Allow-Origin: *"); 4require_once('../wp-load.php'); 5 6global $wpdb; 7$result = new stdClass; 8$result->rcode = 0; 9$result->errorcode = 0; 10 11// パラメータ存在チェック 12if (!isset($_POST['userid']) || empty($_POST['userid'])) { 13 $result->rcode = -1; 14 $result->errorcode = 1; 15} 16 17if (!isset($_POST['password']) || empty($_POST['password'])) { 18 $result->rcode = -1; 19 $result->errorcode = 1; 20} 21 22if (!isset($_POST['access_token']) || empty($_POST['access_token'])) { 23 $result->rcode = -1; 24 $result->errorcode = 1; 25} 26 27//アカウント存在チェック分岐 28if (!$result->rcode) { 29 30 $post_ID = $_POST["userid"]; 31 $post_pass = $_POST["password"]; 32 $post_token = $_POST["access_token"]; 33 $rememberme = ( isset( $_POST['rememberme'] ) == 'forever' ) ? true : false; 34 35 $creds = array(); 36 $creds['user_login'] = $post_ID; 37 $creds['user_password'] = $post_pass; 38 $creds['remember'] = $rememberme; 39 40 $user = wp_signon( $creds, false ); 41 42 if( ! is_wp_error( $user ) ) { 43 44 if($contents !== false){ 45 46 wp_set_auth_cookie( $user->ID, $rememberme ); 47 48 }else{ 49 50 $result->rcode = -1; 51 $result->errorcode = 3; 52 53 } 54 55 }else{ 56 57 $result->rcode = -1; 58 $result->errorcode = 4; 59 60 } 61 62 } else { 63 64 $result->rcode = -1; 65 $result->errorcode = 5; 66 67 } 68 69} 70$result_JSON = json_encode($result); 71echo $result_JSON; 72
実際に正常に動かすとAPI側でもTRUEの判定が帰ってきて実際に処理は完了し、ログインまではできます。
ですが、問題はwordpress1のサイトでログインはでき、ログイン後の画面を表示しましたが、wordpress2のサイトへ同じブラウザから移動した場合ログイン状態になっていないのが大きな問題となりました。
API側でサインインできないとTRUE判定にはならないので処理はできているはずです。
一回試しにAPI側でrememberをtureにしてログイン状態の維持ができるかと思いましたが、それもできず。
他に外部サイトからログイン操作してその後に遷移した場合にログイン状態を保存する方法があればお伺いできればと思います。
【追記】
多分原因はサインオンはできていますが、そのサインオンはサーバー上で行われているものであり、ブラウザ以上でログインした事になっていないからではないかなぁと考えられます。
実際そうだとしたらAPIでサインオンを行なった場合、この処理でログイン状態をブラウザで保持することは可能なのでしょうか?

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/05 07:49