! is_admin () Bedingung wird in den Admin-Seiten wahr

Ich muss Benutzer redirect, um einzuloggen, wenn nicht protokolliert und sobald sie sind, redirect sie an Backend, wenn sie versuchen, Front-End-Seiten zu sehen. Das ist mein Code:

add_action( 'template_redirect', function () { if(is_user_logged_in() ): bk1_debug('logged in'); if (!is_admin()): bk1_debug('not in admin, redirecting...'); wp_redirect(admin_url()); endif; else: bk1_debug('not logged in, redirecting...'); wp_redirect(wp_login_url( admin_url() )); endif; }, 10 ); 

Natürlich funktioniert es nicht … Aus irgendeinem Grund wird ‘nicht im Admin, Weiterleiten …’ auch im Backend genannt, und noch besser, im Frontend passiert gar nichts! Nur Weiterleiten für nicht eingeloggten Benutzer geht.

Irgendeine Idee?

Solutions Collecting From Web of "! is_admin () Bedingung wird in den Admin-Seiten wahr"

Umleiten nicht angemeldeter Benutzer ist das einzige, was funktioniert 🙂 im Backend.

Was Sie beschreiben, ist sehr eigenartig. template_redirect ist ein Front-End- Hook. Dein Code wird niemals im Backend laufen, soweit ich das beurteilen kann. Das kannst du mit dieser Zeile demonstrieren:

add_action('template_redirect',function() {die;});

Du kannst das Backend ganz durchqueren, aber versuche nach vorne zu kommen und du bekommst nichts. Ich glaube wirklich, dass Sie die Analyse rückwärts haben. Ihr Code sollte niemals im Backend ausgeführt werden.

Ich lege ab die; an der Spitze Ihrer function und erhalten Sie die gleichen Ergebnisse. Es wird nicht im Backend ausgeführt.

Was Sie wahrscheinlich sehen, sind “nicht eingeloggte” Benutzer, die zum Frontend verschoben werden, zu welchem ​​Zeitpunkt dieser Code läuft.

Alles was ich denken kann ist, dass es eine andere Umleitung gibt, die die Illusion dieser Ausführung auf dem Back-End gibt.

Während ich diese Antwort zuerst schrieb, vermisste ich das Offensichtliche. Sie sollten einen “nicht eingeloggten” Benutzer nicht vom Backend zum Anmeldebildschirm redirect müssen. WordPress wird das automatisch tun – oder sollte etwas nicht unklug gemacht haben.

Alles was Sie wirklich brauchen sollten ist:

 add_action( 'template_redirect', function () { wp_redirect(admin_url()); } ,10 ); 

Das verhindert ziemlich vollständig den Zugriff auf das Frontend, was wie folgt klingt:

Ich muss Benutzer redirect, um einzuloggen, wenn nicht protokolliert und sobald sie sind, redirect sie an Backend, wenn sie versuchen, Front-End-Seiten zu sehen.

Willst du das wirklich?

Was deine function sagt:

Auf FRONT END machen Sie dies vor der Template-Anzeige:
wenn der Benutzer angemeldet ist:
Überprüfen Sie, ob Sie sich NICHT auf der Admin-Seite (Backend) befinden, wenn Sie nicht auf der Admin-Seite sind:
, gehe zu admin

wenn der Benutzer nicht eingeloggt ist:
Redirect zum Login egal was …

So können Sie selbst sehen, dass Ihr Ansatz einige Löcher haben 🙂 Auch wp_redirect() sagt:

wp_redirect () wird nicht automatisch beendet und sollte fast immer von exit beendet werden

Und du hast nicht, noch irgendjemand sonst hier …

LÖSUNG

Von dem, was du beschreibst, willst du überall etwas tun, egal was, dafür könntest du an 2 “wirklich” allgemeine Aktionen denken, die für diese Ausführung logisch wären:

init – verfügbar seit WordPress 1.5, immer noch aktuell in WordPress 4.5 , obwohl viele Plugins dabei sind, aber du add_action(...) mit add_action(...) ‘s Priorität auf 1 setzen …

set_current_user

Seit WordPress 2.0.1, immer noch aktuell in WordPress 4.5 ; Die Ärzte sagen dazu:

Wird ausgeführt, nachdem der Benutzer durch die Standardfunktion wp_set_current_user() geändert wurde. Beachten Sie, dass wp_set_current_user() auch eine “Pluggable” -function ist, was bedeutet, dass Plugins diese überschreiben können ( docs link )

Nach diesem Punkt können Sie alles bestimmen, was Sie wissen müssen:

  1. Ob ein Benutzer angemeldet ist oder nicht – is_user_logged_in()
  2. Ob Sie sich auf der Admin-Seite oder woanders befinden – is_admin()
  3. Ob deine aktuelle Seite wp-login.php oder nicht – $GLOBALS['pagenow'] == "wp-login.php"

DER CODE

 add_action( 'set_current_user', function(){ //"After user is set, do ..." //"If user IS logged in, but is NOT on any admin/backend page //=> redirect to admin url and !exit current execution!" if( is_user_logged_in() && ! is_admin() ){ wp_redirect(admin_url()); exit(); } //"If user is NOT logged in and we are NOT on (default) login page //=> redirect to login page !and exit current execution!" if( ! is_user_logged_in() && ($GLOBALS['pagenow'] != "wp-login.php") ){ wp_redirect(wp_login_url()); exit(); } } ); 

Getestet auf WordPress 4.5, funktioniert wie beschrieben auf Front & Back-End …

Den Vorschlägen von @s_ha_dum folgend, die angaben, dass der Benutzer trotzdem eingeloggt sein muss, um zum Backend zu gehen und dass ‘template_redirect’ nicht im Backend funktioniert (auch wenn mein Code Konsolenmeldungen nur im Backend ausgetriggers hat), vereinfache ich den Code als eine solche:

 add_action( 'template_redirect', function () { if(!is_admin()) wp_redirect(admin_url()); }, 10 ); 

Aber nichts hat sich geändert. Trotzdem gehe ich zum Frontend und nichts passiert. Ich habe es auch mit ‘init’ und nichts versucht.

Dann dachte ich, dass ich vielleicht ‘template_redirect’ im falschen Moment anrufe, also habe ich die beiden Hooks gemischt:

 add_action( 'init', function () { add_action( 'template_redirect', function(){ if(!is_admin()) wp_redirect(admin_url()); }, 10); }, 10 ); 

Und das hat endlich funktioniert !!!