1. Herzlich willkommen bei WPDE.org, dem grössten und ältesten deutschsprachigen Community-Forum rund um das Thema WordPress. Du musst angemeldet oder registriert sein, um Beiträge verfassen zu können.
    Information ausblenden

Einzelne Seiten auf IP-Bereich beschränken

Dieses Thema im Forum "Plugins und Widgets" wurde erstellt von stefan_o, 15. Mai 2022.

  1. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    Hallo,
    ich bin auf der Suche nach einem Plug-In, bei dem ich einzelne Seiten (so eine Art interner Bereich) auf einen bestimmten IP-Bereich beschränke? Anfragen außerhalb des Bereichs sollten eine eigens erstelle Fehlerseite angezeigt bekommen (möglichst ohne Umleitung, sodass man nach Aktivierung einer entsprechenden VPN-Verbindung einfach F5 drücken kann).
    Ich finde viele Plug-Ins für Geo-Blocking, welche die ganze Seite gegen Zugriffe aus bestimmten Ländern etc. absichern, aber das möchte ich nicht, im Idealfall ist im Editor für Seiten einfach eine Auswahl Beschränkt ja/nein.
    Vielen Dank
    Stefan
     
  2. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    Da ich auf StackOverflow auch ähnliche Fragen ohne Antwort gefunden habe, habe ich mal schnell ein Plug-In gebastelt:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Es muss ein custom field angelegt werden mit dem Namen "ip_restricted", die Fehlerseite ist hier festgelegt auf 97. Die Idee ist, dass wenn ein Query nur ein Post zurück gibt, kommt die Fehlermeldung, ansonsten wird der Post rausgefiltert. Die Funktion ip_is_restricted() muss natürlich noch sinnvoll gefüllt werden.
    Auf den ersten Blick funktioniert es gut, aber ich kenne mich nicht so gut mit WordPress aus, gibt es Abfragen nach Posts die diesen Hook (und damit die Sperre) umgehen?
     
  3. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.634
    Zustimmungen:
    1.778
    Wenn eine Anfrage den Parameter suppress_filters auf true setzt, wird u.a. dieser Hook/Filter umgangen.

    Wir haben bei einem grob ähnlichen Projekt die template_redirect Action genutzt.
     
  4. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    Gibt es eine Möglichkeit solche Anfragen als Endnutzer zur erzeugen? Bestimmte Suchanfragen oder so?
     
  5. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.634
    Zustimmungen:
    1.778
    Der Inhalt der Anfragen kommt v.a. auch auf Theme/Plugins an. Beispielsweise get_posts() setzt diesen Parameter standardmässig auf true.

    Nutze für Deine Problemstellung besser eine allgemeingültigere Action wie pre_get_posts oder je nach Projekt auch template_redirect, grober Anhaltspunkt der Reihenfolge hier in der WordPress Dokumentation.

    Und Tests mit den üblichen Cache-Plugins, Feed-Ausgabe u.ä. nicht vergessen...

    Ergänzung: Ein alternativer Ansatz wäre die Nutzung bzw. Immitation der in WordPress integrierten Passwort pro Seite Funktion, in deren Filter Du dann Deine IP prüfst.
     
    #5 b3317133, 15. Mai 2022
    Zuletzt bearbeitet: 15. Mai 2022
  6. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    pre_get_posts verstehe ich nicht: In der $query-Variable die ich bekomme ist die Abfrage drin, aber auch schon das Ergebnis ("queried_object")? Bedeutet wenn ich die Abfrage ändere passiert gar nichts. Könnte aber auch sein, dass für eine Seite dieser Hook nicht genutzt wird und die Seite noch als Ergebnis der letzten Abfrage da drin ist...

    Bei post_password_required kann ich zwar sagen, dass ein Passwort gebraucht wird, aber nicht den Post ändern. Bei template_redirect kann ich umleiten, ebenfalls nicht den Post ändern.

    Schade das es so ein Plug-In noch nicht gibt. Gibt es einen Hook, den *jede* Query durchläuft bevor sie ausgeführt wird?
     
  7. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.634
    Zustimmungen:
    1.778
    In pre_get_posts ist das Query noch nicht ausgeführt, siehe Dokumentation. Somit kannst Du es anpassen oder aber auch wie in template_redirect vor jeglicher Ausgabe je nach IP reagieren und ausgeben was Du möchtest.

    Bei der WordPress Passwort pro Seite Funktion kannst Du den Inhalt der "Passwort gebraucht" Ausgabe beliebig anpassen, siehe "Customize the Protected Text" in der bereits oben verlinkten Dokumentation.
     
  8. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    So habe ich pre_get_posts auch verstanden, aber die Realität passt nicht zur Dokumentation. Warum gibt es bereits ein "queried_object" indem die ganze Seite drin ist bevor der Query ausgeführt wird? Ich habe einfach mal mit print_r $query ausgegeben, bereits in der ersten Ausgabe ist das "queried_object" drin, was den ganzen Seiteninhalt enthält.

    Ich wollte diese Passwort-Schutz-Funktion eigentlich ungern kaputt machen, auch wenn sie vermutlich nie gebraucht wird, aber wenn sie dann nicht mehr funktioniert ist das doof.
     
  9. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.634
    Zustimmungen:
    1.778
    Beschäftige Dich noch etwas mehr mit pre_get_posts, probiere Dinge aus usw., dann ergeben sich daraus alle nötigen Möglichkeiten.

    Und man macht eine Funktion nie kaputt sondern reagiert nur bei Bedarf, z.B. wenn Dein Custom Field vorhanden ist, oder ein Passwort in speziellem Format o.ä.

    Kurz runtergetippter Ansatz via WordPress Passwort pro Seite Funktion, setze als Passwort der Seite z.B. IP:123.123.123.123
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
     
  10. stefan_o

    stefan_o Active Member

    Registriert seit:
    6. Mai 2022
    Beiträge:
    25
    Zustimmungen:
    3
    Es scheint wohl normal zu sein, dass die Abfrage doppelt ist und das erste Ergebnis schon da, habe es jetzt so geändert bekommen, dass er die gesperrten Seiten filtert, Problem dabei: Ich zeige jetzt nicht meine Gesperrt-Seite, sondern ich bekomme ein 404. Korrekterweise müsste ich prüfen wenn ohne meine Beschränkung ein Ergebnis vorläge, und mit meiner Beschränkung nicht, dann schreibe den Query so um, dass die Beschränkung kommt.
    Damit würde der Query wiederholt ausgeführt werden, das ist ziemlich unschön, oder die Abfrage müsste entsprechend komplex werden, in etwa so:
    query IF gesperrt=FALSE JOIN (gesperrt-seiten-query IF COUNT(query IF gesperrt = TRUE)==1 AND COUNT(query IF gesperrt = FALSE)==0)
    Ich weiß nicht ob das machbar ist mit einem Wordpress-Query.
    Gibt es ein hook/filter der zuverlässig aufgerufen wenn eine Page als main_query aufgerufen wird? Dann würde ich für den Fall den Query bei pre_get_posts nicht ändern, sondern dass dann einem anderen hook überlassen die Gesperrt-Seite anzuzeigen.
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden