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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:35:31