如何在WordPress钩子中设置延迟实现数秒后页面自动跳转
延迟重定向实现方案
首先明确核心注意点:
- 不要使用PHP的
sleep()函数实现该需求:sleep()会在服务端挂起程序,请求期间用户端会一直处于空白加载状态,无法感知到等待提示,体验极差。 - 推荐使用浏览器端的延迟跳转机制实现,有两种成熟实现方式可选:
方案1:使用HTTP Refresh头实现(无额外页面提示)
直接修改原有redirect_page函数中跳转的逻辑即可,不需要用wp_redirect,改为发送Refresh响应头:
function redirect_page() { if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { $protocol = 'https://'; } else { $protocol = 'http://'; } $currenturl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $currenturl_relative = wp_make_link_relative($currenturl); switch ($currenturl_relative) { case '[from slug]': $urlto = home_url('[to slug]'); break; default: return; } if ($currenturl != $urlto) { // 10为延迟秒数,可自行修改 header("Refresh: 10; url=$urlto"); // 可选:输出提示文本给用户 echo '页面将在10秒后自动跳转,若未跳转可<a href="'.esc_url($urlto).'">点击此处</a>'; exit; } } add_action( 'template_redirect', 'redirect_page' );
方案2:使用Meta标签+JavaScript实现(兼容性更好,支持自定义倒计时展示)
如果需要更灵活的样式控制、动态倒计时显示,可以改为输出前端代码实现跳转:
function redirect_page() { if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { $protocol = 'https://'; } else { $protocol = 'http://'; } $currenturl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $currenturl_relative = wp_make_link_relative($currenturl); switch ($currenturl_relative) { case '[from slug]': $urlto = home_url('[to slug]'); break; default: return; } if ($currenturl != $urlto) { // 输出前端跳转代码,10秒后跳转 ?> <!DOCTYPE html> <html> <head> <meta http-equiv="refresh" content="10; url=<?php echo esc_url($urlto); ?>"> <title>页面跳转中</title> </head> <body> <p>页面将在 <span id="countdown">10</span> 秒后自动跳转,若未跳转可<a href="<?php echo esc_url($urlto); ?>">点击此处</a></p> <script> let countdown = 10; const countdownEl = document.getElementById('countdown'); setInterval(() => { countdown--; countdownEl.textContent = countdown; if (countdown <= 0) { window.location.href = '<?php echo esc_url($urlto); ?>'; } }, 1000); </script> </body> </html> <?php exit; } } add_action( 'template_redirect', 'redirect_page' );
内容的提问来源于stack exchange,提问作者PareshP
相关产品推荐
相关产品推荐

