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

WordPress无需登录实现用户名前缀链接及用户资料展示需求

WordPress 用户名URL前缀解决方案

以下是针对需求的完整实现步骤:

1. 注册重写规则与标签

你之前仅添加了重写标签但缺少对应解析规则,导致无法识别URL前缀。将以下代码添加到主题functions.php或自定义插件中:

function custom_username_rewrite_rules() {
    // 注册重写标签,用于传递username参数
    add_rewrite_tag('%username%', '([a-zA-Z0-9_-]+)');
    
    // 添加重写规则:匹配带用户名前缀的URL,映射到原页面
    add_rewrite_rule(
        '^([a-zA-Z0-9_-]+)/(.+)/?$',
        'index.php?pagename=$matches[2]&username=$matches[1]',
        'top'
    );
}
add_action('init', 'custom_username_rewrite_rules');

添加后,前往WordPress后台设置→固定链接页面点击「保存更改」,刷新重写规则缓存。

2. 实现[userdata]短码

该短码自动读取URL中的用户名参数,查询并输出用户对应字段:

function userdata_shortcode($atts) {
    // 提取短码参数,默认字段为姓名
    $atts = shortcode_atts(array(
        'username' => '',
        'field' => 'name'
    ), $atts);
    
    // 未指定username时,从URL参数获取
    if (empty($atts['username'])) {
        $atts['username'] = get_query_var('username');
    }
    
    // 查询用户对象
    $user = get_user_by('login', $atts['username']);
    if (!$user) {
        return '用户不存在';
    }
    
    // 根据字段返回对应值
    switch ($atts['field']) {
        case 'email':
            return esc_html($user->user_email);
        case 'facebook':
            // 替换为实际的用户元数据key
            return esc_html(get_user_meta($user->ID, 'facebook', true));
        case 'address':
            // 替换为实际的用户元数据key
            return esc_html(get_user_meta($user->ID, 'address', true));
        case 'name':
        default:
            return esc_html($user->display_name);
    }
}
add_shortcode('userdata', 'userdata_shortcode');

注意:若你的用户自定义字段(如Facebook、地址)使用了不同的元数据key,需替换代码中对应的字符串。

3. 首次访问重定向与Cookie存储

当用户访问不带前缀的页面时,检查Cookie并完成重定向:

function custom_username_redirect() {
    // 排除后台与AJAX请求
    if (is_admin() || wp_doing_ajax()) {
        return;
    }
    
    $username = get_query_var('username');
    if (empty($username)) {
        // 从Cookie读取已存储的用户名
        $stored_username = isset($_COOKIE['custom_user_prefix']) ? $_COOKIE['custom_user_prefix'] : '';
        
        // Cookie无数据时生成随机访客用户名
        if (empty($stored_username)) {
            $stored_username = 'guest_' . wp_generate_password(6, false);
        }
        
        // 构建带前缀的跳转URL
        $page_path = trim($_SERVER['REQUEST_URI'], '/');
        $redirect_url = home_url("/{$stored_username}/{$page_path}/");
        
        // 存储Cookie,有效期30天
        setcookie('custom_user_prefix', $stored_username, time() + 30 * 24 * 60 * 60, COOKIEPATH, COOKIE_DOMAIN);
        
        // 执行重定向
        wp_redirect($redirect_url);
        exit;
    } else {
        // URL含用户名时更新Cookie
        setcookie('custom_user_prefix', $username, time() + 30 * 24 * 60 * 60, COOKIEPATH, COOKIE_DOMAIN);
    }
}
add_action('template_redirect', 'custom_username_redirect');

4. 自动为内部链接添加用户名前缀

通过过滤器实现所有内部文章/页面链接自动追加前缀:

function add_username_to_internal_links($url, $post = null) {
    // 排除外部链接与后台链接
    if (strpos($url, home_url()) === false || is_admin()) {
        return $url;
    }
    
    // 获取当前用户名(URL参数优先,其次Cookie)
    $username = get_query_var('username');
    if (empty($username)) {
        $username = isset($_COOKIE['custom_user_prefix']) ? $_COOKIE['custom_user_prefix'] : '';
    }
    
    if (empty($username)) {
        return $url;
    }
    
    // 重构带前缀的链接
    $relative_path = str_replace(home_url(), '', $url);
    $relative_path = ltrim($relative_path, '/');
    
    return home_url("/{$username}/{$relative_path}");
}
add_filter('post_link', 'add_username_to_internal_links', 10, 2);
add_filter('page_link', 'add_username_to_internal_links', 10, 2);

测试与注意事项

  • 确保固定链接设置为非默认模式(如「文章名称」),重写规则才能生效。
  • 使用短码时直接写[userdata field=email]即可自动读取URL中的用户名。
  • 若需支持自定义文章类型,可添加post_type_link过滤器。

内容的提问来源于stack exchange,提问作者Csaba.io

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:55:18