私はカスタム投稿タイプPortfolio
を持っており、各ポートフォリオはアンケートです。ポートフォリオのリンクをクライアントに電子メールで送信するとします。
10分後にリンクを期限切れにするにはどうすればよいですか。つまり、クライアントが10分後にリンクを訪問するようになった場合は、リンクが期限切れになったというメッセージが表示されます。
どうやってやるの?
わかりました私はこれを思い付きました
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.
}
}
タイムスタンプ付きで カスタムクエリvar を追加できます。
eg. example.com/portfolio?exp=12345678
ユーザーがそのURLにアクセスすると、現在の時刻とタイムスタンプを照合できます。 10分が経過した場合、または経過しなかった場合は、ページにさまざまなものを出力できます。
どのクライアントがどのフォーム/タイムスタンプを取得したのかを知るために、特定のタイムスタンプを保存することもできます。
_ update _
bynicolas が指摘したように、技術的にはクライアントは現在のタイムスタンプを生成してリンクに再びアクセスすることができます。
そのため、そのタイムスタンプを一時的なものとして10分間保存することを検討してください。
さて、クライアントがそのURLにアクセスしたとき、あなたはタイムスタンプ のある一時的なものが期限切れになったかどうか - チェックする必要があります。
ただのアイデアです。
これがひとつのアイデアです。template_redirect
アクションにフックします。
https://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect
この時点で、$ postオブジェクトがあなたのCPTの型($post->post_type
)であることを確認するために$ postオブジェクトを調べ、そしてタイムスタンプ($post->post_date
)を取得することができます。現在のシステム時間が投稿時間を10分以上超えている場合は、ユーザーを希望のURLにリダイレクトします。
期限切れのCPTについても何らかの「ガベージコレクション」を実行することをお勧めします。データベースが不要なコンテンツでいっぱいにならないように、期限切れの投稿を削除します。