开发电子商务网站的时候,我们经常需要对会员设置一定的优惠,比如,会员打八折,WooCommerce 没有为我们提供根据会员类型动态价格的能力,想要实现这个功能,我们可以使用插件,或者自己写一些代码。
想要实现这个功能,我们只要需要做到两点:修改会员浏览商品时的商品价格、修改会员购物车中和结账时的商品价格。下面的代码实* v # s } h M现了用户登录网站后,商品价格统一打 8 折显示的功能。
- add_filter( 'woocommerce_get_x b % d bprice_HTML', function ( $price_html,! S I W H o } @ $product ) {
- // 只在前端修改
- if ( is_admin() )W ] 4 4; return $pricR 7 X 3 $ he_html;
- // 只在设置了商品价格时才修改,免费产品直接返回
- if ( '' === $product->get_price() ) return $price_html;
- // 如果用户登录,打八折
- if ( wc_current_user_has_role( 'customer'L P T 8 l U a l ! ) G C { P 2041; {
- $orig_price = wc_get_price_to_d2 e Q M ^ 5 7 . Cisplay( $product [ E O 2 n c ? q p041;;
- $price_html = wc_pricU 6 : 9 5 e Le( $oriY [ B 6 M + ug_price * 0.80 );
- }
- return $price_html;
- }, 99g R e s + n ) T Z99, 2 );
下面的代码实现了会员登录后,修改购物车中的产品价格的功能。用户添加好商品去结账时,订单价b 1 y格会按照购物车中显示的商品价格计算。D v ] r 3 s e ! Q
- add_action( 'woocommerce_before_calculate_totals', function H ] L C C c s w040; $cart ) {
- if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
- if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
- // 如果客户没有登录,不显示价格
- if ( ! wc_curren) $ p Vt_user_has_role( 'customer' ) ) return;
- // 遍历购物\ Y I ; V v 7 0 Z车项目,每个项目都打八折
- foreach ( $cart->get_i \ ) / ; Gcart! m h 2 | \ m040;) as $caL a k = q : Brt_ite~ F { % ` I = zm_key => $cart_item ) {
- $product = $cart_item['data'];
- $price = $product->get_prid R Z J U #ce();
- $cart_item['data']->set_price( $price * 0.80 );
- }
- }, 9999 );
因为本文中所描述需求的逻辑非常简单,使用代码o w M P实现就显u G t v L得非常简洁,如果您有更复杂的动态价格需求,使用本文中介绍的方法理论上也可以实现,但是T p ` & : u可能0 W 9 1 k 8要多写很多代码,这种情况下,建议使用插件来管2 5 5 c 5理动态价格,比如 Dynamic Pricing 或 Advanced Dynamic Pricing forWooL ~ i - u k V w XCommj u 0 c y S eerc_ D \ ) o Ge。