Umleitungsfunktion innerhalb eines Shortcodes

13

Ich entwickle ein kostenloses Plugin für die Anbindung eines externen Support-Systems an WordPress, um Benutzer bei WordPress authentifizieren zu können.

Hierzu wird der Benutzer aktuell vom externen System mit diesem am Ende auf die Anmeldeseite von WordPress weitergeleitet

?action=freshdesk-remote-login

Mein Plugin prüft dann, ob der Benutzer bei WP angemeldet ist, zeigt das Anmeldeformular nicht an und leitet ihn nach erfolgreicher Anmeldung zurück zur Site eines Drittanbieters.

Die Weiterleitung erfolgt in etwa so: wp_redirect( $sso_url );

Das funktioniert jetzt gut, aber ich plane, einen Shortcode anzubieten, der zu einer Seite hinzugefügt werden kann, die der Benutzer auswählt. Sobald ein Benutzer diese Seite besucht und angemeldet ist, sollte er an die Site eines Drittanbieters weitergeleitet werden, andernfalls an die Anmeldeseite.

Gibt es eine Möglichkeit, wp_redirect vorzuschlagen, um in einem Shortcode zu arbeiten?

Harish Chouhan
quelle

Antworten:

21

Wie @Rarst erklärt, werden Shortcodes normalerweise zu spät ausgeführt, als dass Sie sie von innen umleiten könnten. Sie werden normalerweise auf dem the_contentHook ausgeführt, der sich lange nach dem Senden von Inhalten an den Browser befindet. Wenn Sie basierend auf dem Vorhandensein eines Shortcodes umleiten müssen, müssen Sie diesen Shortcode überprüfen, bevor Inhalte den Server verlassen.

function pre_process_shortcode() {
  if (!is_singular()) return;
  global $post;
  if (!empty($post->post_content)) {
    $regex = get_shortcode_regex();
    preg_match_all('/'.$regex.'/',$post->post_content,$matches);
    if (!empty($matches[2]) && in_array('yourshortcodeslug',$matches[2]) && is_user_logged_in()) {
      // redirect to third party site
    } else {
      // login form or redirect to login page
    }
  }
}
add_action('template_redirect','pre_process_shortcode',1);

Das ist "Proof of Concept". Die besonderen Bedingungen, die Sie benötigen, sind wahrscheinlich unterschiedlich. Beachten Sie, dass dies eine ziemlich "schwere" Verarbeitung ist. Ich würde dafür sorgen, dass es nur dort läuft, wo es unbedingt nötig ist.

s_ha_dum
quelle
Danke eine Tonne. Das ist einfach perfekt und genau das, wonach ich gesucht habe.
Harish Chouhan
Hallo, ich habe einige Überprüfungen hinzugefügt, um sicherzustellen, dass dieser Code nur auf einer bestimmten Seite ausgeführt wird. Mir ist jedoch aufgefallen, dass das Platzieren von wp_redirect in einem Shortcode ebenfalls problemlos funktioniert. Ich habe es mit Javascript und auch mit versucht wp_redirect( $sso_url );und es hat einfach funktioniert.
Harish Chouhan
1
wp_redirectfunktioniert unter normalen Bedingungen nicht in einem Shortcode. Ich habe gerade nachgesehen. Wenn es für dich funktioniert, macht dein Theme oder ein Plugin so ziemlich das, was ich vorgeschlagen habe, damit es funktioniert.
s_ha_dum
Ja, du hast recht. Entschuldige, dass du deine Zeit verschwendest. Ich hatte mehrere Instanzen Ihres Codes. Ich bin wieder mit Ihrem obigen Code :)
Harish Chouhan
5

wp_redirect()führt eine Umleitung über HTTP-Header durch, sodass sie technisch gesehen nach dem Start der Seitenausgabe nicht mehr funktioniert (oder zumindest nicht funktionieren sollte). Sie können diese Funktion also nicht nur in Shortcodes verwenden.

Dies bedeutet jedoch nicht, dass Sie den Shortcode nicht zur Steuerung verwenden können. Sie können vor dem Start der Ausgabe (irgendwo in der Nähe des template_redirectHakens) die Anpassungsbedingungen überprüfen (ob Seite und Seite einen Shortcode enthalten ) und dann eine Umleitung durchführen.

Eine andere Möglichkeit wäre, bedingtes JavaScript auszugeben, das nach dem Laden der Seite eine Umleitung durchführt.

Rarst
quelle
Hallo, ich habe folgendes gefunden: `function pippin_login_form_shortcode ($ atts, $ content = null) {extract (shortcode_atts (array ('redirect' => ''), $ atts)); if (! is_user_logged_in ()) {if ($ redirect) {$ redirect_url = $ redirect; } else {$ redirect_url = get_permalink (); } $ form = wp_login_form (array ('echo' => false, 'redirect' => $ redirect_url)); } return $ form; } add_shortcode ('loginform', 'pippin_login_form_shortcode'); `Hier scheint der wp_redirect in einem Shortcode zu stehen.
Harish Chouhan
@ HarishChouhan wo siehst du wp_redirect()in diesem Code?
Rarst
Hallo tut mir leid du hast recht Im Beispielcode wird nur die URL gespeichert und nicht weitergeleitet. Aus Ihrer Sicht ist die JavaScript-basierte Weiterleitung meine einzige Option?
Harish Chouhan