wake-up-neo.com

Benutzerdefiniertes Anmeldeformular, um auf eine externe Site umzuleiten

Ich habe eine private Seite erstellt, aber diese Seite muss mehr als nur verfügbar sein, indem Sie einen Code für eine Seite eingeben, die in den Veröffentlichungseinstellungen von Visibility als privat aufgeführt wurde. Daher habe ich eine Seite erstellt und eine zu überprüfende if/else-Anweisung hinzugefügt ob der Benutzer angemeldet ist oder nicht. Wenn dies der Fall ist, wird der Inhalt so angezeigt, wie er sollte. Wenn dies nicht der Fall ist, wird das Anmeldeformular angezeigt und der Benutzer wird aufgefordert, sich anzumelden. Dies wird so angezeigt, wie es sollte.

Das Problem ist, dass sie nach der Anmeldung über das Formular auf die Admin-Seite umgeleitet werden. Ich habe der Anmeldeseite eine Umleitung hinzugefügt, um zur gewünschten Seite zu gelangen, aber sie scheint nicht zu funktionieren. Mache ich die Weiterleitung falsch?

<?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

Interne Ereignisse erklärt

Wenn Sie sich wp_login_form() ansehen, werden Sie feststellen, dass das Argument redirect nach einer absoluten URl fragt. Verwenden Sie also entweder admin_url() oder site_url(), wenn Sie intern verknüpfen möchten.

Die action/das Ziel dieses Formulars darf nicht geändert werden (es sei denn, Sie setzen echo auf FALSE und verwenden einen \DOMDocument-Ersatz oder einen Regex, um ihn in der Ausgabezeichenfolge zu ändern):

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

Wenn Sie sich dann wp_login.php UND DEN case : 'login' | default ansehen, werden Sie zwei Dinge bemerken:

  1. Es gibt einen Filter zum Anpassen der Umleitung, wodurch möglicherweise alle in Ihren Argumenten festgelegten Einstellungen außer Kraft gesetzt werden. Beachten Sie, dass dies je nach Benutzer, der die Anmeldeaktion ausführt, möglicherweise sogar umschaltet (normalerweise verwendet, um Benutzer mit unterschiedlichen Rollen zu verschiedenen Begrüßungsbildschirmen umzuleiten):

    apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );
    
  2. Dann wird der Benutzer überprüft, ob es sich um ein authentifiziertes und kein fehlerhaftes Objekt handelt. In Abhängigkeit davon wird die folgende Funktion aufgerufen, wenn die Anforderung nicht an die Seite /wp-admin gerichtet ist:

    exit( wp_safe_redirect( $target ) );
    

... und die Verwendung von wp_safe_redirect() bedeutet, dass Sie nicht außerhalb verlinken können (siehe @TheDeadMedic-Kommentar - danke!).

Lösungen

Wie in WordPress üblich, haben Sie folgende Möglichkeiten:

  1. Diese Funktion befindet sich in pluggable.php , was bedeutet, dass Sie sie durch Ihre eigene Funktion ersetzen können. Dies ist nicht sehr stabil (jedes andere Plugin kann dasselbe tun), aber es ist in Ordnung, wenn Sie es auf Ihrer persönlichen Website verwenden, dies dokumentieren und Dinge beheben, wenn ein Konflikt vorliegt. Mehr Infos in dieser Frage und die Antwort von @ChipBennet drauf.
  2. Die bessere Lösung ist, sich wp_validate_redirect() anzusehen, das intern von wp_safe_redirect() verwendet wird, und den von WP angebotenen Filter zu nutzen, um die Liste der zulässigen Hosts zu erweitern .

    // 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;
    

    In Ihrem Fall würde ein (Mu-) Plugin, um diese Weiterleitung zu ermöglichen, folgendermaßen aussehen:

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

    Schauen Sie sich auch das zweite Argument in wp_safe_redirect( $target, $fallback ) an, das für wp_validate_redirect() verwendet wird. Es ist als Filter eingestellt. Das bedeutet, dass Sie zu einer anderen externen URL umleiten können, falls Ihre Anmeldung fehlschlägt. Oder Sie können lokal auf eine Fehlerseite umleiten (oder nur auf die aktuelle Seite, die die Standardeinstellung ist):

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

Die zweite Lösung würde ich verwenden. Sie können es auch verwenden, wenn Sie einen externen OAuth-Anbieter verwenden, anhand dessen Sie Benutzer validieren müssen.

Hinweis

Falls Sie die Dokumente lesen und sich dort über login_post als "Schema" wundern: Die Funktion site_url() ist ein Wrapper für get_site_url() , der set_url_scheme() intern verwendet. Dort sind login_post, login und rpc gleich admin, wodurch die Aktion korrekt angepasst wird:

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