web-dev-qa-db-fra.com

Comment puis-je mettre un wp_redirect dans un shortcode?

J'ai un shortcode typique qui imprime du HTML sur une page. Le shortcode ne sera utilisé que sur les pages où les visiteurs sont connectés.

En tant qu'opération distincte, j'utilise un champ personnalisé pour déclencher une action qui effectue ce test, puis effectue la redirection.

Mais je me demandais s'il était possible de combiner cette action dans le shortcode et de se débarrasser du champ personnalisé.

IOW: Puis-je créer le code d’impression shortcode dans une balise de l’en-tête qui vérifie si le visiteur est connecté et, dans le cas contraire, il les redirige vers la page d’accueil.

Par exemple.

function jchForm() { 
  add_action( 'no idea where this would go', 'my_redirect_function' );

  $s ='<div class="clearboth">';
  $s .='<form id="my_form" action="" method="post">';
  $s .='<p><label>Your Name</label><input id="user_name" type="text"     name="user_name" class="text" value="" /></p>';
  $s .='<p><label>Your Email Address</label><input id="user_email" type="text" name="user_email" class="text" value="" /></p>';
  $s .='<p><input type="submit" id="my_submit" name="submit"     value="Register" /></p>';
  $s .='</form>';
 $s .='</div>';

return $s;

}

UPDATE: J'ai essayé ceci, selon la référence de la fonction has_shortcode (), mais bien que cela se déclenche, $ post renvoie toujours NULL. Comment puis-je obtenir ceci pour imprimer - avant tout autre code HTML, mais -après - la requête récupère $ post?

function custom_shortcode_script() {
global $post;
if( is_user_logged_in() && has_shortcode( $post->post_content, 'jchForm') ) {
  var_dump($post->post_content); // always prints NULL
    wp_redirect( '/someplace');
  }
}

 add_action( 'init', 'custom_shortcode_script' );  
5
jchwebdev

Les fonctions de code court ne sont appelées que lorsque le contenu de l'éditeur visuel est traité et affiché, de sorte que rien dans votre fonction de code court ne sera exécuté suffisamment tôt.

Regardez la fonction has_shortcode. Si vous vous connectez suffisamment tôt pour envoyer des en-têtes et assez tard pour que la requête soit configurée, vous pouvez vérifier si le contenu contient votre code court et rediriger ensuite. Le hook template_redirect est pratique pour cela car il s’agit du dernier hook appelé avant que votre thème n’envoie une sortie au navigateur, ce qui déclenche PHP pour envoyer les en-têtes.

11

pas une wp_redirect(), mais vous pouvez faire une redirection JavaScript:

window.location="http://www.example.com";

ne fera rien si l'utilisateur a JS désactivé, alors assurez-vous de fournir un lien pour la redirection.

1
Caleb