Permalinks schützen in WordPress

thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
Moin, Moin,

ich habe auf einer Website einige Seiten, die in einem Mitgliederbereich geschützt sind. Nur angemeldete Mitglieder können diese Seiten sehen.

Dummerweise sind die Permalinks der Seiten jedoch nicht geschützt. Gibt es eine Möglichkeit, bei einem nicht angemeldeten Besucher, der mit einem solchen Permalink auf die Seiten kommen will, mit PHP eine Weiterleitung zu einer Seite einzurichten, auf der ihm mitgeteilt wird, er müsse sich zuerst anmelden, um die Seiten zu sehen?
 
Difool

Difool

Frontend Admin
Dabei seit
18.03.2004
Beiträge
17.135
Punkte Reaktionen
12.621
Entweder kannst du seperate Zuweisungen via template_redirect in deiner functions.php setzen:

PHP:
// redirect non logged in user
add_action( 'template_redirect', function() {

  if ( is_user_logged_in() || ! is_page() ) return;

  $restricted = array( 250, 253 ); // all your restricted pages

  if ( in_array( get_queried_object_id(), $restricted ) ) {
    wp_redirect( site_url( '/user-registration' ) );
    exit();
  }

});

Im $restricted-Array setzt du die jeweiligen Page-IDs der umzuleitenden Seiten.
Beim wp_redirect den URL zur Registration bzw. Login-Page etc.

… oder ein Plugin nutzen: https://de.wordpress.org/plugins/redirection/
 
thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
Ich würde gerne das Plugin verwenden, habe es installiert und es scheint auch für diesen Zeck gut zu verwenden zu sein. Problem ist ja nur, dass nur unangemeldete Besucher diese Weiterleitung bekommen sollen, angemeldete Besucher jedoch nicht. Und eine solche Einstellung finde ich in dem Plugin nicht.

Dann werde ich Deinen Code ausprobieren. Kann ich so etwas auch in ein Plugin wie Code Snippet einfügen oder muss er in die functions.php?

Folgendes Problem gibt es hierbei aber noch. Ein Permalink ist die Seite events des Plugins The Events Calendar. Diese wird anscheinend automatisch vom Plugin erzeugt und zeigt eine Übersicht aller veröffentlichten Veranstaltungen. Diese Seite existiert aber anscheinend nicht. Ich habe sie unter „Seiten“ nicht erstellt und finde sie auch nicht an anderer Stelle oder in den Einstellungen des Plugins. Dennoch wird sie aufgerufen und der Permalink ist vorhanden. Hat diese Seite denn dann auch eine ID? Oder wo könnte ich diese Seite finden?
 
Difool

Difool

Frontend Admin
Dabei seit
18.03.2004
Beiträge
17.135
Punkte Reaktionen
12.621
Ich würde gerne das Plugin verwenden, habe es installiert und es scheint auch für diesen Zeck gut zu verwenden zu sein. Problem ist ja nur, dass nur unangemeldete Besucher diese Weiterleitung bekommen sollen, angemeldete Besucher jedoch nicht. Und eine solche Einstellung finde ich in dem Plugin nicht.
Da müsstest du dich durch die Optionen des Plugins suchen.
Oder verwende das Script für die functions.php.

Dann werde ich Deinen Code ausprobieren. Kann ich so etwas auch in ein Plugin wie Code Snippet einfügen oder muss er in die functions.php?
Ich kenne "Code Snippet" nicht und weiß daher nicht wann die Scripte dadurch wo und wie geladen werden.
Die functions.php in einem Child-Theme ist aber direkt und zuverlässig und wird zuerst geladen.
edit:
Bedenke aber, dass Fehler in Scripten in der functions.php die ganze Website "temporär abschiessen" können –
daher mache so etwas lieber nicht in der online öffentlich laufenden Website, sondern auf einer Staging-Plattform bzw. Test-Website.

Folgendes Problem gibt es hierbei aber noch. Ein Permalink ist die Seite events des Plugins The Events Calendar. Diese wird anscheinend automatisch vom Plugin erzeugt und zeigt eine Übersicht aller veröffentlichten Veranstaltungen. Diese Seite existiert aber anscheinend nicht. Ich habe sie unter „Seiten“ nicht erstellt und finde sie auch nicht an anderer Stelle oder in den Einstellungen des Plugins. Dennoch wird sie aufgerufen und der Permalink ist vorhanden. Hat diese Seite denn dann auch eine ID? Oder wo könnte ich diese Seite finden?
Es ist eine "archive-page" – die wird nicht angelegt, die existiert durch Wordpress oder dem benutzten Theme.
Siehe auch: https://theeventscalendar.com/knowledgebase/k/finding-your-calendar-on-the-front-end/

Möglicherweise kannst du deren "slug" verwenden. (siehe auch den Link zur Doku)
Man kann bsw. die page-IDs oder die page-slugs verwenden.
 
Zuletzt bearbeitet:
thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
Ich habe jetzt Deinen Code verwendet und den Slug /event und als Ziel-URL alternativ die Domain oder die Startseite. Und habe den Code ebenfalls alternativ in Code Snippet oder in der function.php eingesetzt. Er funktioniert nicht. Gebe ich die URL mit dem Slug /events in den Browser ein, gelange ich dennoch zu der Veranstaltungsübersicht.

Ich muss aber erwähnen, dass mir mit einem selbst entwickelten PHP-Code in Code Snippets und der functions.php auch keine Weiterleitung gelungen ist. Wo liegt der Fehler?
 
Difool

Difool

Frontend Admin
Dabei seit
18.03.2004
Beiträge
17.135
Punkte Reaktionen
12.621
Zeige mal bitte dein Script; sonst kann man nur raten, was du da geschrieben hast.

Und du müsstest das Redirect-Script oben in die functions.php setzen, nicht nach unten.
Es kann auch sein, dass du diesen php-redirect in die header.php deines Templates / Themes setzen musst –
wegen der Ladereihenfolge /-priorität o.ä.
Je nachdem was, wann, wo bei der Website geladen wird.
 
Difool

Difool

Frontend Admin
Dabei seit
18.03.2004
Beiträge
17.135
Punkte Reaktionen
12.621
Ich habe jetzt Deinen Code verwendet und den Slug /event und als Ziel-URL alternativ die Domain oder die Startseite. Und habe den Code ebenfalls alternativ in Code Snippet oder in der function.php eingesetzt. Er funktioniert nicht. Gebe ich die URL mit dem Slug /events in den Browser ein, gelange ich dennoch zu der Veranstaltungsübersicht.
Wenn es "nur" diese eine Seite ist – ich ging davon aus, daß "events" auch Unterseiten hat, also events/event-name/ usw. –
dann könnte folgendes auch für die functions.php ausreichen:

PHP:
function redirect_login_page() {
    if ( ! is_user_logged_in() && is_page( 'events' ) ) {
        wp_redirect( home_url( '/wp-login.php' ), 302 );
        exit;
    }
}
add_action( 'template_redirect', 'redirect_login_page' );

Wenn der User nicht ! eingeloggt ist > if ( ! is_user_logged_in()
…und es ist die Seite "events" > && is_page( 'events' )
… dann führe den User zum Beispiel zur Anmeldeseite > wp_redirect( home_url('/wp-login.php')
 
thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
Wenn es "nur" diese eine Seite ist – ich ging davon aus, daß "events" auch Unterseiten hat, also events/event-name/ usw. – (…)
Du hast richtig vermutet. Die Seite events hat zwar keine Unterseiten, aber jede Veranstaltung, die ich im Events Calendar als eigene Seite anlege, wird von der Übersichtsseite events (alle Veranstaltungen) zu den einzelnen Veranstaltungen auf event/einzelneveranstaltung_1 usw. (event ohne s, Details zur Veranstaltung) verwiesen. Und diese Seiten sollen auch geschützt sein.
 
thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
PHP:
// redirect non logged in user
add_action( 'template_redirect', function() {

  if ( is_user_logged_in() || ! is_page() ) return;

  $restricted = array( '/events' ); // all your restricted pages

  if ( in_array( get_queried_object_id(), $restricted ) ) {
    wp_redirect( site_url( '/wer-wir-sind' ) );
    exit();
  }

});

Die Startseite heißt /wer-wir-sind, alternativ mit der url /meinedomain.de funktioniert das Script auch nicht
 
thobie

thobie

Mitglied
Thread Starter
Dabei seit
23.04.2006
Beiträge
639
Punkte Reaktionen
115
Ich denke, ich habe das Problem anders gelöst. Im Forum des Plugins für den Mitgliederbereich wurden mir zwei Addons empfohlen. Eines mit Full Page Protection und eines mit Customer Messages. Das erstere lässt angemeldete Mitglieder auf die Veranstaltungsseiten, blockiert jedoch die Permalinks eines anonymen Besuchers der Website. Und mit dem zweiten kann ich die Fehlermeldung dabei anpassen. Aber dennoch Danke für Eure Hilfe.
 
Difool

Difool

Frontend Admin
Dabei seit
18.03.2004
Beiträge
17.135
Punkte Reaktionen
12.621
Ok, das ist sonst auch ziemlich tricky, weil das Event-Calendar-Plugin halt keine Page-IDs liefert, da durch "views" generiert wird.
Alternativ müsste man probieren via "post_type" abzufragen oder sowas.

Ansonsten wäre das Snippet für einen redirect einer parent page und deren child_pages so:

PHP:
//redirect parent and child pages
add_action( 'template_redirect', 'difools_not_logged_in_childpages_redirect' );

function difools_not_logged_in_childpages_redirect()
{
  global $post;
  $page_id = '12';

  if (
      ( $post->post_parent == $page_id || is_page( $page_id ) ) && ( ! is_user_logged_in() )
     )
  {
    wp_safe_redirect( site_url('/some-other-page-slug') );
    exit;
  }
}

Aber dennoch Danke für Eure Hilfe.
Kein Problem – das Snippet kann ich jetzt ja selbst gut gebrauchen. :teeth:
 

Ähnliche Themen

Oben