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

WordPress中点击操作时始终保留?ref={username} URL参数(含跨域)

解决方案:全站保留ref参数的实现方案

针对你遇到的问题——全站导航(含跨域名跳转)保留?ref={username}参数,且不能使用add_query_var()的情况,以下是分场景的具体实现代码:

1. 全局获取Referral参数(复用函数)

先写一个通用函数,用于获取当前的ref参数(优先从URL取,没有则从Cookie取,同时将参数存入Cookie避免刷新丢失):

// 全局获取并存储referral参数
function get_current_referral() {
    $ref = '';
    // 优先读取URL中的ref/r参数
    if ( isset( $_GET['ref'] ) ) {
        $ref = sanitize_text_field( $_GET['ref'] );
    } elseif ( isset( $_GET['r'] ) ) {
        $ref = sanitize_text_field( $_GET['r'] );
    }
    // 将参数存入Cookie,有效期30天
    if ( $ref ) {
        setcookie( 'site_referral', $ref, time() + 30*24*60*60, COOKIEPATH, COOKIE_DOMAIN );
    } else {
        // URL无参数时,从Cookie读取
        $ref = isset( $_COOKIE['site_referral'] ) ? sanitize_text_field( $_COOKIE['site_referral'] ) : '';
    }
    return $ref;
}

2. 站内链接自动添加ref参数

针对WordPress原生的文章、页面、分类、菜单等链接,使用对应过滤器自动追加参数:

// 文章/页面链接添加ref参数
add_filter( 'post_type_link', 'add_referral_to_post_links', 10, 2 );
function add_referral_to_post_links( $url, $post ) {
    $ref = get_current_referral();
    return $ref ? add_query_arg( 'ref', $ref, $url ) : $url;
}

// 分类/标签链接添加ref参数
add_filter( 'term_link', 'add_referral_to_term_links', 10, 3 );
function add_referral_to_term_links( $url, $term, $taxonomy ) {
    $ref = get_current_referral();
    return $ref ? add_query_arg( 'ref', $ref, $url ) : $url;
}

// 搜索结果链接添加ref参数
add_filter( 'search_link', 'add_referral_to_search_link' );
function add_referral_to_search_link( $url ) {
    $ref = get_current_referral();
    return $ref ? add_query_arg( 'ref', $ref, $url ) : $url;
}

// 自定义菜单链接添加ref参数(支持站内/跨域名)
add_filter( 'nav_menu_link_attributes', 'add_referral_to_menu_links', 10, 3 );
function add_referral_to_menu_links( $atts, $item, $args ) {
    $ref = get_current_referral();
    if ( $ref && !empty( $atts['href'] ) ) {
        // 如需给跨域名链接也加参数,直接移除下面的if判断
        if ( strpos( $atts['href'], home_url() ) === 0 || strpos( $atts['href'], '/' ) === 0 ) {
            $atts['href'] = add_query_arg( 'ref', $ref, $atts['href'] );
        }
    }
    return $atts;
}

3. Bricks Builder元素链接处理

针对Bricks的按钮、文本链接等元素,修改其渲染后的HTML以追加参数:

// 给Bricks按钮、链接元素添加ref参数
add_filter( 'bricks/frontend/render_element', 'add_referral_to_bricks_elements', 10, 2 );
function add_referral_to_bricks_elements( $element_html, $element ) {
    $ref = get_current_referral();
    if ( !$ref ) return $element_html;

    // 处理按钮元素
    if ( $element->name === 'button' ) {
        $link = $element->settings['link']['url'] ?? '';
        if ( $link ) {
            $new_link = add_query_arg( 'ref', $ref, $link );
            $element_html = str_replace( $link, $new_link, $element_html );
        }
    }

    // 处理文本链接元素
    if ( $element->name === 'link' ) {
        $link = $element->settings['url'] ?? '';
        if ( $link ) {
            $new_link = add_query_arg( 'ref', $ref, $link );
            $element_html = str_replace( $link, $new_link, $element_html );
        }
    }

    // 如需处理其他Bricks元素,可在此添加判断
    return $element_html;
}

4. 所有重定向跳转添加ref参数

针对使用wp_redirect()的跳转(如表单提交、自定义重定向),自动追加参数:

// 给wp_redirect跳转添加ref参数
add_filter( 'wp_redirect', 'add_referral_to_redirects', 10, 2 );
function add_referral_to_redirects( $location, $status ) {
    $ref = get_current_referral();
    return $ref ? add_query_arg( 'ref', $ref, $location ) : $location;
}

关键说明

  • 为何不用add_query_var():该函数会将ref注册为WordPress公共查询变量,与你已配置的/blog永久链接结构冲突,导致跳转异常。我们通过钩子手动追加参数,不会影响原有永久链接规则。
  • Cookie存储的作用:确保用户刷新页面、关闭浏览器后重新访问时,仍能保留ref参数(无需依赖URL中的参数)。
  • 跨域名支持:如需给外部域名链接也添加参数,只需移除菜单钩子中的站内链接判断即可。

内容的提问来源于stack exchange,提问作者Ardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:43:29