/** * 在购物车中动态应用客户折扣 */ add_action('woocommerce_before_calculate_totals', 'yhsm_apply_role_based_discounts', 20, 1); function yhsm_apply_role_based_discounts($cart) { // 如果是在管理后台或没有商品,则直接返回 if (is_admin() && !defined('DOING_AJAX') || empty($cart->get_cart())) { return; } // 获取当前用户和折扣规则 $current_user = wp_get_current_user(); $user_role = !empty($current_user->roles) ? $current_user->roles[0] : ''; $discount_rules = yhsm_get_category_discount_rules($user_role); // 如果该用户角色没有折扣规则,则返回 if (empty($discount_rules)) { return; } // 遍历购物车中的每个商品 foreach ($cart->get_cart() as $cart_item_key => $cart_item) { $product = $cart_item['data']; $product_id = $cart_item['product_id']; // 获取商品的分类 $categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'names')); if (is_wp_error($categories) || empty($categories)) { continue; // 如果没有分类,跳过此商品 } // 查找适用的折扣率 $applicable_discount_rate = 100; // 默认无折扣 foreach ($categories as $category) { if (isset($discount_rules[$category])) { $applicable_discount_rate = $discount_rules[$category]; break; // 找到第一个匹配的分类就应用 } } // 如果找到了折扣(非100%),则计算新价格 if ($applicable_discount_rate < 100) { // 获取商品的原始价格(建议使用regular_price作为基准) $original_price = $product->get_regular_price(); if (empty($original_price)) { $original_price = $product->get_price(); } // 计算折扣价 $discounted_price = $original_price * ($applicable_discount_rate / 100); // 设置商品的新价格 $product->set_price($discounted_price); } } } /** * 注册短代码 [yhsm_product_cats] - 显示商品分类下拉菜单 * 支持多级分类显示和AJAX筛选 */ function yhsm_product_cats_shortcode($atts) { // 安全检查和WooCommerce验证 if (!class_exists('WooCommerce')) { return '
WooCommerce未激活,无法显示商品分类。
'; } // 处理短代码属性 $atts = shortcode_atts(array( 'hide_empty' => 'true', 'show_count' => 'false', 'placeholder' => '选择商品分类...', 'show_image' => 'false', 'parent_only' => 'false' ), $atts, 'yhsm_product_cats'); // 获取商品分类参数 $term_args = array( 'taxonomy' => 'product_cat', 'hide_empty' => $atts['hide_empty'] === 'true', 'orderby' => 'name', 'order' => 'ASC' ); // 如果只显示父级分类 if ($atts['parent_only'] === 'true') { $term_args['parent'] = 0; } $product_categories = get_terms($term_args); if (empty($product_categories) || is_wp_error($product_categories)) { return '暂无商品分类可供显示。
'; } // 开始输出缓冲 ob_start(); ?>