Scénario: si l'utilisateur ne se connecte pas, redirige l'utilisateur pour personnaliser la page de connexion, puis redirige vers la page de destination après la connexion. Je n'utilise pas de fonction ou plugin. Ce code à la page de restriction:
if (!is_user_logged_in()){ wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]) );
}
avec succès pour la connexion de l'utilisateur, mais dans la page de connexion, l'URL devient? page = login et ne peut pas rediriger l'URL vers la page de destination Comment le faire? Quelqu'un pourrait aider, s'il vous plaît?
J'ai fait quelque chose de similaire récemment.
1. Si l'utilisateur n'est pas connecté, j'ai capturé l'URL de la page souhaitée/de destination et l'a ajouté sous la forme d'un argument de requête à l'URL de la page de connexion.
2. Redirige l'utilisateur vers la page de connexion.
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' );
3. Vous pouvez ensuite filtrer l'URL vers laquelle l'utilisateur est redirigé après la connexion, à l'aide du filtre login_redirect
. Il suffit de vérifier la présence de votre requête var précédemment ajoutée:
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');
J'ai fait cela avec une page de connexion WooCommerce, donc je filtrais leur filtre de redirection de connexion propriétaire, mais login_redirect
est la version par défaut WP de sorte que je pense cela devrait fonctionner pas testé.
Votre extrait devrait fonctionner correctement.
Tout d'abord, votre formulaire de connexion personnalisé peut ne pas respecter redirect_to
. wp-login.php
le fait, mais vous devrez également envoyer l'argument redirect_to
à la soumission du formulaire wp-login.php
. Montrez le code de votre formulaire de connexion.
Vous devez faire attention à la façon dont vous utilisez wp_redirect
. Cela fonctionne en envoyant des en-têtes:
<?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);
}
Donc, si des parties de vos pages ont déjà été chargées et que vous n'utilisez pas la mise en mémoire tampon de sortie , cela ne fonctionnera pas. Headers already sent
et toutes ces affaires.
Si tel est le cas, vous feriez mieux de simplement afficher un message avec un lien vers le formulaire de connexion ou d'afficher le formulaire lui-même (par exemple. wp_login_form
).
Deuxièmement, vous devez toujours appeler exit
ou die
après avoir utilisé wp_redirect
pour exécuter le script PHP (par exemple, WordPress), envoyer des en-têtes et des mises à jour. Sinon, des éléments plus bas sur la page risquent de tuer vos en-têtes de redirection.
<?php
wp_redirect(site_url('wp-login.php'));
exit;
Enfin, si vous souhaitez inclure l'hôte dans votre URL redirect_to
, vous devez inclure le protocole.
Vous pouvez aussi simplement utiliser $_SERVER['REQUEST_URI']
.
<?php
$url = add_query_arg('redirect_to', $_SERVER['REQUEST_URI'], site_url('wp-login.php'));
wp_redirect($url);
exit;
Remarque: wp_redirect ne sera pas appelé si la page a démarré. Assurez-vous de l'appeler plus haut.
<?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