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
相关产品推荐
相关产品推荐

