如何在WordPress登录重定向中保留锚点标签(ID类)?
如何让Easy Login for WooCommerce重定向时保留锚点标签
在使用Easy Login for WooCommerce插件时,重定向功能正常,但原链接中的锚点标签会被丢弃。插件处理重定向的核心代码如下:
function xoo_el_redirect_endpoints(){ if( xoo_el_helper()->get_general_option( 'm-ep-success' ) !== "yes" ) return; add_filter( 'xoo_el_login_redirect', function( $redirect ){ return add_query_arg( 'login', 'success', $redirect ); } ); add_filter( 'xoo_el_register_redirect', function( $redirect ){ return add_query_arg( 'login', 'success', $redirect ); } ); } add_action( 'init', 'xoo_el_redirect_endpoints' );
之前尝试添加固定锚点的测试代码导致全站重定向到/#gids,代码如下:
function xoo_cu_el_redirect($url){ return $url .'/#gids'; } add_filter( 'xoo_el_login_redirect', 'xoo_cu_el_redirect' ); //for login add_filter( 'xoo_el_registration_redirect', 'xoo_cu_el_redirect' ); // for registration
问题原因
- WordPress的
add_query_arg()函数默认会丢弃URL中的锚点部分,只处理查询参数。 - 测试代码未对重定向URL做空值判断,也未限制锚点添加的场景,导致全站触发重定向时都加上了锚点。
- 钩子名错误:插件使用的注册重定向钩子是
xoo_el_register_redirect,但测试代码用了xoo_el_registration_redirect,导致逻辑失效。
解决方案
方案1:保留原URL的锚点标签
以下代码会提取原重定向URL中的锚点,添加插件所需的查询参数后再将锚点拼接回去:
function xoo_cu_el_preserve_anchor_redirect($redirect_url) { // 空URL直接返回,避免异常重定向 if (empty($redirect_url)) { return $redirect_url; } // 解析URL,提取原锚点部分 $url_components = parse_url($redirect_url); $original_anchor = isset($url_components['fragment']) ? '#' . $url_components['fragment'] : ''; // 添加插件要求的"login=success"查询参数 $url_with_query = add_query_arg('login', 'success', $redirect_url); // 移除add_query_arg自动剥离后可能残留的锚点,再拼接原锚点 $final_redirect = strtok($url_with_query, '#') . $original_anchor; return $final_redirect; } // 使用与插件一致的钩子名 add_filter('xoo_el_login_redirect', 'xoo_cu_el_preserve_anchor_redirect'); add_filter('xoo_el_register_redirect', 'xoo_cu_el_preserve_anchor_redirect');
方案2:自定义添加固定锚点(仅特定场景)
如果需要给特定页面的重定向添加固定锚点(比如#gids),需限制触发条件,避免全站重定向异常:
function xoo_cu_el_add_custom_anchor_redirect($redirect_url) { if (empty($redirect_url)) { return $redirect_url; } // 仅在重定向到购物车页面时添加锚点,可根据需求修改目标页面 if (strpos($redirect_url, wc_get_cart_url()) !== false) { // 移除原有锚点,添加自定义锚点 $redirect_url = strtok($redirect_url, '#') . '#gids'; } // 保留插件的查询参数添加逻辑 return add_query_arg('login', 'success', $redirect_url); } add_filter('xoo_el_login_redirect', 'xoo_cu_el_add_custom_anchor_redirect'); add_filter('xoo_el_register_redirect', 'xoo_cu_el_add_custom_anchor_redirect');
注意事项
- 将代码添加到主题的
functions.php文件或自定义插件中,避免直接修改原插件代码(更新插件后会丢失修改)。 - 测试前请备份网站数据,避免出现异常重定向问题。
内容的提问来源于stack exchange,提问作者Kayla-May Smit
相关产品推荐
相关产品推荐

