WordPress中如何实现页面跳转时保留URL可变参数?
WordPress保留URL可变参数实现方案
核心需求是用户首次访问携带的pid、prid参数,在后续所有站内跳转、按钮点击时都不丢失,以下是两种可直接落地的实现方案:
方案1:PHP服务端实现(推荐,兼容性最优)
将以下代码添加到WordPress主题的functions.php文件,或者自定义功能插件中即可生效:
// 保存需要保留的参数到session add_action('init', 'save_custom_url_params'); function save_custom_url_params() { if (!session_id()) session_start(); $allowed_params = ['pid', 'prid']; // 可自定义需要保留的参数列表 foreach ($allowed_params as $param) { if (isset($_GET[$param])) { $_SESSION[$param] = sanitize_text_field($_GET[$param]); } } } // 给所有站内链接自动追加参数 add_filter('post_type_link', 'append_custom_params_to_url', 10, 1); add_filter('page_link', 'append_custom_params_to_url', 10, 1); add_filter('term_link', 'append_custom_params_to_url', 10, 1); add_filter('home_url', 'append_custom_params_to_url', 10, 1); function append_custom_params_to_url($url) { if (!session_id()) session_start(); $allowed_params = ['pid', 'prid']; $params = []; foreach ($allowed_params as $param) { if (isset($_SESSION[$param]) && !empty($_SESSION[$param])) { $params[$param] = $_SESSION[$param]; } } if (!empty($params)) { $url = add_query_arg($params, $url); } return $url; } // 跳转时也保留参数 add_filter('wp_redirect', 'append_custom_params_to_url', 10, 1);
方案2:前端JS实现(无后端修改要求,适配缓存站点)
如果站点开启了页面缓存,服务端修改会受缓存影响,可使用JS方案,将以下代码添加到主题自定义JS区域,或者通过「自定义HTML」小工具插入到页脚全局位置:
// 读取并存储参数 const allowedParams = ['pid', 'prid']; const currentUrl = new URL(window.location.href); let savedParams = {}; // 优先从当前URL取参数,没有的话从localStorage取 allowedParams.forEach(param => { if (currentUrl.searchParams.has(param)) { savedParams[param] = currentUrl.searchParams.get(param); localStorage.setItem(param, savedParams[param]); } else if (localStorage.getItem(param)) { savedParams[param] = localStorage.getItem(param); } }); // 给所有站内a标签追加参数 if (Object.keys(savedParams).length > 0) { document.querySelectorAll('a').forEach(link => { try { const linkUrl = new URL(link.href); // 只处理站内链接 if (linkUrl.host === window.location.host) { Object.keys(savedParams).forEach(param => { linkUrl.searchParams.set(param, savedParams[param]); }); link.href = linkUrl.toString(); } } catch (e) {} }); // 处理动态生成的元素点击 document.addEventListener('click', function(e) { const target = e.target.closest('a'); if (target && target.host === window.location.host) { const linkUrl = new URL(target.href); Object.keys(savedParams).forEach(param => { linkUrl.searchParams.set(param, savedParams[param]); }); target.href = linkUrl.toString(); } }); }
注意事项
- 两种方案默认只保留
pid和prid两个参数,如需保留其他参数,修改代码中allowed_params(PHP)或allowedParams(JS)的数组值即可 - 无缓存站点优先使用PHP方案,不会出现参数延迟加载的问题;有全页缓存的站点使用JS方案兼容性更好
- 两种方案都默认不对外部站点链接追加参数,不会影响外域跳转逻辑
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

