web-dev-qa-db-ja.com

ログイン後に参照ページにリダイレクトする

カスタムログインプラグインやオーダーメイドのコードは使用していません。私の一部のページでは、最初のうちにこのようなコードが含まれていました。

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/');
?>

そのため、ログインしていないときにユーザーがページを表示することはできません。これらのページには、次のコードが含まれています。

/wp-content/my-theme/my-account/
/wp-content/my-theme/my-account/world.php
/wp-content/my-theme/my-account/subscription.php
/wp-content/my-theme/my-dashboard.php
/wp-content/my-theme/my-files.php

現在、ユーザがログインせずに上記のいずれかのページにアクセスすると、ログインページにリダイレクトされ、ログインするとmy-account/ページに移動します。

現在のシナリオを変更して、ユーザーが参照元のページにリダイレクトするようにします。私は次のことを試しましたが、うまくいきませんでした。

HTTP_REFERRERを使う

login/フォームに、このコードを配置しました。

<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />

functions.phpをハッキングする

functions.phpに、このコードを配置しました。

if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) {
        add_filter('login_redirect', 'my_login_redirect', 10, 3);
        function my_login_redirect() {
                $location = $_SERVER['HTTP_REFERER'];
                wp_safe_redirect($location);
                exit();
        }
}

参照:


私もこれらを試してみましたが失敗しました:

何もうまくいきませんでした。必要に応じて詳細を提供させていただきます。前もって感謝します。 :)


更新

私はこのようにコードを修正しました:

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>

これはログインページをこのようにレンダリングします:

/login.php?redirect_to=/my-account/subscription.php

認証してリダイレクトするにはこれで十分です。しかし、実際のリダイレクトが発生する場所を見つけて、それをredirect_toパラメータを使用してリダイレクトする必要があります。

私はあなたの設定を理解しているかわかりませんが、ここでいくつかのアイデアがあります:

A)redirect_toパラメータを設定してログインリンクを表示します。

あなたはあなたのカスタムテンプレートページに以下を追加することができます:

if( ! is_user_logged_in() )
{
    printf( '<a href="%s">%s</a>', 
        wp_login_url( get_permalink() ),
        __( 'You need to login to view this page!' )
    );
}

これはredirect_to GETパラメータの現在のページで、匿名訪問者のためのログインリンクを生成します。

B)wp-login.phpパラメータを設定してredirect_toにリダイレクトします。

HTTPヘッダーが送信される前にwp_redirect()の呼び出しが行われる必要があることに注意してください。

template_redirectフック内で呼び出すことができます。

add_action( 'template_redirect', 
    function()
    {
        if( ! is_user_logged_in() 
            && is_page( array( 'member-page-1', 'member-page-2' ) ) 
        )
        {
            wp_safe_redirect( wp_login_url( get_permalink() ) ); 
            exit();
        }
    }
);

スラッグmember-page-1member-page-2を使ってページへのアクセスを制限します。

C)ネイティブログインフォーム(インライン)

もう1つの選択肢は、ネイティブのログインフォームを直接ページのコンテンツに含めることです。

add_filter( 'the_content', function( $content ) {

    if( ! is_user_logged_in() 
        && is_page( array( 'member-page-1', 'member-page-2' ) ) 
    )
        $content = wp_login_form( array( 'echo' => 0 ) );

    return $content;
}, PHP_INT_MAX );

スラッグmember-page-1member-page-2を使ってページへのアクセスを制限します。

アーカイブ/インデックス/検索ページを管理する必要があることに注意してください。

更新: 私は wp_login_url() 関数を使うことでそれを単純化した。

8
birgire

受け入れられた答えで示唆されているように、Usgin get_permalink()はあなたが(どんなタイプの)投稿でもある場合にのみ機能しますが、例えばあなたがカテゴリアーカイブにいる場合は機能しません。どこでも機能させるには、現在表示されているURLが必要です。表示されているコンテンツの種類は関係ありません。

WordPressで現在のURLを取得するには、グローバルな$wpオブジェクトから現在のリクエストを取得し、それをadd_query_arg()を使用してサイトのURLに追加します。その結果をwp_login_url()関数のredirect_toパラメータで使用できます。

wp_login_url( site_url( add_query_arg( array(), $wp->request ) ) );

必要ならば、wp_logout_url()と同じアプローチを使うことができます。

wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );
2
cybmeta

カスタムログインページでこのコードを使うこともできます

if ( ! is_user_logged_in() ) { // Display WordPress login form:
   $args = array(
    'redirect' => esc_url($_SERVER['HTTP_REFERER']), 
    'form_id' => 'loginform-custom',
    'label_username' => __( 'Email' ),
    'label_password' => __( 'Password' ),
    'label_log_in' => __( 'Log In' ),
    'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">Lost Password</a></p>';
}

ログイン後、これはユーザーをリファラーページにリダイレクトします。

0
KKumar