如何在PHP中将Get方法转为Post方法并实现文章选择自动跳转
问题:将WordPress GET表单转为POST并实现选择后自动跳转
现有如下WordPress表单代码(使用GET方法):
<form action="<? bloginfo('url'); ?>" method="get"> <select name="page_id" id="page_id"> <?php $related = get_posts( array( 'post_type' => 'Episode', 'category__in' => wp_get_post_categories( $post->ID ), 'numberposts' => -1, 'post__not_in' => array( $post->ID ) ) ); if( $related ) { foreach( $related as $post ) { setup_postdata($post);?> <option value="<? echo $post->ID; ?>"><?php the_title(); ?></option> <?php }}?> </select> <input type="submit" name="submit" value="view" /> </form>请问如何将其转换为POST方法?同时希望选择文章后能自动跳转到对应的指定文章?
解决方案
1. 修改表单结构(转为POST+自动提交)
直接修改前端表单,添加JavaScript实现选择后自动提交,同时调整表单提交地址到WordPress官方的POST处理入口:
<form id="episode-jump-form" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post"> <!-- 定义后端处理的钩子标识 --> <input type="hidden" name="action" value="jump_to_episode"> <select name="episode_id" id="episode_id"> <?php $related = get_posts(array( 'post_type' => 'Episode', 'category__in' => wp_get_post_categories(get_the_ID()), 'numberposts' => -1, 'post__not_in' => array(get_the_ID()), 'post_status' => 'publish' // 仅加载已发布内容 )); if ($related) { foreach ($related as $post) { setup_postdata($post); ?> <option value="<?php echo esc_attr($post->ID); ?>"><?php the_title(); ?></option> <?php } wp_reset_postdata(); // 重置全局post对象,避免后续代码冲突 } else { ?> <option value="">暂无相关剧集</option> <?php } ?> </select> <input type="submit" name="submit" value="查看" /> </form> <!-- 监听下拉框变化,自动提交表单 --> <script> document.getElementById('episode_id').addEventListener('change', function() { if (this.value) { document.getElementById('episode-jump-form').submit(); } }); </script>
2. 添加后端跳转处理逻辑
在当前主题的functions.php文件中加入以下代码,处理POST请求并跳转到对应文章:
// 处理登录用户的跳转请求 add_action('admin_post_jump_to_episode', 'handle_episode_jump'); // 处理未登录用户的跳转请求 add_action('admin_post_nopriv_jump_to_episode', 'handle_episode_jump'); function handle_episode_jump() { if (isset($_POST['episode_id']) && !empty($_POST['episode_id'])) { $episode_id = intval($_POST['episode_id']); $target_url = get_permalink($episode_id); if ($target_url) { wp_redirect($target_url); exit; } } // 无有效ID时跳回当前页面 wp_redirect(get_permalink()); exit; }
关键细节说明
- 表单提交地址使用
admin-post.php是WordPress官方推荐的自定义POST请求处理方式,避免直接暴露主题文件路径,提升安全性。 - 加入
wp_reset_postdata()恢复全局$post对象,防止后续页面内容出现异常。 - 使用
esc_url()、esc_attr()做安全转义,符合WordPress编码规范。 - 后端同时处理登录/未登录用户的请求,确保所有访问者都能正常使用跳转功能。
内容的提问来源于stack exchange,提问作者goyeveyDD
相关产品推荐
相关产品推荐

