質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    24437questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9090questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

同じサーバー内の2つのWordpressサイトを同時にログインさせたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 607

omusoba

score 19

こんにちは。 
現在ローカルで試しているのですが、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.....

【ログイン処理側】

/* localhost:8888/wordpress1/wp-content/plugin/wp-members/wp-members-core.php内 */

$user = wp_signon( $creds, false );
    if( ! is_wp_error( $user ) ) {
           //サイト間ログイン同期処理追加
                    $another_site = get_option('st_link_url');//localhost:8888/wordpress2/
                    $url = $another_site."wordpressapi/synchro_login.php";
                    $data = array('access_token' => $user_token,'userid' => $user->ID,'password' => $user_pass);

                    $ch=curl_init();
                    curl_setopt($ch,CURLOPT_URL,$url);
                    curl_setopt($ch,CURLOPT_POST, TRUE);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                    curl_setopt($ch,CURLOPT_HEADER,FALSE);
                    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
                    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
                    //ユーザーエージェントをIEに偽装する処理
                    curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko');
                    $result = json_decode(url_exec($ch), false);
                    $rcode = $result->rcode;
                    $error_code = $result->errorcode;
                    curl_close($ch);

                    if($rcode){
                        wp_clear_auth_cookie();
                        nocache_headers();
                        return "loginfailed";                        
                    }     

                    //サイト間ログイン同期処理追加
  } else {
      return "loginfailed";
}

【API側】

/* localhost:8888/wordpress1/wordpressapi/synchro_login.php内 */

header("Access-Control-Allow-Origin: *");
require_once('../wp-load.php');

global $wpdb;
$result = new stdClass;
$result->rcode = 0;
$result->errorcode = 0;

// パラメータ存在チェック
if (!isset($_POST['userid']) || empty($_POST['userid'])) {
    $result->rcode     = -1;
    $result->errorcode = 1;
}

if (!isset($_POST['password']) || empty($_POST['password'])) {
    $result->rcode     = -1;
    $result->errorcode = 1;
}

if (!isset($_POST['access_token']) || empty($_POST['access_token'])) {
    $result->rcode     = -1;
    $result->errorcode = 1;
}

//アカウント存在チェック分岐
if (!$result->rcode) {

    $post_ID = $_POST["userid"];
    $post_pass = $_POST["password"];
    $post_token = $_POST["access_token"];
    $rememberme = ( isset( $_POST['rememberme'] ) == 'forever' ) ? true : false;

    $creds = array();
    $creds['user_login'] = $post_ID;
    $creds['user_password'] = $post_pass;
    $creds['remember']      = $rememberme;

    $user = wp_signon( $creds, false );

    if( ! is_wp_error( $user ) ) {

        if($contents !== false){

            wp_set_auth_cookie( $user->ID, $rememberme );

         }else{

                $result->rcode     = -1;
                $result->errorcode = 3;

            }

        }else{

            $result->rcode     = -1;
            $result->errorcode = 4;

        }

    } else {

        $result->rcode     = -1;
        $result->errorcode = 5;

    }

}
$result_JSON = json_encode($result);
echo $result_JSON;

実際に正常に動かすとAPI側でもTRUEの判定が帰ってきて実際に処理は完了し、ログインまではできます。
ですが、問題はwordpress1のサイトでログインはでき、ログイン後の画面を表示しましたが、wordpress2のサイトへ同じブラウザから移動した場合ログイン状態になっていないのが大きな問題となりました。
API側でサインインできないとTRUE判定にはならないので処理はできているはずです。

一回試しにAPI側でrememberをtureにしてログイン状態の維持ができるかと思いましたが、それもできず。

他に外部サイトからログイン操作してその後に遷移した場合にログイン状態を保存する方法があればお伺いできればと思います。

【追記】
多分原因はサインオンはできていますが、そのサインオンはサーバー上で行われているものであり、ブラウザ以上でログインした事になっていないからではないかなぁと考えられます。
実際そうだとしたらAPIでサインオンを行なった場合、この処理でログイン状態をブラウザで保持することは可能なのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

解決策ではないのですが、まずちゃんとログインできているか確認しませんか?
wordpressのプラグインで、見れるようにするものがいくつかありますので、そちらで確認してみてはどうでしょうか。

Activity log

user login log

Crazy Bone(狂骨)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/05 16:49

    回答ありがとうございます。
    一通りプラグインの内容を拝見させていただきまして、今回は狂骨をしようしてログインのログをとって確認しました。
    それで確認したところ、やはりログインのログに残っていることからサインオン自体の処理には問題はなさそうでした。

    本来のwordpressならログアウト処理やログイン時間のタイムアウトしない限り、同じブラウザ内だったらログイン情報はそのまま残っているのに対して、今回はページをそのまま遷移しても別のタブで開いてもログインの扱いが取れていないので、やはりログイン状態の維持の問題が発生しているかもしれません。

    キャンセル

同じタグがついた質問を見る

  • PHP

    24437questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    9090questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。