我删除了之前的一个问题,因为我的措辞不好。我正在尝试创建一个仅显示已完成订单的 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');
自 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 文件中(或插件中)。已测试并有效。