WordPress/Woo技术需求:仅展示用户指定分类的已购商品
解决方案
要让这个短代码只展示特定分类的已购商品,你可以通过添加分类参数过滤的方式实现,修改后的代码如下:
add_shortcode( 'my_purchased_products', 'bbloomer_products_bought_by_curr_user' ); function bbloomer_products_bought_by_curr_user( $atts ) { // 接收短代码参数,默认分类为空(兼容原有功能) $atts = shortcode_atts( array( 'category' => '', // 可直接设置默认分类slug,比如'books' ), $atts ); // 获取当前用户 $current_user = wp_get_current_user(); if ( 0 == $current_user->ID ) return; // 获取用户已支付的订单(已完成+处理中) $customer_orders = get_posts( array( 'numberposts' => -1, 'meta_key' => '_customer_user', 'meta_value' => $current_user->ID, 'post_type' => wc_get_order_types(), 'post_status' => array_keys( wc_get_is_paid_statuses() ), ) ); // 遍历订单收集商品ID if ( ! $customer_orders ) return; $product_ids = array(); foreach ( $customer_orders as $customer_order ) { $order = wc_get_order( $customer_order->ID ); $items = $order->get_items(); foreach ( $items as $item ) { $product_id = $item->get_product_id(); $product_ids[] = $product_id; } } $product_ids = array_unique( $product_ids ); // 如果指定了分类,过滤出该分类下的商品ID if ( ! empty( $atts['category'] ) ) { $filtered_ids = array(); // 支持多个分类,用逗号分隔 $categories = explode( ',', $atts['category'] ); foreach ( $product_ids as $id ) { // 检查商品是否属于目标分类 if ( has_term( $categories, 'product_cat', $id ) ) { $filtered_ids[] = $id; } } $product_ids = $filtered_ids; } // 如果过滤后没有商品,返回提示文本 if ( empty( $product_ids ) ) { return '<p>暂无该分类的已购商品</p>'; } $product_ids_str = implode( ",", $product_ids ); // 传入商品ID到WooCommerce的products短代码 return do_shortcode("[products ids='$product_ids_str']"); }
关键修改说明
- 新增短代码参数:添加了
category参数,调用时可指定分类slug(多个分类用逗号分隔) - 分类过滤逻辑:用
has_term()函数检查每个已购商品是否属于目标分类,仅保留符合条件的商品ID - 兼容原有功能:不指定
category参数时,代码会和原来一样显示所有已购商品 - 空状态处理:过滤后无符合条件的商品时,返回提示文本避免页面空白
使用示例
- 展示分类slug为
books的已购商品:[my_purchased_products category="books"] - 同时展示
books和electronics两个分类的已购商品:[my_purchased_products category="books,electronics"]
内容的提问来源于stack exchange,提问作者Zeon Timar
相关产品推荐
相关产品推荐

