web-dev-qa-db-fra.com

Comment générer une URL expirante?

J'ai un type de message personnalisé Portfolio et chaque portfolio est un questionnaire. Si j'envoie par courrier électronique le lien d'un portefeuille à un client.

Comment puis-je expirer le lien après 10 minutes? Ainsi, si le client est venu après 10 minutes pour visiter le lien, un message indiquant que le lien a expiré doit être envoyé. Veuillez réessayer.

Comment puis je faire ça?

5
File_Submit

Ok je suis venu avec ça

add_action( 'wp_loaded', 'my_create_questionnaire_link');
function my_create_questionnaire_link(){

  // this check is for demo, if you go to http://yoursite.demo/?create-my-link, you will get your unique url added to your content
  if( isset( $_GET['create-my-link'] ) ){

    // This filter is for demo purpose
    // You might want to create a button or a special page to generate your
    // unique URL
    add_filter( 'the_content', function( $content ){

      // This is the relevant part
      // This code will create a unique link containing valid period and a nonce

      $valid_period = 60 * 10; // 10 minutes
      $expiry = current_time( 'timestamp', 1 ) + $valid_period; // current_time( 'timestamp' ) for your blog local timestamp
      $url = site_url( '/path/to/your/portfolio/page' );
      $url = add_query_arg( 'valid', $expiry, $url ); // Adding the timestamp to the url with the "valid" arg
      $nonce_url = wp_nonce_url( $url, 'questionnaire_link_uid_' . $expiry, 'questionnaire' );  // Adding our nonce to the url with a unique id made from the expiry timestamp

      // End of relevant part
      // now here I return my nounce to the content of the post for demo purposed
      // You would use this code when a button is pressed or when a special page is visited

      $content .= $nonce_url;

      return $content;
    } );
  }

}

C’est ici que vous devez vérifier la validité de l’URL unique.

add_action( 'template_redirect', 'my_url_check' );
function my_url_check(){

  if( isset( $_GET['questionnaire'] )){

    // if the nonce fails, redirect to homepage
    if( ! wp_verify_nonce( $_GET['questionnaire'], 'questionnaire_link_uid_' . $_GET['valid'] ) ){
      wp_safe_redirect( site_url() );
      exit;
  }

    // if timestamp is not valid, redirect to homepage
    if( $_GET['valid'] < current_time( 'timestamp', 1) ){
      wp_safe_redirect( site_url() );
      exit;
    }

    // Show your content as normal if all verification passes.
  }
}
4
bynicolas

Vous pouvez ajouter une requête personnalisée var avec l'horodatage.

eg. example.com/portfolio?exp=12345678

Ensuite, lorsqu'un utilisateur atterrit sur cette URL, vous pouvez vérifier l'heure actuelle par rapport à l'horodatage. Si 10 minutes se sont écoulées/ou non, vous pourrez afficher différents éléments sur la page.

Vous pouvez même stocker un certain horodatage pour savoir quel client a quel formulaire/quel horodatage.

UPDATE

Comme l'a noté bynicolas , techniquement, le client peut générer un horodatage de l'heure actuelle et accéder à nouveau au lien.

Vous pouvez donc envisager de sauvegarder cet horodatage en tant que transitoire pendant 10 min.

Maintenant, lorsque le client visite l'URL, vous devez vérifier si ce transitoire avec l'horodatage a expiré .

Juste une idée.

1
The J

Voici une idée: Accrocher l'action template_redirect:

https://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect

À ce stade, vous pouvez examiner l'objet $ post pour vous assurer qu'il a le type de votre CPT ($post->post_type) et obtenir l'horodatage ($post->post_date). Si l'heure système actuelle dépasse l'heure de publication> 10 minutes, redirigez l'utilisateur vers l'URL de votre choix.

Vous voudrez probablement faire une sorte de "ramasse-miettes" sur les CPT expirés - supprimez ces publications expirées pour que votre base de données ne se remplisse pas de contenu inutile.

0
C C