How to generate expiring URL?

时间:2016-08-29 作者:File_Submit

我有一个自定义的帖子类型Portfolio 每个投资组合都是一份问卷。如果我通过电子邮件将投资组合的链接发送给客户。

如何在10分钟后使链接过期,因此,如果客户端在10分钟后访问该链接,则应显示链接已过期的消息,请重试。

我该怎么做?

3 个回复
最合适的回答,由SO网友:bynicolas 整理而成

好吧我想到了这个

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

}
这是检查唯一URL有效性的地方

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.
  }
}

SO网友:The J

您可以添加custom query var 带有时间戳。

eg. example.com/portfolio?exp=12345678
然后,当用户登录到该url时,可以根据时间戳检查当前时间。如果10分钟过去了/或没有过去,将允许您在页面上输出不同的内容。

您甚至可以存储一个特定的时间戳,以了解客户机得到了什么表单/时间戳。

UPDATE

bynicolas 注意到,从技术上讲,客户端可以生成当前时间戳并再次访问链接。

因此,您可能想考虑将该时间戳保存为一个瞬态,保存10分钟。

现在,当客户端访问url时,您需要检查是否存在时间戳has expired.

只是一个想法。

SO网友:C C

这里有一个想法:钩住template_redirect 措施:

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

此时,您可以检查$post对象,以确保它具有您的CPT类型($post->post_type), 并获取时间戳($post->post_date). 如果当前系统时间超过发布时间10分钟以上,则将用户重定向到所需的URL。

您可能还想对过期的CPT进行某种“垃圾收集”——删除那些过期的帖子,这样您的数据库就不会充满不需要的内容。

相关推荐

Permalinks without post type

我使用norebo主题我在打开公文包时使用它链接的格式如下https://www.hshnorm.com/project/fruit-flavored-powder-juice/ 如何删除该单词project成为此格式的链接https://www.hshnorm.com/fruit-flavored-powder-juice/