如何获取WordPress中上次访问文章的Post ID及自定义字段
解决感谢页面获取上次访问文章post_id的问题
嘿,我来帮你搞定这个需求!你现在的核心问题是:get_the_ID()在感谢页面只会返回当前感谢页面本身的ID,根本拿不到之前访问的那篇文章的ID,所以得换个方式把之前的post_id传递过去才行。下面给你两种靠谱的实现方案:
方案一:通过GET参数传递post_id
这种方式简单直接,重定向的时候把文章ID作为URL参数带过去,感谢页面再读取这个参数。
步骤1:修改重定向逻辑(添加到functions.php)
首先,你需要在那些需要重定向到感谢页面的文章触发重定向时,把当前文章的ID拼到跳转URL里:
add_action('template_redirect', function() { // 这里替换成你判断文章需要重定向的条件,比如某个分类/自定义字段 if (is_single() && get_field('need_redirect')) { $target_post_id = get_the_ID(); // 获取感谢页面的链接,把post_id作为参数传过去 $thankyou_url = add_query_arg( 'post_id', $target_post_id, get_permalink(get_page_by_path('thank-you')) // 替换成你的感谢页面别名 ); wp_redirect($thankyou_url); exit; } });
步骤2:感谢页面处理逻辑
在感谢页面的模板文件里,读取URL参数里的post_id,验证合法性后再处理自定义字段:
// 先检查参数是否存在且合法 if (isset($_GET['post_id']) && is_numeric($_GET['post_id'])) { $previous_post_id = intval($_GET['post_id']); // 验证这个文章是否存在且已发布,防止恶意参数 if (get_post_status($previous_post_id) === 'publish') { // 获取自定义字段和文章标题 $product_tags = get_field('product_tags', $previous_post_id); $previous_post_title = get_the_title($previous_post_id); // 输出你要的预期效果 echo "您访问了属于“自定义字段”分类下的“{$previous_post_title}”的内容。"; // 你的条件判断逻辑 if ($product_tags == 'action' && !is_user_logged_in()) { echo '<p>Not For you</p>'; } else { echo '<p>Welcome</p>'; } } else { echo '无效的访问记录,请先访问合法文章'; } } else { echo '请先访问相关文章后再进入此页面'; }
方案二:通过Session存储post_id(更隐蔽)
如果不想让用户看到URL里的post_id参数,可以用Session来存储,这种方式更隐蔽。
步骤1:开启Session(添加到functions.php)
首先要在WordPress里开启Session支持:
add_action('init', function() { if (!session_id()) { session_start(); } });
步骤2:存储post_id到Session(添加到functions.php)
重定向前把文章ID存到Session里:
add_action('template_redirect', function() { if (is_single() && get_field('need_redirect')) { $_SESSION['previous_post_id'] = get_the_ID(); wp_redirect(get_permalink(get_page_by_path('thank-you'))); exit; } });
步骤3:感谢页面读取Session
在感谢页面模板里读取Session里的post_id,用完后可以清空避免重复显示:
if (isset($_SESSION['previous_post_id']) && is_numeric($_SESSION['previous_post_id'])) { $previous_post_id = intval($_SESSION['previous_post_id']); if (get_post_status($previous_post_id) === 'publish') { $product_tags = get_field('product_tags', $previous_post_id); $previous_post_title = get_the_title($previous_post_id); echo "您访问了属于“自定义字段”分类下的“{$previous_post_title}”的内容。"; if ($product_tags == 'action' && !is_user_logged_in()) { echo '<p>Not For you</p>'; } else { echo '<p>Welcome</p>'; } // 清空Session,防止用户刷新感谢页面还显示之前的记录 unset($_SESSION['previous_post_id']); } else { echo '无效的访问记录'; } } else { echo '请先访问相关文章'; }
注意事项
- 一定要验证
post_id的合法性,避免恶意用户传入无效ID或者恶意参数,用get_post_status()检查文章是否已发布是很有必要的。 - 如果你用自定义字段判断哪些文章需要重定向,记得把
get_field('need_redirect')替换成你实际的自定义字段键名。 - 感谢页面的别名
thank-you要替换成你自己的感谢页面的实际别名或ID。
内容的提问来源于stack exchange,提问作者JeVic
相关产品推荐
相关产品推荐

