如何获取WooCommerce我的账户页面各Endpoint内容用于自定义标签展示?
获取WooCommerce账户Endpoint对应的内容方法
你当前的代码只能生成账户菜单的链接和标签,要获取每个Endpoint对应的页面内容,得利用WooCommerce的模板加载机制或者内置钩子来实现,以下是两种可行方案:
方案一:直接加载对应Endpoint的模板文件
每个账户Endpoint都有对应的模板文件,存放在woocommerce/templates/myaccount/目录下(比如订单对应orders.php、地址对应edit-address.php)。你可以通过wc_get_template()函数加载这些模板,同时传入模板所需的必要参数:
<?php if ( is_user_logged_in() ) : ?> <?php foreach ( wc_get_account_menu_items() as $endpoint => $label ) : ?> <div class="<?php echo wc_get_account_menu_item_classes( $endpoint ); ?>"> <h3><?php echo esc_html( $label ); ?></h3> <?php // 根据不同Endpoint加载对应模板并传递参数 switch ( $endpoint ) { case 'orders': wc_get_template( 'myaccount/orders.php', array( 'current_page' => max( 1, get_query_var( 'paged' ) ), 'customer_orders' => wc_get_orders( array( 'customer_id' => get_current_user_id(), 'page' => max( 1, get_query_var( 'paged' ) ), 'paginate' => true, ) ), ) ); break; case 'edit-address': // 默认加载账单地址,可切换为'shipping'加载配送地址 wc_get_template( 'myaccount/edit-address.php', array( 'load_address' => 'billing', ) ); break; case 'edit-account': wc_get_template( 'myaccount/edit-account.php' ); break; case 'downloads': wc_get_template( 'myaccount/downloads.php', array( 'downloads' => wc_get_customer_available_downloads( get_current_user_id() ), ) ); break; case 'payment-methods': wc_get_template( 'myaccount/payment-methods.php' ); break; // 自定义Endpoint需自行处理内容 default: do_action( 'woocommerce_account_' . $endpoint . '_endpoint' ); break; } ?> </div> <?php endforeach; ?> <?php else : ?> <p>请先登录以查看账户相关内容</p> <?php endif; ?>
注意:每个模板依赖特定参数才能正常渲染,比如订单模板需要订单列表数据,必须正确传入参数。
方案二:利用WooCommerce内置的Endpoint渲染钩子
WooCommerce为每个账户Endpoint都提供了专属钩子,格式为woocommerce_account_{$endpoint}_endpoint,直接调用这些钩子就能让WooCommerce自动处理内容渲染,无需手动传递参数:
<?php if ( is_user_logged_in() ) : ?> <?php foreach ( wc_get_account_menu_items() as $endpoint => $label ) : ?> <div class="<?php echo wc_get_account_menu_item_classes( $endpoint ); ?>"> <h3><?php echo esc_html( $label ); ?></h3> <?php // 触发对应Endpoint的渲染钩子 do_action( 'woocommerce_account_' . $endpoint . '_endpoint' ); ?> </div> <?php endforeach; ?> <?php else : ?> <p>请先登录以查看账户相关内容</p> <?php endif; ?>
这个方案更简洁,还能自动兼容自定义Endpoint——如果是你自己添加的自定义Endpoint,只要注册时绑定了对应钩子的处理函数,就能直接输出内容。
内容的提问来源于stack exchange,提问作者Behzad
相关产品推荐
相关产品推荐

