WordPress中表单提交后执行的PHP代码片段突然失效求助
问题排查与解决
你的代码在第一个if ( isset( $_GET['post'] ) )之后没有输出,说明代码没进入这个分支,或是进入后在后续判断中终止了执行,以下是具体排查和解决步骤:
1. 确认$_GET['post']参数是否存在
表单提交后,检查感谢页面的URL是否包含?post=xxx(xxx为有效帖子ID)。如果URL里没有这个参数,说明表单跳转逻辑出了问题——可能是表单配置被修改,没有把帖子ID传递到感谢页面。
你可以在第一个IF前加调试代码确认:
// 调试:查看所有GET参数 echo '<pre>' . print_r($_GET, true) . '</pre>';
如果输出里没有post字段,就需要调整表单的跳转设置,确保提交后携带该参数。
2. 检查get_post返回的有效性
就算URL里有post参数,也可能该ID对应的帖子已被删除、设为草稿/私密状态,导致get_post()返回false,无法通过is_object($resource)的判断。
在获取$resource后加调试代码:
$resource = get_post( (int) $_GET['post'] ); // 调试:查看get_post返回值 echo '<pre>' . print_r($resource, true) . '</pre>';
如果返回false,说明这个帖子ID无效,需要确认对应的帖子状态,或者传递正确的ID。
3. 排查环境变化导致的冲突
如果之前运行正常,突然失效,大概率是WordPress环境有更新:
- 检查是否更新了WordPress核心、主题或ACF插件(你的代码用到了
get_field,依赖ACF) - 临时切换到默认主题(如Twenty Twenty-Four),禁用所有非必要插件,测试代码是否恢复正常,逐步排查出冲突的插件/主题。
4. 代码健壮性优化
为避免后续再出现类似问题,可以给代码加兜底逻辑,同时增强安全性:
<?php // Make sure we have a valid post ID if ( isset( $_GET['post'] ) && is_numeric($_GET['post']) ) { // Load the resource $resource = get_post( (int) $_GET['post'] ); // Make sure the post exists and is published if ( is_object( $resource ) && $resource->post_status === 'publish' ) { $title = esc_html( get_the_title( $resource->ID ) ); $title = $title === '' ? 'White Paper' : $title; // Display video embed code if exists $video_embed_code = get_field( 'video_embed_code', $resource->ID ); if ( $video_embed_code ) { echo '<div class="video_embed_code">'; echo $video_embed_code; echo '</div>'; } // Display download link if exists $access_link = get_field( 'access_link', $resource->ID ); if ( $access_link ) { echo '<div class="access_link">'; echo '<a href="' . esc_url($access_link) . '" class="button button-1">Download ' . $title . '</a>'; echo '</div>'; } } } ?>
注:新增了is_numeric校验帖子ID格式,给$access_link加上esc_url()转义提升安全性,同时简化了标题的判断逻辑。
内容的提问来源于stack exchange,提问作者Andrew Rutazamba
相关产品推荐
相关产品推荐

