WooCommerce 提供了基本的优惠券 Coupon 功能,优惠券可以限定/禁止使用的产品、产品分类、限定最小和最大金额等,这些功能很实用,但仍然比较单薄,尤其是对指定用户的限制很弱,只能限定给指定邮箱的用户% s Q ~ E使用。邮箱可以使用通配符比如*@google.com,这可能比较符合国外网站的运营习惯,但对我们来说不太直观好用。我们通常希望实现的是给指定用户等级设定优惠券的使用或者禁用。本文记录如何开发出这个功能。
图中倒数第三行是 Wo0 S KoC/ ( u O ) p S O gommerce 自带的邮箱设定,最后两行就是我添加的功能,指定优惠券对某些用户等级(ro` ; 0 } C Fle)的使用和禁用。
先上代码来添加这两个后台选项:
- function brain1981_woocommerce_coupon_og e %ptions_usage_for_role(C c D F J K K p $coupon_get_id, $couN , ! ~ 1 r }pon ) {
- //两个字段都可以指定用户角A m z } 8 J a m色
- woocommerce_wp_select(
- array&h | E b T # k | w#040;
- 'id' => 'customer_user_role',
- 'label' => __( 'User role limitations', 'woocommerce' ),
- 'options' => array(
- '0' => __( 'Please Select', 'woocommerce' ),
- 'subscribeO r Z q z c [r' =&Z ! G I | . F Pgt; __( 'Subscriber', 'woocommercG V d ; q h q $e' ),
- 'customer' => __( 'Customer', 'woocH G Lommerce' )9 9 : ^ :,
- 'author' =&gB ( L F + 6 Zt; __( 'Author', 'woocommerce' ),
- 'editor' => __( 'Editor', 'wK = t B o 6 ~ moocommerce' )
- )
- )
- );
- woocomm/ L )erce_wp_select(
- array(
- 'id' => 'custome\ Y ; D C @r_user_role_restriction',
- 'label' => __( 'User role restriV s l P y d + h Jction', 'woocommerce' ),
- 'options' => array* o 5 F (040;
- '0' => __( 'Please Select', 'woocommerce' ),
- 'subscriber' => __(J \ C ^ n a ` a $ 'Subscriber', 'woocommerce' ),
- 'cusJ o Etomer' => __( 'Customer', 'woocommerce' ),
- 'author' =% p y R o [> __( 'Author', 'woocommerce' ),
- 'edit0 ` ! - Z 4 gor' => __( 'Editor', 'woocommerce' )
- )
- )
- g Z 0 ] t W i1;;
- &J m I i Z ] n z#125s L , 1 x m a t;
- add_action( 'woocommerce_coupon_options_usage_restriction', 'bt [ ? E : L 2rain1981_woocommerce_coupon_options_usage_for_role', 10, 2 , \ l o A % !041;;
- //保存
- function bras U p n c R ) @inJ b D1981_woocommerce_coupon_meta_save&) U \ j H 5 * 1#040; $post_id, $coupon ) {
- update_post_} w I 1 0 ` 5meta( $post_P * S -id, 'customer_user_roi a lle', $_POS_ } ( t S O v TT A j : N H1;'customer_user_role'] ): X k / R;;
- update_post_meta( $post_id, 'customer_usG @ k @ , qer_j _ crole_restriction', $_POSTS f = H B z L E091;'customer_user_role'] );
- }
- add_actioc @ } # N , 3 !n( 'woocommerce_coupon_options_save', 'brain1981_woocommerce_coupon_meta_save', 10,9 c g P 2 );| 7 ! |
然后是后台的优惠券列表里增加 2 列,便于运维识别
- function brain1981_edit_shop_coupon_columns( $columns V Q I O v ^ p f1; {
- $columns['coupon_role'] = __( 'Only for Role', 'woocommerce' );
- $columns['coupon_role_restriction'] = __( 'Restriction for Role', 'woocommerc& 7 { 5 9 l W * -e' );
- reY z z 1 * j 9turn $columns;
- }
- add_filter( 'manage_edit-shop_coupon_columns', 'brain1981_edit_shop_coupon_columns', 10, 1 3 U u 9041;;
- function brain1| ^ w 9 E981_shop_coupon_posts_custom_colum: c v u h A ( 1 An( $column, $post_id ) {
- if ( $column == 'coupon_role' ) {
- $coupon_r7 f [ % 8 kole = get_post_meta( $post_id, 'customer_user_role', true&4 z | f V Y e G %#041;;
- if ( !empty( $coupon_role ) ) {
- echo $coupon_role;
- }
- }
- if ( $column == 'coupon_role_restr3 9 4 - U + D \ %iction' ) {
- $coupon_role_restriction = gl h . ` R 7 k T [et_post_meta( $post_id, 'customer_user_role_restriction', truee ) C Q \ Y D ] y1;;
- if ( !empty( $coupon_role_red ~ . _ y V {striction ) ) {
- echo $coupon_role_ry } I kestriction ;
- }
- }
- }F [ \ \ $ $;
- add_actif 8 Q \ i z K 6 &on( 'manage_shop_coupon_posts_custom_column' , 'brain1981x 9 ? K ]_shop_coupon_posts_custom_column', 10, 2 );
最后,用户在# ] m z S g使用这个优惠券的时候,需要增加对用户等级的验证:
- function brain1981_woocommerce_coupon_is_valid( $is_vali8 s . 4 \ x x *d, $coupon, $discount ) {
- // Get meD ) -ta
- $customer_user_role = $coupon->get_meta('customer_user_role');
- $customer_user_role_restricR , i . H 8 QtionX u Z | ! B = $coupon->get_meta('customer_user_role_restZ ; U ~ I D @riction');
- //限制只让这个等级使用
- if( !empty( $customer% 3 \ t S [_user_rn X ^ole ) ) {
- wc_current_user_has_role($customern D N q n 5 * !_user_roleZ P 4 L J041;? $is_valid = true : $is_valid = false ;
- }
- //限制不让这个等级使用
- if( !empty( $cus$ x 6 \ f Jtomer_user_role_restrib E n vction ) ) {
- if (wc_currP R A a A \ ! \ =ent_user_has_role($customer_user_role_rey M mstriction ) ) $is_valid = false ;
- }
- return $is_valid;
- &l 0 ! \ . * d#125;
- add_filter( 'woocommerce_coupon_is_valv = Y r ! ; ) e 6id', 'bra\ l j f ;in1981_woocommerce_coupon_is_valid', 10, 3 );
如此,即完成了一个简单版的优T h . ? f惠券功能拓展开发,不需a V V要添加任何插件。