web-dev-qa-db-ja.com

ログイン後にユーザーがリンク先URLにリダイレクトする

シナリオ:ユーザがログインしていない場合、ユーザはログインページをカスタマイズするためにリダイレクトし、ログイン後に再び宛先ページにリダイレクトする。関数やプラグインは使いません。制限ページへのこのコード:

if (!is_user_logged_in()){ wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) );
}

ユーザーログインは成功しましたが、ログインページでURLが?page = loginに変更され、URLを宛先ページにリダイレクトできません。作り方は?誰でも手伝うことができますか?

7
Juan Lie

最近似たようなことをしました。

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動作するはずですが、テストしていません。

3
helgatheviking

あなたのスニペットはうまくいくはずです。

まず、あなたのカスタムログインフォームは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;
2
chrisguitarguy

注意してください:ページが始まっているならば、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

0
AnupRaj