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

在WooCommerce我的账户中用短代码显示用户数据时遇致命错误

代码错误排查与修复方案

核心错误点

  • 字符串拼接语法错误:返回语句中'...your account ID is: '$current_user_id缺少连接符.,导致PHP语法解析失败,这是触发致命错误的核心原因。
  • 数组直接拼接字符串:$current_user_name是数组,直接在字符串中拼接会抛出数组转字符串的错误。
  • SQL查询存在语法与安全问题:直接将用户数据拼接到SQL语句中,既会因特殊字符导致语法错误,也存在SQL注入风险;同时未排除当前用户,统计结果会包含自身。
  • 短代码输出未渲染:挂载函数中do_shortcode的返回值未使用echo输出,导致内容无法显示。
  • HTML转义冗余:PHP闭合标签外直接编写HTML时,无需使用实体转义(</"),会导致HTML被原样输出而非解析。

修复后的完整代码

短代码函数

add_shortcode( 'ud_account_info', 'ud_account_info' );
function ud_account_info() {
    // 仅引入需要的全局变量
    global $wpdb;
    
    // 获取当前用户对象
    $current_user = wp_get_current_user();
    
    // 提取用户核心信息
    $current_user_id = $current_user->ID;
    $current_user_email = $current_user->user_email;
    $current_user_login = $current_user->user_login;
    $current_user_first = $current_user->first_name;
    $current_user_last = $current_user->last_name;
    
    // 安全查询同名(名)的其他用户数量(排除当前用户)
    $same_first_name_count = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT COUNT(user_id) FROM $wpdb->usermeta 
             WHERE meta_key = 'first_name' 
             AND meta_value = %s 
             AND user_id != %d",
            $current_user_first,
            $current_user_id
        )
    );
    
    // 处理空姓名情况,拼接完整姓名
    $full_name = !empty($current_user_first) || !empty($current_user_last) ? 
        trim($current_user_first . ' ' . $current_user_last) : '未设置姓名';
    
    // 格式化返回内容
    return sprintf(
        '您的账户信息:<br>
        姓名:%s<br>
        用户名:%s<br>
        邮箱:%s<br>
        账户ID:%d<br>
        与您同名(名)的其他用户数量:%d',
        $full_name,
        $current_user_login,
        $current_user_email,
        $current_user_id,
        $same_first_name_count
    );
}

挂载到账户仪表盘的函数

add_action( 'woocommerce_account_dashboard', 'user_control_information', 99 );
function user_control_information() { ?>
    <div style="margin-top:20px; padding:10px; border:1px solid #eee; border-radius:4px;">
        <?php echo do_shortcode( '[ud_account_info]' ); ?>
    </div>
<?php }

修复说明

  1. 修复了字符串拼接的语法错误,改用sprintf让内容拼接更清晰、不易出错。
  2. 使用$wpdb->prepare处理SQL查询,彻底解决注入风险与语法问题,同时排除当前用户得到准确的同名用户统计数。
  3. 拆分数组形式的姓名变量,处理空值情况,避免数组转字符串错误。
  4. 在挂载函数中添加echo输出短代码内容,移除冗余的HTML实体转义,同时添加基础样式提升页面显示效果。
  5. 移除未使用的global $woocommerce,优化代码冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:57:42