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

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

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2987閲覧

2つのWordpressサイトを同時にログインできるAPIを作成

omusoba

総合スコア29

WordPress

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2016/11/03 07:20

編集2016/11/04 04:29

こんにちは。
現在ローカルで試しているのですが、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 $header = array("Content-Type: application/x-www-form-urlencoded","Content-Length: ".strlen($data)); 11 $context = array( 12 "http" => array( 13 "method" => "POST", 14 "header" => implode("\r\n", $header), 15 "content" => $data 16 ) 17 ); 18 $contents = file_get_contents($url, false, stream_context_create($context)); 19 if($contents !== false){ 20 $result = json_decode($contents, false); 21 if (!$result->rcode) { 22 $redirect_to = apply_filters( 'wpmem_login_redirect', $redirect_to, $user->ID ); 23 wp_redirect( $redirect_to ); 24 }else{ 25 return "loginfailed"; 26 } 27 }else{ 28 return "loginfailed"; 29 } 30 //サイト間ログイン同期処理追加 31 } else { 32 return "loginfailed"; 33}

【API側】

PHP

1/* localhost:8888/wordpress1/wp-content/plugin/wp-members/wp-members-core.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 73 74 75 76 77

サインオン自体の処理はできており、その後に発行しているアクセストークンやユーザー情報の取得もできています。
ただ、どうしてもその後に行うもう一つのサイトに向けてPOST送信を行うとfalseで返ってきます。
この場合、API側の方で受け取れておらず送信の際に何か起きている(送信の仕方が悪い)と考えています。
送信方法などでcurlの送信方法で試してみた所、同じくnullでした。
試しに直接API側にブラウザでアクセスすると{"rcode":-1,"errorcode":2}と、動くことはうごいています。

こういった方面に知識がおありの方がいらっしゃいましたらご助力いただけば幸いです。

【追記】
googleのツール「Advanced REST client」でPOST送信の返り値などを確かめるためにデバッグで確かめていたらもう一つわかりました。
API側の受け取り時、POSTの変数が空になっておりました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

PHP

1$ch=curl_init(); 2 curl_setopt($ch,CURLOPT_URL,$url); 3 curl_setopt($ch,CURLOPT_POST, TRUE); 4 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 5 curl_setopt($ch,CURLOPT_HEADER,FALSE); 6 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); 7 curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE); 8 curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'); 9 10 $result = curl_exec($ch);

今思えば同じサーバーで動かす前提なので、わざわざfile_get_contentsを使用する必要がなかったかもしれません。
なのでできなかったcurl処理にユーザーエージェントを偽装して送信したら値を受け取ることができました!
ご回答していただいてありがとうございました!

投稿2016/11/04 06:20

omusoba

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

頑張って自作しなくても、
シングル・サインオンのプラグインを活用したほうがスマートに実装できそうな気がします。

参考:single sign-on — タグ — WordPress Plugins
https://ja.wordpress.org/plugins/tags/single-sign-on

例えば、WP OAuth Server — WordPress Plugins
https://ja.wordpress.org/plugins/oauth2-provider/
を使えば、WordPressのサーバーがOAuthのサーバーになれるわけです。

投稿2016/11/04 02:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omusoba

2016/11/04 03:21

ご回答ありがとうございます。 サイトやプラグインについては少し確認してみました。 ですが、今後ユーザー情報の変更の操作やユーザーの新規作成などの操作に対しても両方のサイトのユーザー情報の同期を取っていく予定でして、しかもこのサインオンの前の処理に一意なアクセストークンを発行しており、それをユーザーのメタ情報にアップデートしています。 その情報も同期していくので、実際の所DBの上書き自体は問題ないのですが、質問で挙げた様なAPIに近い処理が必要だと思い作成しました。 今回の大きな問題としては「APIを作成する」ということではなく、 「file_get_contentsの操作がうまくいかない」というのが主題になります。
退会済みユーザー

退会済みユーザー

2016/11/04 03:36 編集

file_get_contents()がうまくいかないのは、(1)瞬時に応答を返していな可能性、(2)contextをstream_context_create()で生成したものを一旦変数に格納しないといけない可能性、とかでしょうか。stream_context_create()を使ったサンプルコードが必ず変数保持しているように見えるので。
omusoba

2016/11/04 04:34

一度contextをstream_context_create()で生成したものを変数に入れてから行いましたがやはり結果は変わりませんでした。 送り先自体は間違ってはいないはずなのですが(直接urlをブラウザから開いて確かめたりしているので)、PHP同士でのやりとりかつローカル同士で行なっているのでそうなるとサーバーのタイムアウトになってfalseで帰ってきてることになるんでしょうかね....。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問