web-dev-qa-db-ja.com

カスタムログインフォームで外部サイトにリダレクト

私はプライベートページを作成しましたが、このページはVisibilityのPublish設定でprivateと表示されているページのコードを入力することで利用できるだけでなく、チェックするif/elseステートメントを追加しましたユーザーがログインしているかどうかそうであれば、コンテンツは本来のように表示され、そうでなければログインフォームが表示され、ユーザーはログインするように促されます。

問題は、彼らがフォームを使用してログインした後、彼らは管理者ページにリダイレクトされるということです。ログインページに目的のページに移動するためのリダイレクトを追加しましたが、うまくいかないようです。私は誤ってリダイレクトをしていますか?

<?php
/*
Template Name: Minutes
*/
?>

<?php get_header(); ?>

<?php get_template_part( 'templates/content', 'nav' ); ?>  
<?php get_template_part( 'templates/content', 'breadcrumb' ); ?> 




<section class="band bottom u-full-width" style="margin-top: 2%">
    <div class="container">
        <div class="row">


<?php if (is_user_logged_in()) { ?>


<div class="ten columns" >

<h5><b>Click the Plus (+) Sign to expend the list of available minutes per section</b></h5>   

Plus more code


<?php } else {
    echo 'We are sorry, but this area is only for registered, logged in users. If you are a registered user, please use the link below to login to the site to view content not available to the general public.  If you have any questions, please contact us.';
    wp_login_form(array('redirect' => 'http://etomv2.bambergmarketing.com/meeting-minutes'));
}
?>

</div>

</div></div>
</section>

<?php get_footer(); ?>
3
Justin Bamberg

内部の出来事の説明

wp_login_form() を見ると、redirect引数が絶対URlを要求していることがわかります。したがって、を内部的にリンクする場合は、admin_url()またはsite_url()を使用します

この形式のaction /ターゲットは、変更されることを意図していません(echoFALSEに設定し、出力ストリングで\DOMDocument置換またはRegexを使用して変更しない限り)。

action="' . esc_url( site_url( 'wp-login.php', 'login_post' ) ) . '" method="post"

次に wp_login.phpおよびcase : 'login' | default を見ると、次の2つのことに気付くでしょう。

  1. リダイレクトを調整するための フィルター があります。これは、引数に設定されているものを上書きする可能性があります。これは、ログインアクションを実行するユーザー(通常、さまざまな役割のユーザーをさまざまなウェルカム画面にリダイレクトするために使用される)によっても切り替わることがあります。

    apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );
    
  2. 次に、ユーザーが認証され、エラーのあるオブジェクトではないかどうかがチェックされます。それに応じて、要求が物事の/wp-admin側に向けられていない場合、次の関数が呼び出されます:

    exit( wp_safe_redirect( $target ) );
    

…そして wp_safe_redirect() を使用すると、外部にリンクnotできることを意味します(@TheDeadMedicコメント– fromthanks!から)。

解決策

WordPressでいつものように、オプションがあります:

  1. この関数は pluggable.php の中にあります。つまり、own関数に置き換えることができます。これはあまり安定していません(他のすべてのプラグインが同じことを行うことができます)が、個人サイトで使用し、これが適切に文書化され、競合がある場合は修正することは問題ありません。 この質問の詳細 および@ChipBennetによる回答。
  2. より良い解決策は、wp_validate_redirect()によって内部的に使用される wp_safe_redirect() を見て、WPというフィルターを活用することです_は、許可されたホストのリストを拡張することを提案します

    // End of `wp_validate_redirect()`
    $allowed_hosts = (array) apply_filters( 
        'allowed_redirect_hosts', 
        array( $wpp['Host'] ), 
        isset( $lp['Host'] ) ? $lp['Host'] : '' 
    );
    
    if ( 
        isset($lp['Host']) 
        && ( !in_array($lp['Host'], $allowed_hosts) 
        && $lp['Host'] != strtolower($wpp['Host'])) 
    )
        $location = $default;
    

    あなたの場合、そのリダイレクトを許可する(mu-)プラグインは次のようになります。

    <?php /* Plugin Name: Allow external login redirect */
    add_filter( 'allowed_redirect_hosts', function( Array $hosts, $check )
    {
        return $hosts + [ 'http://etomv2.bambergmarketing.com' ];
    }, 10, 2 );
    

    また、wp_safe_redirect( $target, $fallback )に使用されるwp_validate_redirect()内の2番目の引数を見てください。フィルタとして設定されます。つまり、ログインに失敗した場合に別の外部URlにリダイレクトできます。または、エラーページ(またはデフォルトの現在のページのみ)にローカルにリダイレクトできます。

    apply_filters( 'wp_safe_redirect_fallback', admin_url(), $status )
    

2番目のソリューションは、私が使用するものです。また、ユーザーを検証する必要がある外部OAuthプロバイダーを使用している場合に使用することもできます。

注意

ドキュメントを読んで、login_postが「スキーム」として不思議に思う場合:site_url()関数は、内部で get_site_url() を使用する set_url_scheme() のラッパーです。 login_postlogin、およびrpcadminと等しく、アクションを適切に調整します。

$scheme = is_ssl() || force_ssl_admin() ? 'https' : 'http';
1
kaiser