シナリオ:ユーザがログインしていない場合、ユーザはログインページをカスタマイズするためにリダイレクトし、ログイン後に再び宛先ページにリダイレクトする。関数やプラグインは使いません。制限ページへのこのコード:
if (!is_user_logged_in()){ wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) );
}
ユーザーログインは成功しましたが、ログインページでURLが?page = loginに変更され、URLを宛先ページにリダイレクトできません。作り方は?誰でも手伝うことができますか?
最近似たようなことをしました。
1。ユーザーがログインしていない場合、目的のページ/宛先ページのURLをキャプチャし、それをクエリ引数としてログインページのURLに追加しました。
2。ユーザーをログインページにリダイレクトします。
function wpa_59205_redirect(){
global $post;
if ( ! is_user_logged_in() ) {
// this will tack on the current page's url as a query arg for the login page's url
$redirect = add_query_arg( 'redirect_to', get_permalink( $post->ID ), $url_of_your_login_page_here );
// redirect to the login page
wp_redirect( $redirect );
exit();
}
}
add_action( 'template_redirect', 'wpa_59205_redirect' );
。次に、login_redirect
フィルターを使用して、ログイン後にユーザーがリダイレクトされるURLをフィルターできます。以前に追加したクエリ変数の存在を確認するだけです:
function wpa_59205_login_redirect( $redirect_to ){
if( isset( $_REQUEST['redirect_to'] ) ) {
return $_REQUEST['redirect_to'];
} else {
return $redirect_to;
}
}
add_filter( 'login_redirect', 'wpa_59205_login_redirect');
WooCommerceのログインページでこれを行ったため、独自のログインリダイレクトフィルターをフィルタリングしていましたが、login_redirect
はWPのデフォルトバージョンなので、私 think動作するはずですが、テストしていません。
あなたのスニペットはうまくいくはずです。
まず、あなたのカスタムログインフォームはredirect_to
を尊重しないかもしれません。 wp-login.php
はできますが、redirect_to
フォーム送信にもwp-login.php
引数を送信する必要があります。ログインフォームのコードを表示してください。
wp_redirect
の使い方には注意が必要です。ヘッダを送信することで機能します。
<?php
/**
* Redirects to another page.
*
* @since 1.5.1
* @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
*
* @param string $location The path to redirect to
* @param int $status Status code to use
* @return bool False if $location is not set
*/
function wp_redirect($location, $status = 302) {
global $is_IIS;
$location = apply_filters('wp_redirect', $location, $status);
$status = apply_filters('wp_redirect_status', $status, $location);
if ( !$location ) // allows the wp_redirect filter to cancel a redirect
return false;
$location = wp_sanitize_redirect($location);
if ( !$is_IIS && php_sapi_name() != 'cgi-fcgi' )
status_header($status); // This causes problems on IIS and some FastCGI setups
header("Location: $location", true, $status);
}
あなたのページの一部が既にロードされていて、あなたが 出力バッファリング を使っていないなら、それは動作しません。 Headers already sent
とそのすべてのビジネス。
その場合は、ログインフォームへのリンクを含むメッセージを表示するか、フォーム自体を表示することをお勧めします(例: wp_login_form
)。
次に、wp_redirect
を使用した後は常にexit
またはdie
を呼び出す必要があります。これにより、PHPスクリプト(WordPressなど)の実行が終了し、ヘッダーが送信され、保釈されます。そうでなければ、ページの下にあるものがあなたのリダイレクトヘッダを殺すかもしれません。
<?php
wp_redirect(site_url('wp-login.php'));
exit;
最後に、あなたのredirect_to
URLにホストを含めるつもりなら、プロトコルを含めるべきです。
$_SERVER['REQUEST_URI']
を使うこともできます。
<?php
$url = add_query_arg('redirect_to', $_SERVER['REQUEST_URI'], site_url('wp-login.php'));
wp_redirect($url);
exit;
注意してください:ページが始まっているならば、wp_redirectは呼ばれないでしょう、それでそれをより高く呼び出すことを忘れないでください。
<?php
if (!is_user_logged_in()){
$current_url = $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
wp_redirect( wp_login_url( $current_url ) );
exit;
}
?>
wp_redirect: http://codex.wordpress.org/Function_Reference/wp_redirect
wp_login_url: http://codex.wordpress.org/Function_Reference/wp_login_url