Fonction de redirection dans un Shortcode

14

Je développe un plugin gratuit pour connecter un système de support externe à WordPress pour pouvoir authentifier les utilisateurs sur WordPress.

Pour cela, actuellement depuis le système externe, l'utilisateur est envoyé à la page de connexion de WordPress avec ceci à la fin

?action=freshdesk-remote-login

Mon plugin vérifie ensuite si l'utilisateur est connecté à WP, sinon il affiche le formulaire de connexion et après une connexion réussie, il les redirige vers le site tiers.

La redirection se fait en utilisant quelque chose comme ceci: wp_redirect( $sso_url );

Maintenant, cela fonctionne bien, mais je prévois d'offrir un shortcode qui pourrait être ajouté à une page que l'utilisateur choisit. Désormais, lorsqu'un utilisateur accède à cette page, s'il est connecté, il doit être redirigé vers le site tiers, sinon, puis vers la page de connexion.

Existe-t-il un moyen de suggérer à wp_redirect de fonctionner dans un shortcode?

Harish Chouhan
la source

Réponses:

21

Comme l'explique @Rarst, les shortcodes s'exécutent normalement trop tard pour que vous puissiez rediriger de l'intérieur. Ils fonctionnent généralement sur le the_contentcrochet, ce qui est bien après l'envoi du contenu au navigateur. Si vous devez rediriger en fonction de la présence d'un shortcode, vous devez vérifier ce shortcode avant que tout contenu ne quitte le serveur.

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);

C'est une "preuve de concept". Les conditions particulières dont vous avez besoin seront probablement différentes. Notez que c'est un traitement assez "lourd". Je m'assurerais qu'il ne fonctionne que là où c'est absolument nécessaire.

s_ha_dum
la source
Merci une tonne. C'est tout simplement parfait et exactement ce que je cherchais.
Harish Chouhan
Bonjour, j'ai ajouté quelques vérifications pour m'assurer que ce code ne s'exécute que sur une page spécifique, mais j'ai remarqué que placer wp_redirect à l'intérieur d'un shortcode fonctionne également très bien. J'ai essayé avec javascript et aussi avec wp_redirect( $sso_url );et ça a juste fonctionné.
Harish Chouhan
1
wp_redirectne fonctionne pas dans un shortcode dans des conditions normales. Je viens de vérifier. Si cela fonctionne pour vous, votre thème ou un plugin fait quelque chose de similaire à ce que j'ai suggéré pour le faire fonctionner.
s_ha_dum
Oui, tu as raison. Désolé de perdre votre temps. J'ai eu plusieurs instances de votre code. Je suis de retour à utiliser votre code ci-dessus :)
Harish Chouhan
5

wp_redirect()effectue la redirection via les en-têtes HTTP, donc techniquement, cela ne fonctionnera pas (ou du moins ne devrait pas) fonctionner après le début de la sortie de la page. Vous ne pouvez donc pas simplement utiliser cette fonction en shortcode.

Ce qui ne signifie pas cependant que vous ne pouvez pas utiliser de shortcode pour le contrôler. Vous pouvez vérifier les conditions d'ajustement (si la page et la page contiennent un shortcode) avant le début de la sortie (quelque part autour du template_redirectcrochet) et effectuer ensuite la redirection.

Une autre option serait de produire du JavaScript conditionnel qui effectuera une redirection après le chargement de la page.

Rarst
la source
Bonjour, j'ai trouvé ceci: `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'); `Ici, il semble que wp_redirect soit placé dans un shortcode.
Harish Chouhan
@HarishChouhan où voyez-vous wp_redirect()dans ce code?
Rarst
Bonjour, je suis désolé que vous ayez raison. Dans l'exemple de code, il enregistre simplement l'URL et ne redirige pas réellement. Donc, selon vous, la redirection basée sur JavaScript semble être ma seule option?
Harish Chouhan