在WooCommerce后台订单列表(含HPOS)过滤作者自有产品的订单
实现WooCommerce后台订单按发布产品的用户过滤
原代码失效的核心问题:订单的产品信息并不存储在订单的_product_id自定义字段中,而是存储在WooCommerce的订单项表(wp_woocommerce_order_items和wp_woocommerce_order_itemmeta)里,直接用meta_query无法关联到产品作者信息。
以下是修正后的实现代码:
// 后台订单列表过滤:仅显示当前用户发布的产品对应的订单 function restrict_admin_orders_to_user_products($where, $query) { global $pagenow, $wpdb; // 仅在后台订单列表页生效,且当前用户不是管理员 if (is_admin() && $pagenow === 'edit.php' && $query->get('post_type') === 'shop_order' && !current_user_can('administrator')) { $current_user_id = get_current_user_id(); // 关联订单项、产品表,筛选出当前用户发布的产品对应的订单ID $order_ids = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT order_items.order_id FROM {$wpdb->prefix}woocommerce_order_items AS order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS item_meta ON order_items.order_item_id = item_meta.order_item_id LEFT JOIN {$wpdb->prefix}posts AS products ON item_meta.meta_value = products.ID WHERE item_meta.meta_key = '_product_id' AND products.post_author = %d ", $current_user_id ) ); // 如果用户没有发布过产品,返回空结果 if (empty($order_ids)) { $where .= " AND 0=1"; } else { // 将订单ID列表加入查询条件 $order_ids_str = implode(',', array_map('intval', $order_ids)); $where .= " AND {$wpdb->prefix}posts.ID IN ($order_ids_str)"; } } return $where; } add_filter('posts_where', 'restrict_admin_orders_to_user_products', 10, 2);
代码说明:
- 使用
posts_where钩子修改订单查询的WHERE条件,通过SQL关联查询直接从数据库层面筛选符合条件的订单 - 关联订单项表获取订单对应的产品ID,再关联产品表匹配产品的发布者ID(当前用户ID)
- 处理了用户无发布产品的情况,此时会隐藏所有订单
- 仅对非管理员用户生效,管理员仍能查看所有订单
额外优化建议:
- 如果用户发布的产品数量较多,可以考虑添加缓存机制,避免每次加载订单列表都执行关联查询
- 若需要支持变体产品,需额外关联
wp_postmeta表匹配变体对应的父产品作者(因为变体的post_author通常继承父产品)
内容的提问来源于stack exchange,提问作者Cham
相关产品推荐
相关产品推荐

