在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 }
修复说明
- 修复了字符串拼接的语法错误,改用
sprintf让内容拼接更清晰、不易出错。 - 使用
$wpdb->prepare处理SQL查询,彻底解决注入风险与语法问题,同时排除当前用户得到准确的同名用户统计数。 - 拆分数组形式的姓名变量,处理空值情况,避免数组转字符串错误。
- 在挂载函数中添加
echo输出短代码内容,移除冗余的HTML实体转义,同时添加基础样式提升页面显示效果。 - 移除未使用的
global $woocommerce,优化代码冗余。
内容的提问来源于stack exchange,提问作者Learning WooStoreFront
相关产品推荐
相关产品推荐

