私は50以上のサイトを持つサブディレクトリWordpressネットワークを持っています、それはwordpress.example.com
のプライマリドメインにあります。
私のネットワーク内のクライアント johndoe は、(意図的に)メインブランドを含むバックエンドを持ちます(ブランド化と所有権の理由から)。
wordpress.example.com/johndoe/wp-admin/
その後、 を使用したドメインマッピングを介してWordPress MU Domain Mapping By Donncha O Caoimh 、のフロントエンド:
johndoe.com/
私の問題は、ログインCookieはwordpress.example.com
にのみ関連付けられ、完全に無関係でjohndoe.com
を認識しないため、フロントエンドがユーザーが実際にログインしていることを認識しないことです。
is_user_logged_in()
はフロントエンドでは動作しません「リモートログイン」を無効にすることで、サイトのバックエンドをjohndoe.com/wp-admin/
にすることができ、前述の問題をすべて解決できます。ただし、バックエンド用にプライマリドメインを維持することが重要です。すべての私の読みで私は解決策を見つけていない、そして私はこの質問を何年もの間放置させた。
私はWordpress.com(それ自体がWordpressネットワークを搭載)がこの問題を解決したようです。 https://longitudes.ups.comのようなランダムなwordpress.comブログにベンチャーしてwordpress.comにログインしたとき 私は自分の.comログインを見ることができ、ツールバーはiframeのように見えません。愚かなことは何でも。
それで、私の質問は、Wordpressサイトのフロントエンドドメインがバックエンドと異なるならば、ログインクッキーを両方に結び付ける方法はありますか?答えが「あなたができない」(私のすべての研究が戻ってきたように)なら、私のフォローアップはそうです、まあAutomatticの人々はどうやってそれをしますか?
WordPressはAUTH_COOKIE
とLOGGED_IN_COOKIE
をチェックすることによってあなたがログインしているかどうかを決定しています。あなたはこれらのクッキーが同じように設定されていることに気づいたように、あなたのサイトが何であるかA
ドメインを言ってみましょう。 2番目のB
ドメインに同じCookieを追加すると、ユーザーは2つのA
ドメインとB
ドメインにログインします。もちろん、2番目のA
ドメインにドメインB
からcookieを設定することは、非常に大きなセキュリティ上の欠陥となるため、ドメインA
からドメインB
にcookie値を送信し、それらをdomain B
に設定する必要があります。
それで、これは我々がしなければならないことです:
A
のクッキーAUTH_COOKIE
とLOGGED_IN_COOKIE
を読むAUTH_COOKIE
とLOGGED_IN_COOKIE
をドメインA
からドメインB
に送信するB
にクッキーAUTH_COOKIE
とLOGGED_IN_COOKIE
を設定するクッキーを読むには、2つのフィルタset_auth_cookie
とset_logged_in_cookie
を使う必要があります。ドメインB
ユーザーのブラウザにクッキーを設定するには、ブラウザはサイトB
上にある必要があります。そのため、クッキー値を使用してユーザーをドメインA
からドメインB
にリダイレクトする必要があります。 GET
paramsを使用したリダイレクトはオプションではありません。クッキーはセキュリティに注意を払う必要があります。POST
リクエストを使用する必要があります。ユーザーをリダイレクトし、POSTを使用してCookieデータを送信するには、ドメインB
を指すURLを使用して単純なHTMLフォームを作成します。ユーザーがリダイレクトされたら、ドメインB
にCookieを設定し、ユーザーをドメインA
に戻すことができます。
私は自分の実装用に作業コードを作成しました。
/**
* DOMAIN A PART PLUGIN
*/
class WPSE_287556_Send_Cookies {
/**
* Domain which user have to be redirected
*
* @var array
*/
private $domainB = 'example.com';
/**
* Array of cookies to send
*
* @var array
*/
private $cookies = array();
/**
* WPSE_287556_Send_Cookies constructor.
*/
public function __construct()
{
/**
* Define plugin related hooks
*/
$this->define_hooks();
}
/**
* Save auth and logged in cookies to array
*/
public function save_cookie( $cookie, $expire, $expiration, $user_id, $scheme, $token ) {
$this->cookies[] = $data = array(
'cookie' => $cookie,
'expire' => $expire,
'scheme' => $scheme,
);
}
/**
* Display redirect post form
*
* We should not redirect user with cookies in get parameters because this is
* no safe. We also can not redirect user with post parameters. We can create
* html post form and submit it with js.
*/
public function display_redirect_form( $redirect_to, $requested_redirect_to, $user ) {
if( is_array( $this->cookies ) && !empty( $this->cookies ) ):
$url = ( is_ssl() ) ? 'https://' : 'http://' . $this->domainB . '/';
?>
<form action="<?php echo esc_url( $url ); ?>" method="post" style="display: none;" id="post_redirect_form">
<input type="hidden" name="action" value="set_cookies" >
<?php foreach($this->cookies as $index => $cookie): ?>
<input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][cookie]" value="<?php esc_attr_e( $cookie['cookie'] ); ?>" >
<input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][expire]" value="<?php esc_attr_e( $cookie['expire'] ); ?>" >
<input type="hidden" name="cookies[<?php esc_attr_e( $index ); ?>][scheme]" value="<?php esc_attr_e( $cookie['scheme'] ); ?>" >
<?php endforeach; ?>
<input type="hidden" name="redirect_to" value="<?php esc_attr_e( $redirect_to ); ?>" >
</form>
<script> document.getElementById('post_redirect_form').submit(); </script>
<?php exit; ?>
<?php endif;
return $redirect_to;
}
/**
* Define plugin related hooks
*/
private function define_hooks() {
/**
* Save cookies hook
*/
add_action( 'set_auth_cookie', array($this, 'save_cookie'), 10, 6 );
add_action( 'set_logged_in_cookie', array($this, 'save_cookie'), 10, 6 );
/**
* Display redirect post form
*
* This filter is used to modify redirect url after login. There is no
* better place to modify page content after user login. Additionally
* we have access to $redirect_to url which we can use later.
*/
add_filter('login_redirect', array( $this, 'display_redirect_form' ), 10, 3);
}
}
new WPSE_287556_Send_Cookies();
/**
* END OF DOMAIN A PART PLUGIN
*/
/**
* DOMAIN B PART PLUGIN
*/
class WPSE_287556_Set_Cookies {
/**
* WPSE_287556_Set_Cookies constructor.
*/
public function __construct()
{
/**
* Define plugin related hooks
*/
$this->define_hooks();
}
/**
* Set auth and logged in cookies
*/
public function set_cookies() {
// Check if request is "set auth cookie" request
if( $_SERVER['REQUEST_METHOD'] === 'POST' && isset( $_POST['action'] ) && $_POST['action'] === 'set_cookies' ) {
$args = array(
'redirect_to' => FILTER_SANITIZE_URL,
'cookies' => array(
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY,
),
);
// Read and filter all post params
$post = filter_input_array(INPUT_POST, $args);
$redirect_to = $post['redirect_to'];
$cookies = $post['cookies'];
foreach( $cookies as $cookie_params ){
$scheme = $cookie_params['scheme'];
$cookie = $cookie_params['cookie'];
$expire = (int) $cookie_params['expire'];
// Decide which cookie to set
switch( $scheme ) {
case 'logged_in':
// Set logged in cookie, most of the code is from wp_set_auth_cookie function
setcookie( LOGGED_IN_COOKIE, $cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true);
if ( COOKIEPATH != SITECOOKIEPATH )
setcookie(LOGGED_IN_COOKIE, $cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true);
break;
case 'secure_auth':
case 'auth':
// Set auth cookie, most of the code is from wp_set_auth_cookie function
if ( $scheme === 'secure_auth' ) {
$auth_cookie_name = SECURE_AUTH_COOKIE;
} else {
$auth_cookie_name = AUTH_COOKIE;
}
setcookie($auth_cookie_name, $cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, is_ssl(), true);
setcookie($auth_cookie_name, $cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl(), true);
break;
}
}
// Redirect user to previous site
header( 'Location: ' . esc_url( $redirect_to ) );
exit;
}
}
/**
* Define plugin related hooks
*/
private function define_hooks() {
/**
* Set cookies from request
*/
add_action( 'init', array($this, 'set_cookies'));
}
}
new WPSE_287556_Set_Cookies();
/**
* END OF DOMAIN B PART PLUGIN
*/
あなたのwp-config.php
ファイルでこの定義をチェックしてもらえますか?
define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');
define('COOKIEPATH', '');
define('SITECOOKIEPATH', '');
また、マルチサイトの定義も確認してください。
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'your-domain.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('SUNRISE', 'on');