web-dev-qa-db-ja.com

ログイン後にユーザーを元のURLにリダイレクトをしますか?

ログインせずに他のページにアクセスしようとしている場合、ユーザーをログインページ(ホーム)にリダイレクトする機能があります。これがどのように機能するのかを示します。

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

本当にシンプルで問題なく動作します。問題は、WordPressのバックエンドが動作するのとまったく同じように、ログインに成功した後にアクセスしようとしていたURLにリダイレクトする必要があることです。

これを行う方法はありますか?前もって感謝します!

15

皆さん、どうもありがとうございました。結局、私のコードは次のようになります。

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

そして私のログインフォームで(私は自分のログインフォームを私はそれが存在することを知らなかったwp_login_formについて私に知らせるために私のアプリケーションのおかげで私のログインフォームをハードコーディングしています)

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

どうもありがとうございました、私はみんなに投票しました!

4

簡単にできます。リダイレクトパラメータを指定するだけです。あなたがログインページに行くためにホームページのログインリンクを使っているならば、それから@ sisirの解決策は正しいです。

<?php echo wp_login_url( $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"] ); ?>

フロントページのカスタムフォームを使用している場合は、<form>の内側で、リダイレクトするURLを隠しフィールドに入力してください。

<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]; ?>" />

そして、あなたがフォームを生成するためにwp_login_form()を使っているならば、それからパラメータを記入してください - http://codex.wordpress.org/Function_Reference/wp_login_form

<?php
$args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false );

wp_login_form( $args );
?>

あなたが持っているか必要なものに従って他のパラメータを変更してください。

15
Ashfame

the_permalink()$redirect引数として渡してみてください。

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( the_permalink() );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

編集:

すみません、もともとあなたの質問を誤解しました。これを試して:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        $redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
        wp_redirect( $redirect );
        exit;
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

注:wp_redirect()を適切に使用するには、exit;を追加する必要があります。これは、2番目の例に追加しました。

6
Chip Bennett

これは私がWPのログインページに誘導するために人々を使用する私のコードです。それからログインしたとき彼らは彼らがいた場所に戻った。しかし、それはホームページではなく、私がカスタムログインを設定するwordpressログインページです。

<?php echo wp_login_url( $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) ?>

あなたは一緒に研究したいと思うかもしれません。通常、$_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]によってユーザーの現在のURLを取得します。

2
Sisir

それはあなたの答えのうちのどれもうまくいっていないが、ちょっとしたことを加えているだけでうまくいった。ここに私のコード:

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . urlencode($_SERVER["REQUEST_URI"]));
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

@ Mattの返答と比較して/wp-login.phpを追加したのは私だけですが、私にとっては鍵となっています。それが役立つことを願っています! :)

**編集:

HTTPSでnavegateへのワードプレスを強制しているときにエラーを検出しました。リダイレクトがHTTPであるため、このメソッドは機能しません。問題を解決するために機能を変更しました。これが結果です。

function restrict_access_if_logged_out(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
    $redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_Host"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

プロトコルを確認した後、 'esc_url'を削除して正しいプロトコル$protocol://を追加しました。また、私は""を変更しました。

このページ をベースにしています。

0
Neil

私はこれが非常に遅いことを知っています、しかし私は将来の誰かがこれを見つけて、それを必要とするならば、これを正確に行う方法について投稿をしました:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/ /

0
user90810

login_redirectフィルタフック はここでより完全で効果的な解決策です。このようにして、さまざまなレベルのユーザーにさまざまなリダイレクトパスを提供したり、ログイン時にエラーが発生した場合にリダイレクトURLを維持することができます(つまり、誤ったパスワード)。

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
0
Matt