在WP_User_Query中使用模板部件时,如何获取用户ACF数据?
解决WP_User_Query结合模板部件时ACF用户字段无法获取的问题
问题根源
核心问题是变量作用域:get_template_part()函数会在新的局部作用域中加载模板文件,循环中定义的$user变量无法被模板部件访问,导致$user->ID未定义,ACF的get_field()无法正确定位到用户的自定义字段。
解决方案
方法1:用set_query_var()传递用户变量(推荐)
修改主循环代码,在调用模板部件前将用户对象传递到全局查询变量中:
// WP_User_Query 参数 $args = array( 'role' => 'advisor', 'number' => 6 ); // 用户查询 $user_query = new WP_User_Query( $args ); if ( ! empty( $user_query->get_results() ) ) : foreach ( $user_query->get_results() as $user ) { // 将当前用户对象传递给模板部件 set_query_var( 'current_advisor', $user ); get_template_part('template-parts/advisor'); } endif;
模板部件中获取传递的变量并调用ACF:
<?php // 从全局查询变量中取出用户对象 $current_advisor = get_query_var( 'current_advisor' ); if ( $current_advisor ) { $advisor_heading = get_field('advisor_heading', 'user_' . $current_advisor->ID); } ?> <div class="advisor__heading"> <h2><?php echo $advisor_heading; ?></h2> </div>
方法2:用include/require替代get_template_part()
include/require会继承当前作用域的变量,直接替换get_template_part()即可:
foreach ( $user_query->get_results() as $user ) { // 使用locate_template确保正确找到模板文件 include(locate_template('template-parts/advisor.php')); }
模板部件无需修改,保持原代码即可,因为$user变量会被直接继承。
方法3:直接传递用户ID
如果只需要用户ID,也可以单独传递ID参数:
主循环代码:
foreach ( $user_query->get_results() as $user ) { set_query_var( 'advisor_user_id', $user->ID ); get_template_part('template-parts/advisor'); }
模板部件代码:
<?php $user_id = get_query_var( 'advisor_user_id' ); $advisor_heading = get_field('advisor_heading', 'user_' . $user_id); ?> <div class="advisor__heading"> <h2><?php echo $advisor_heading; ?></h2> </div>
内容的提问来源于stack exchange,提问作者alexconnor7
相关产品推荐
相关产品推荐

