You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:35