Woocommerce - 如何在自定义页面上显示当前用户的订单?

Posted

技术标签:

【中文标题】Woocommerce - 如何在自定义页面上显示当前用户的订单?【英文标题】:Woocommerce - how to show current user's orders on the custom page? 【发布时间】:2021-12-24 11:45:06 【问题描述】:

我需要用我自己的 html 和 css 向用户显示订单列表,例如商品左侧的数字和缩略图,右侧必须是订单日期、订单状态、数量还有价格,还有我自己的元数据。 我已经学会了如何用钩子添加图像,这不是问题。问题是 - 我无法自定义 woocommerce/myaccount/orders.php 的本机结构。即使我将 table、tr、td、tbody 更改为 div-s,我的包装器也无济于事。这是一个循环。我添加的所有内容都是为所有项目添加的

foreach ( $customer_orders->orders as $customer_order ) 
                $order      = wc_get_order( $customer_order ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                $item_count = $order->get_item_count() - $order->get_item_count_refunded();
                ?>
                <div class="woocommerce-orders-table__row woocommerce-orders-table__row--status-<?php echo esc_atdiv( $order->get_status() ); ?> order">
                    <?php foreach ( wc_get_account_orders_columns() as $column_id => $column_name ) : ?>
                        <div class="woocommerce-orders-table__cell woocommerce-orders-table__cell-<?php echo esc_atdiv( $column_id ); ?>" data-title="<?php echo esc_atdiv( $column_name ); ?>">
                            <?php if ( has_action( 'woocommerce_my_account_my_orders_column_' . $column_id ) ) : ?>
                                <?php do_action( 'woocommerce_my_account_my_orders_column_' . $column_id, $order ); ?>

                            <?php elseif ( 'order-number' === $column_id ) : ?>
                                <a href="<?php echo esc_url( $order->get_view_order_url() ); ?>">
                                    <?php echo esc_html( _x( '#', 'hash before order number', 'woocommerce' ) . $order->get_order_number() ); ?>
                                </a>

                            <?php elseif ( 'order-date' === $column_id ) : ?>
                                <time datetime="<?php echo esc_atdiv( $order->get_date_created()->date( 'c' ) ); ?>"><?php echo esc_html( wc_format_datetime( $order->get_date_created() ) ); ?></time>

                            <?php elseif ( 'order-status' === $column_id ) : ?>
                                <?php echo esc_html( wc_get_order_status_name( $order->get_status() ) ); ?>

                            <?php elseif ( 'order-total' === $column_id ) : ?>
                                <?php
                                /* divanslators: 1: formatted order total 2: total order items */
                                echo wp_kses_post( sprintf( _n( '%1$s for %2$s item', '%1$s for %2$s items', $item_count, 'woocommerce' ), $order->get_formatted_order_total(), $item_count ) );
                                ?>

                            <?php elseif ( 'order-actions' === $column_id ) : ?>
                                <?php
                                $actions = wc_get_account_orders_actions( $order );

                                if ( ! empty( $actions ) ) 
                                    foreach ( $actions as $key => $action )  // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                                        echo '<a href="' . esc_url( $action['url'] ) . '" class="woocommerce-button button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
                                    
                                
                                ?>
                            <?php endif; ?>
                        </div>
                    <?php endforeach; 

我需要将订单号和添加的缩略图分开到一个包装器中,并将所有其他元数据分开到另一个包装器中。 我需要类似 global $product;产品-> get_price();但与订单。 也许有一些函数可以单独显示所有订单部分,并创建一个新循环?

【问题讨论】:

【参考方案1】:

据我们了解,您希望创建自己的模板页面并显示当前用户订单。 如果我是对的,你应该这样尝试:

<?php
/*
* Template Name: Order Page Template
*/

defined( 'ABSPATH' ) || exit;

global $woocommerce, $user_id;  

if (!class_exists('WooCommerce') || !get_current_user_id()) 
    return;
;

$user_id = get_current_user_id();

//$customer = wp_get_current_user();
$posts_per_page = 20; 
// Get all customer orders
$customer__all_orders = get_posts(apply_filters('woocommerce_my_account_my_orders_query', array(
    'numberposts' => -1,
    'meta_key' => '_customer_user',
    'orderby' => 'date',
    'order' => 'DESC',
    'meta_value' => $user_id ,
    'post_type' => wc_get_order_types(),
    'post_status' => array_keys(wc_get_order_statuses()), 'post_status' => array('wc-processing'),
)));
$paged = isset($_REQUEST['order_page']) ? $_REQUEST['order_page'] : 1;
$total_records = count($customer__all_orders);
$total_pages = ceil($total_records / $posts_per_page);


$customer_orders = get_posts(array(
    'meta_key' => '_customer_user',
    'order' => 'DESC',
    'meta_value' => $user_id ,
    'post_type' => wc_get_order_types(),
    'posts_per_page' => $posts_per_page,
    'paged' => $paged,
    'post_status' => array_keys(wc_get_order_statuses()), 'post_status' => array('wc-processing'),
));
?>


<?php if (!empty($customer_orders)) : ?>

    <table class="woocommerce-orders-table woocommerce-MyAccount-orders shop_table shop_table_responsive my_account_orders account-orders-table">
        <thead>
            <tr>
                <?php foreach ( wc_get_account_orders_columns() as $column_id => $column_name ) : ?>
                    <th class="woocommerce-orders-table__header woocommerce-orders-table__header-<?php echo esc_attr( $column_id ); ?>"><span class="nobr"><?php echo esc_html( $column_name ); ?></span></th>
                <?php endforeach; ?>
            </tr>
        </thead>

        <tbody>
            <?php
            foreach ( $customer_orders as $customer_order ) 
                $order      = wc_get_order( $customer_order ); 
                $item_count = $order->get_item_count() - $order->get_item_count_refunded();
                ?>
                <tr class="woocommerce-orders-table__row woocommerce-orders-table__row--status-<?php echo esc_attr( $order->get_status() ); ?> order">
                    <?php foreach ( wc_get_account_orders_columns() as $column_id => $column_name ) : ?>
                        <td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-<?php echo esc_attr( $column_id ); ?>" data-title="<?php echo esc_attr( $column_name ); ?>">
                            <?php if ( has_action( 'woocommerce_my_account_my_orders_column_' . $column_id ) ) : ?>
                                <?php do_action( 'woocommerce_my_account_my_orders_column_' . $column_id, $order ); ?>

                            <?php elseif ( 'order-number' === $column_id ) : ?>
                                <a href="<?php echo esc_url( $order->get_view_order_url() ); ?>">
                                    <?php echo esc_html( _x( '#', 'hash before order number', 'woocommerce' ) . $order->get_order_number() ); ?>
                                </a>

                            <?php elseif ( 'order-date' === $column_id ) : ?>
                                <time datetime="<?php echo esc_attr( $order->get_date_created()->date( 'c' ) ); ?>"><?php echo esc_html( wc_format_datetime( $order->get_date_created() ) ); ?></time>

                            <?php elseif ( 'order-status' === $column_id ) : ?>
                                <?php echo esc_html( wc_get_order_status_name( $order->get_status() ) ); ?>

                            <?php elseif ( 'order-total' === $column_id ) : ?>
                                <?php
                                /* translators: 1: formatted order total 2: total order items */
                                echo wp_kses_post( sprintf( _n( '%1$s for %2$s item', '%1$s for %2$s items', $item_count, 'woocommerce' ), $order->get_formatted_order_total(), $item_count ) );
                                ?>

                            <?php elseif ( 'order-actions' === $column_id ) : ?>
                                <?php
                                $actions = wc_get_account_orders_actions( $order );

                                if ( ! empty( $actions ) ) 
                                    foreach ( $actions as $key => $action )  // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
                                        echo '<a href="' . esc_url( $action['url'] ) . '" class="woocommerce-button button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
                                    
                                
                                ?>
                            <?php endif; ?>
                        </td>
                    <?php endforeach; ?>
                </tr>
                <?php
            
            ?>
        </tbody>
    </table>
    <div class="pagination">
    <?php
        $args = array(
            'base' => '%_%',
            'format' => '?order_page=%#%',
            'total' => $total_pages,
            'current' => $paged,
            'show_all' => False,
            'end_size' => 5,
            'mid_size' => 5,
            'prev_next' => True,
            'prev_text' => __('&laquo; Previous'),
            'next_text' => __('Next &raquo;'),
            'type' => 'plain',
            'add_args' => False,
            'add_fragment' => ''
        );
        echo paginate_links($args);
    ?>
</div>
<?php else : ?>
    <div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info">
        <a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>"><?php esc_html_e( 'Browse products', 'woocommerce' ); ?></a>
        <?php esc_html_e( 'No order has been made yet.', 'woocommerce' ); ?>
    </div>
<?php endif; ?>

步骤:

    在您的活动主题中创建新页面 - template-order.php 将上述代码复制到您的 template-order.php apge 中并保存。 转到 wordpress 管理仪表板页面菜单并单击新页面 创建新页面后分配模板“订单页面模板”并保存 现在打开您的新页面,您将获得与当前登录用户相关的订单

注意:您也可以对上面的代码进行相应的修改

【讨论】:

但它是同一个不方便的表,我需要它的值,但是将它们放在我自己的 html flex 标签中 你可以根据你的主题布局改变css和html

以上是关于Woocommerce - 如何在自定义页面上显示当前用户的订单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义帖子类型上使用Woocommerce的二级图像上传Metabox?

如何显示 WooCommerce 产品的自定义分类?

单个产品页面上的 Woocommerce 钩子溢出

Woocommerce 如何在我的帐户页面上重定向自定义端点

如何显示用户的 WooCommerce 订阅详情?

在 WooCommerce 单一产品页面上为特定产品添加自定义内容