创建 Woocommerce 我的帐户订单页面,仅显示已完成的订单

问题描述 投票:0回答:1

我删除了之前的一个问题,因为我的措辞不好。我正在尝试创建一个仅显示已完成订单的 Woocommerce 我的帐户订单页面。我已尝试以下代码,但无论状态如何,所有订单仍然显示。

function woocommerce_orders() {
    $user_id = get_current_user_id();
    if ($user_id == 0) {
        return 
do_shortcode('[woocommerce_my_account]');
    } else {
        $orders = wc_get_orders(array(
            'customer' => $user_id,
            'status'   => 'completed', // You can 
modify the order status as needed
        ));
        $order_count = count($orders);
        ob_start();
        wc_get_template('myaccount/my-orders.php', 
array(
            'current_user' => get_user_by('id', 
$user_id),
            'order_count' => $order_count
        ));
        return ob_get_clean();
    }
}
add_shortcode('woocommerce_orders', 'woocommerce_orders');
php wordpress templates woocommerce orders
1个回答
0
投票

自 WooCommerce 3 起,模板

myaccount/my-orders.php
已弃用,不再使用并由 myaccount/orders.php 取代。

这些模板之间的区别在于,旧模板使用模板本身中硬编码的 WP_Query,而最新模板使用 WC_Query (与 WooCommerce HPOS 兼容)

当您在短代码中使用

myaccount/my-orders.php
模板(已弃用的模板)时,您需要一些不同的东西来定位客户已完成的订单:

add_shortcode('woocommerce_orders', 'shortcode_my_account_orders');
function shortcode_my_account_orders() {
    global $current_user;

    if ($current_user->ID > 0) {
        ob_start(); // Start buffering

        add_filter('woocommerce_my_account_my_orders_query', 'custom_my_account_my_orders_query', 10);

        wc_get_template('myaccount/my-orders.php', array(
            'current_user' => $current_user,
        ) );

        remove_filter('woocommerce_my_account_my_orders_query', 'custom_my_account_my_orders_query', 10);

        return ob_get_clean();
    } else {
        return do_shortcode('[woocommerce_my_account]');
    }
}

// Filter WP_Query for deprecated my-orders.php template
function custom_my_account_my_orders_query( $query_args ) {
    // Only completed orders
    $query_args['post_status'] =['wc-completed'];
    
    return $query_args;
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.