web-dev-qa-db-fra.com

wp_redirect ne fonctionne pas dans l'en-tête, l'exit coupe la page

Désolé de poser une question aussi fondamentale, j'ai examiné d'autres questions sans trouver de réponse. J'ai personnalisé certaines pages publiques avec leur propre en-tête-public.php, et je fais une vérification de connexion de base pour toutes les autres pages dès le début de la page (ligne 1 dans header.php). Le but est de rediriger les utilisateurs non connectés vers une page de réception où ils peuvent obtenir de l'aide, se connecter, etc.

C'est juste que a) il ne redirige pas, et b) l'ajout de 'exit;' comme recommandé brise le reste de la page aussi. J'ai essayé de résumer cela dans une fonction de functions.php et qui a cassé functions.php, alors maintenant, Idunnowhatsgoingon.

Voici le code:

if (is_user_logged_in())
{
echo 'loggedin';
}
else
{
echo network_home_url( '/receptionist' );
wp_redirect( network_home_url( '/receptionist' ) );
exit;
}

Les vérifications de sécurité fonctionnent et l'écho de 'network_home_url' fonctionne également - je peux copier et coller l'URL dans et la page s'affiche correctement.

Quelqu'un aurait-il un conseil à ce sujet? Bien sûr, il me semble que cela devrait fonctionner: \

Edit: selon la réponse de Hansy et ma réponse, voici le code actuel. La sortie est commentée car elle casse la page, je la décommenterai lorsque la redirection fonctionnera.

if (is_user_logged_in()){
die(); // edit - don't do this per Hansy's response, I misread what it does. My bad.
}
else {
wp_redirect( network_home_url( '/receptionist' ) ); 
/* exit; */
}

J'ai également essayé: if (! Is_user_logged_in ()) {wp_redirect (network_home_url ('/ receptionist')); /* sortie; * /} puisque cela élimine autant que possible avant la redirection.

Je commence à penser qu'il y a quelque chose de bizarre avec le thème, depuis This Should Work.

Edit 2: Mon serveur dispose d’un package de sécurité et PHP Mode sans échec est activé. Y at-il quelque chose dans PHP config qui pourrait affecter cette fonctionnalité?

Edit 3: C'était le thème. Je suis revenu en 2011 et j'ai refait la configuration, et ça marche parfaitement. Au nom de Charles Babbage, comment le développeur du thème aurait-il pu casser une balise de modèle? N'enseignent-ils plus la séparation de la présentation, la logique et les données à l'école? Jeez. Voici le code qui a fonctionné, pour référence. Je vais aussi essayer la solution bien mise à jour de Hansy.

if (!is_user_logged_in() )
{
wp_redirect( network_home_url( '/receptionist' ) );
exit;
}
1
Dains

wp_redirect envoie un en-tête, donc faire écho quoi que ce soit avant que la redirection échoue. Donc, dans ce cas, vous pouvez supprimer echo network_home_url( '/receptionist' ); et s’il n’ya aucune sortie envoyée, cela fonctionnera parfaitement.

Mise à jour: Dans les deux cas, le problème est que vous effectuez une redirection infinie (redirection vers cette URL si elle n'est pas connectée), et commenter la sortie n'aide pas, même dans le premier cas, lorsque vous utilisez die (), vous tuez la page pour tous. les utilisateurs connectés, utilisez plutôt quelque chose comme ceci (vérification supplémentaire si nous sommes sur admin afin qu'un utilisateur puisse se connecter-enregistrer)

global $pagenow;
if ( !preg_match("!wp-admin!",$_SERVER["REQUEST_URI"] ) and !in_array( $pagenow, array( 'wp-login.php', 'wp-register.php' ) ) ){
    $scheme = is_ssl() && !is_admin() ? 'https' : 'http';
    $current_url=$scheme . '://'.$_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
    $network_url=network_home_url( '/receptionist' );
    if (!is_user_logged_in() and $current_url!=$network_url){ 
        wp_redirect( $network_url );  exit;  
    } 
}
2
hacksy