2013-08-06 10:41:20 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* Coupon Data
2013-08-06 10:41:20 +00:00
*
* Display the coupon data meta box .
*
2014-08-31 07:18:21 +00:00
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin / Meta Boxes
2013-08-06 10:41:20 +00:00
* @ version 2.1 . 0
*/
2014-09-20 20:05:06 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2013-08-06 10:41:20 +00:00
/**
2015-11-03 12:28:01 +00:00
* WC_Meta_Box_Coupon_Data Class .
2013-08-06 10:41:20 +00:00
*/
class WC_Meta_Box_Coupon_Data {
/**
2015-11-03 12:28:01 +00:00
* Output the metabox .
2016-01-04 21:31:36 +00:00
*
* @ param WP_Post $post
2013-08-06 10:41:20 +00:00
*/
public static function output ( $post ) {
wp_nonce_field ( 'woocommerce_save_data' , 'woocommerce_meta_nonce' );
2016-08-26 13:50:17 +00:00
$coupon = new WC_Coupon ( $post -> ID );
2013-08-06 10:41:20 +00:00
?>
< style type = " text/css " >
#edit-slug-box, #minor-publishing-actions { display:none }
</ style >
2013-10-18 17:10:55 +00:00
< div id = " coupon_options " class = " panel-wrap coupon_data " >
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
< div class = " wc-tabs-back " ></ div >
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
< ul class = " coupon_data_tabs wc-tabs " style = " display:none; " >
< ? php
$coupon_data_tabs = apply_filters ( 'woocommerce_coupon_data_tabs' , array (
'general' => array (
'label' => __ ( 'General' , 'woocommerce' ),
'target' => 'general_coupon_data' ,
2013-10-28 11:19:56 +00:00
'class' => 'general_coupon_data' ,
2013-10-18 17:10:55 +00:00
),
'usage_restriction' => array (
2016-10-12 10:16:30 +00:00
'label' => __ ( 'Usage restriction' , 'woocommerce' ),
2013-10-18 17:10:55 +00:00
'target' => 'usage_restriction_coupon_data' ,
'class' => '' ,
),
'usage_limit' => array (
2016-10-12 10:16:30 +00:00
'label' => __ ( 'Usage limits' , 'woocommerce' ),
2013-10-18 17:10:55 +00:00
'target' => 'usage_limit_coupon_data' ,
'class' => '' ,
2016-08-27 01:46:45 +00:00
),
2013-10-18 17:10:55 +00:00
) );
foreach ( $coupon_data_tabs as $key => $tab ) {
2013-10-21 20:13:52 +00:00
?> <li class="<?php echo $key; ?>_options <?php echo $key; ?>_tab <?php echo implode( ' ' , (array) $tab['class'] ); ?>">
2013-10-18 17:10:55 +00:00
< a href = " #<?php echo $tab['target'] ; ?> " >< ? php echo esc_html ( $tab [ 'label' ] ); ?> </a>
</ li >< ? php
}
?>
</ ul >
< div id = " general_coupon_data " class = " panel woocommerce_options_panel " >< ? php
2013-08-06 10:41:20 +00:00
// Type
2014-01-15 03:58:07 +00:00
woocommerce_wp_select ( array ( 'id' => 'discount_type' , 'label' => __ ( 'Discount type' , 'woocommerce' ), 'options' => wc_get_coupon_types () ) );
2013-08-06 10:41:20 +00:00
// Amount
2013-11-12 17:43:30 +00:00
woocommerce_wp_text_input ( array ( 'id' => 'coupon_amount' , 'label' => __ ( 'Coupon amount' , 'woocommerce' ), 'placeholder' => wc_format_localized_price ( 0 ), 'description' => __ ( 'Value of the coupon.' , 'woocommerce' ), 'data_type' => 'price' , 'desc_tip' => true ) );
2013-08-06 10:41:20 +00:00
// Free Shipping
2016-08-30 12:30:05 +00:00
woocommerce_wp_checkbox ( array ( 'id' => 'free_shipping' , 'label' => __ ( 'Allow free shipping' , 'woocommerce' ), 'description' => sprintf ( __ ( 'Check this box if the coupon grants free shipping. A <a href="%s" target="_blank">free shipping method</a> must be enabled in your shipping zone and be set to require "a valid free shipping coupon" (see the "Free Shipping Requires" setting).' , 'woocommerce' ), 'https://docs.woocommerce.com/document/free-shipping/' ) ) );
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
// Expiry date
2016-09-30 21:16:41 +00:00
$expiry_date = $coupon -> get_date_expires () ? date ( 'Y-m-d' , $coupon -> get_date_expires () ) : '' ;
2016-10-24 07:31:07 +00:00
woocommerce_wp_text_input ( array ( 'id' => 'expiry_date' , 'value' => esc_attr ( $expiry_date ), 'label' => __ ( 'Coupon expiry date' , 'woocommerce' ), 'placeholder' => esc_attr__ ( 'YYYY-MM-DD' , 'woocommerce' ), 'description' => '' , 'class' => 'date-picker' , 'custom_attributes' => array ( 'pattern' => " [0-9] { 4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01]) " ) ) );
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
do_action ( 'woocommerce_coupon_options' );
?> </div>
< div id = " usage_restriction_coupon_data " class = " panel woocommerce_options_panel " >< ? php
echo '<div class="options_group">' ;
2013-08-06 10:41:20 +00:00
// minimum spend
2015-12-03 12:02:04 +00:00
woocommerce_wp_text_input ( array ( 'id' => 'minimum_amount' , 'label' => __ ( 'Minimum spend' , 'woocommerce' ), 'placeholder' => __ ( 'No minimum' , 'woocommerce' ), 'description' => __ ( 'This field allows you to set the minimum spend (subtotal, including taxes) allowed to use the coupon.' , 'woocommerce' ), 'data_type' => 'price' , 'desc_tip' => true ) );
2013-10-18 17:10:55 +00:00
2014-08-13 10:43:28 +00:00
// maximum spend
2015-12-03 12:02:04 +00:00
woocommerce_wp_text_input ( array ( 'id' => 'maximum_amount' , 'label' => __ ( 'Maximum spend' , 'woocommerce' ), 'placeholder' => __ ( 'No maximum' , 'woocommerce' ), 'description' => __ ( 'This field allows you to set the maximum spend (subtotal, including taxes) allowed when using the coupon.' , 'woocommerce' ), 'data_type' => 'price' , 'desc_tip' => true ) );
2014-08-08 11:38:58 +00:00
2013-10-18 17:10:55 +00:00
// Individual use
woocommerce_wp_checkbox ( array ( 'id' => 'individual_use' , 'label' => __ ( 'Individual use only' , 'woocommerce' ), 'description' => __ ( 'Check this box if the coupon cannot be used in conjunction with other coupons.' , 'woocommerce' ) ) );
// Exclude Sale Products
woocommerce_wp_checkbox ( array ( 'id' => 'exclude_sale_items' , 'label' => __ ( 'Exclude sale items' , 'woocommerce' ), 'description' => __ ( 'Check this box if the coupon should not apply to items on sale. Per-item coupons will only work if the item is not on sale. Per-cart coupons will only work if there are no sale items in the cart.' , 'woocommerce' ) ) );
2013-08-06 10:41:20 +00:00
echo '</div><div class="options_group">' ;
// Product ids
?>
2015-01-12 11:56:44 +00:00
< p class = " form-field " >< label >< ? php _e ( 'Products' , 'woocommerce' ); ?> </label>
2015-08-05 18:08:15 +00:00
< input type = " hidden " class = " wc-product-search " data - multiple = " true " style = " width: 50%; " name = " product_ids " data - placeholder = " <?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?> " data - action = " woocommerce_json_search_products_and_variations " data - selected = " <?php
2016-08-26 13:50:17 +00:00
$product_ids = $coupon -> get_product_ids ();
2015-01-12 11:56:44 +00:00
$json_ids = array ();
foreach ( $product_ids as $product_id ) {
$product = wc_get_product ( $product_id );
2015-04-13 15:31:18 +00:00
if ( is_object ( $product ) ) {
2015-03-28 14:09:43 +00:00
$json_ids [ $product_id ] = wp_kses_post ( $product -> get_formatted_name () );
}
2015-01-12 11:56:44 +00:00
}
2013-08-06 10:41:20 +00:00
2015-01-12 11:56:44 +00:00
echo esc_attr ( json_encode ( $json_ids ) );
2015-10-23 15:09:08 +00:00
?> " value="<?php echo implode( ',', array_keys( $json_ids ) ); ?>" /> <?php echo wc_help_tip( __( 'Products which need to be in the cart to use this coupon or, for "Product Discounts", which products are discounted.', 'woocommerce' ) ); ?></p>
2013-08-06 10:41:20 +00:00
< ? php
// Exclude Product ids
?>
2015-01-12 11:56:44 +00:00
< p class = " form-field " >< label >< ? php _e ( 'Exclude products' , 'woocommerce' ); ?> </label>
2015-08-05 18:08:15 +00:00
< input type = " hidden " class = " wc-product-search " data - multiple = " true " style = " width: 50%; " name = " exclude_product_ids " data - placeholder = " <?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?> " data - action = " woocommerce_json_search_products_and_variations " data - selected = " <?php
2016-08-26 13:50:17 +00:00
$product_ids = $coupon -> get_excluded_product_ids ();
2015-01-12 11:56:44 +00:00
$json_ids = array ();
foreach ( $product_ids as $product_id ) {
$product = wc_get_product ( $product_id );
2015-04-13 15:31:18 +00:00
if ( is_object ( $product ) ) {
2015-03-28 14:09:43 +00:00
$json_ids [ $product_id ] = wp_kses_post ( $product -> get_formatted_name () );
}
2015-01-12 11:56:44 +00:00
}
2013-08-06 10:41:20 +00:00
2015-01-12 11:56:44 +00:00
echo esc_attr ( json_encode ( $json_ids ) );
2015-10-23 15:09:08 +00:00
?> " value="<?php echo implode( ',', array_keys( $json_ids ) ); ?>" /> <?php echo wc_help_tip( __( 'Products which must not be in the cart to use this coupon or, for "Product Discounts", which products are not discounted.', 'woocommerce' ) ); ?></p>
2013-08-06 10:41:20 +00:00
< ? php
echo '</div><div class="options_group">' ;
// Categories
?>
2014-12-19 16:15:24 +00:00
< p class = " form-field " >< label for = " product_categories " >< ? php _e ( 'Product categories' , 'woocommerce' ); ?> </label>
2015-08-05 18:08:15 +00:00
< select id = " product_categories " name = " product_categories[] " style = " width: 50%; " class = " wc-enhanced-select " multiple = " multiple " data - placeholder = " <?php esc_attr_e( 'Any category', 'woocommerce' ); ?> " >
2013-08-06 10:41:20 +00:00
< ? php
2016-08-26 13:50:17 +00:00
$category_ids = $coupon -> get_product_categories ();
2015-01-12 11:56:44 +00:00
$categories = get_terms ( 'product_cat' , 'orderby=name&hide_empty=0' );
2014-08-31 07:18:21 +00:00
2014-01-15 04:02:29 +00:00
if ( $categories ) foreach ( $categories as $cat ) {
2013-08-06 10:41:20 +00:00
echo '<option value="' . esc_attr ( $cat -> term_id ) . '"' . selected ( in_array ( $cat -> term_id , $category_ids ), true , false ) . '>' . esc_html ( $cat -> name ) . '</option>' ;
2014-01-15 04:02:29 +00:00
}
2013-08-06 10:41:20 +00:00
?>
2015-10-23 15:09:08 +00:00
</ select > < ? php echo wc_help_tip ( __ ( 'A product must be in this category for the coupon to remain valid or, for "Product Discounts", products in these categories will be discounted.' , 'woocommerce' ) ); ?> </p>
2013-08-06 10:41:20 +00:00
< ? php
// Exclude Categories
?>
2014-01-15 04:02:29 +00:00
< p class = " form-field " >< label for = " exclude_product_categories " >< ? php _e ( 'Exclude categories' , 'woocommerce' ); ?> </label>
2015-08-05 18:08:15 +00:00
< select id = " exclude_product_categories " name = " exclude_product_categories[] " style = " width: 50%; " class = " wc-enhanced-select " multiple = " multiple " data - placeholder = " <?php esc_attr_e( 'No categories', 'woocommerce' ); ?> " >
2013-08-06 10:41:20 +00:00
< ? php
2016-08-26 13:50:17 +00:00
$category_ids = $coupon -> get_excluded_product_categories ();
2015-01-12 11:56:44 +00:00
$categories = get_terms ( 'product_cat' , 'orderby=name&hide_empty=0' );
2014-08-31 07:18:21 +00:00
2014-01-15 04:02:29 +00:00
if ( $categories ) foreach ( $categories as $cat ) {
2013-08-06 10:41:20 +00:00
echo '<option value="' . esc_attr ( $cat -> term_id ) . '"' . selected ( in_array ( $cat -> term_id , $category_ids ), true , false ) . '>' . esc_html ( $cat -> name ) . '</option>' ;
2014-01-15 04:02:29 +00:00
}
2013-08-06 10:41:20 +00:00
?>
2015-10-23 15:09:08 +00:00
</ select > < ? php echo wc_help_tip ( __ ( 'Product must not be in this category for the coupon to remain valid or, for "Product Discounts", products in these categories will not be discounted.' , 'woocommerce' ) ); ?> </p>
2013-08-06 10:41:20 +00:00
< ? php
echo '</div><div class="options_group">' ;
// Customers
2016-08-27 03:56:09 +00:00
woocommerce_wp_text_input ( array (
'id' => 'customer_email' ,
'label' => __ ( 'Email restrictions' , 'woocommerce' ),
'placeholder' => __ ( 'No restrictions' , 'woocommerce' ),
'description' => __ ( 'List of allowed emails to check against the customer\'s billing email when an order is placed. Separate email addresses with commas.' , 'woocommerce' ),
2016-09-02 01:51:31 +00:00
'value' => implode ( ', ' , ( array ) get_post_meta ( $post -> ID , 'customer_email' , true ) ),
2016-08-27 03:56:09 +00:00
'desc_tip' => true ,
'type' => 'email' ,
'class' => '' ,
'custom_attributes' => array (
2016-08-27 01:46:45 +00:00
'multiple' => 'multiple' ,
2016-08-27 03:56:09 +00:00
),
) );
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
echo '</div>' ;
2014-01-13 12:51:00 +00:00
do_action ( 'woocommerce_coupon_options_usage_restriction' );
2013-10-18 17:10:55 +00:00
?> </div>
< div id = " usage_limit_coupon_data " class = " panel woocommerce_options_panel " >< ? php
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
echo '<div class="options_group">' ;
// Usage limit per coupons
2016-08-27 03:56:09 +00:00
woocommerce_wp_text_input ( array (
'id' => 'usage_limit' ,
'label' => __ ( 'Usage limit per coupon' , 'woocommerce' ),
2016-10-24 07:31:07 +00:00
'placeholder' => esc_attr__ ( 'Unlimited usage' , 'woocommerce' ),
2016-08-27 03:56:09 +00:00
'description' => __ ( 'How many times this coupon can be used before it is void.' , 'woocommerce' ),
'type' => 'number' ,
'desc_tip' => true ,
'class' => 'short' ,
'custom_attributes' => array (
2016-09-01 10:43:31 +00:00
'step' => 1 ,
'min' => 0 ,
2016-08-27 03:56:09 +00:00
),
2016-09-01 10:43:31 +00:00
'value' => $coupon -> get_usage_limit () ? $coupon -> get_usage_limit () : '' ,
2016-08-27 03:56:09 +00:00
) );
2013-08-06 10:41:20 +00:00
2013-10-18 17:10:55 +00:00
// Usage limit per product
2016-08-27 03:56:09 +00:00
woocommerce_wp_text_input ( array (
'id' => 'limit_usage_to_x_items' ,
'label' => __ ( 'Limit usage to X items' , 'woocommerce' ),
2016-10-24 07:31:07 +00:00
'placeholder' => esc_attr__ ( 'Apply to all qualifying items in cart' , 'woocommerce' ),
2016-08-27 03:56:09 +00:00
'description' => __ ( 'The maximum number of individual items this coupon can apply to when using product discounts. Leave blank to apply to all qualifying items in cart.' , 'woocommerce' ),
'desc_tip' => true ,
'class' => 'short' ,
'type' => 'number' ,
'custom_attributes' => array (
2016-09-01 10:43:31 +00:00
'step' => 1 ,
'min' => 0 ,
2016-08-27 03:56:09 +00:00
),
2016-09-01 10:43:31 +00:00
'value' => $coupon -> get_limit_usage_to_x_items () ? $coupon -> get_limit_usage_to_x_items () : '' ,
2016-08-27 03:56:09 +00:00
) );
2013-10-01 10:48:27 +00:00
2013-10-18 17:10:55 +00:00
// Usage limit per users
2016-08-27 03:56:09 +00:00
woocommerce_wp_text_input ( array (
'id' => 'usage_limit_per_user' ,
'label' => __ ( 'Usage limit per user' , 'woocommerce' ),
2016-10-24 07:31:07 +00:00
'placeholder' => esc_attr__ ( 'Unlimited usage' , 'woocommerce' ),
2016-08-27 03:56:09 +00:00
'description' => __ ( 'How many times this coupon can be used by an invidual user. Uses billing email for guests, and user ID for logged in users.' , 'woocommerce' ),
'desc_tip' => true ,
'class' => 'short' ,
'type' => 'number' ,
'custom_attributes' => array (
2016-09-01 10:43:31 +00:00
'step' => 1 ,
'min' => 0 ,
2016-08-27 03:56:09 +00:00
),
2016-09-01 10:43:31 +00:00
'value' => $coupon -> get_usage_limit_per_user () ? $coupon -> get_usage_limit_per_user () : '' ,
2016-08-27 03:56:09 +00:00
) );
2013-08-06 10:41:20 +00:00
echo '</div>' ;
2014-01-13 12:51:00 +00:00
do_action ( 'woocommerce_coupon_options_usage_limit' );
2013-10-18 17:10:55 +00:00
?> </div>
2014-05-10 15:48:37 +00:00
< ? php do_action ( 'woocommerce_coupon_data_panels' ); ?>
2013-10-18 17:10:55 +00:00
< div class = " clear " ></ div >
2013-08-06 10:41:20 +00:00
</ div >
< ? php
}
/**
2015-11-03 12:28:01 +00:00
* Save meta box data .
2016-01-04 21:31:36 +00:00
*
* @ param int $post_id
* @ param WP_Post $post
2013-08-06 10:41:20 +00:00
*/
public static function save ( $post_id , $post ) {
global $wpdb ;
// Check for dupe coupons
2016-08-26 13:50:17 +00:00
$coupon_code = apply_filters ( 'woocommerce_coupon_code' , $post -> post_title );
2016-08-30 10:43:53 +00:00
$id_from_code = wc_get_coupon_id_by_code ( $coupon_code , $post_id );
if ( $id_from_code ) {
2013-08-06 10:41:20 +00:00
WC_Admin_Meta_Boxes :: add_error ( __ ( 'Coupon code already exists - customers will use the latest coupon with this code.' , 'woocommerce' ) );
2014-01-15 04:02:29 +00:00
}
2013-08-06 10:41:20 +00:00
2016-11-24 17:43:01 +00:00
$product_categories = isset ( $_POST [ 'product_categories' ] ) ? ( array ) $_POST [ 'product_categories' ] : array ();
$exclude_product_categories = isset ( $_POST [ 'exclude_product_categories' ] ) ? ( array ) $_POST [ 'exclude_product_categories' ] : array ();
2016-08-26 13:50:17 +00:00
$coupon = new WC_Coupon ( $post_id );
$coupon -> set_props ( array (
'code' => $post -> post_title ,
'discount_type' => wc_clean ( $_POST [ 'discount_type' ] ),
'amount' => wc_format_decimal ( $_POST [ 'coupon_amount' ] ),
2016-08-26 14:20:44 +00:00
'date_expires' => wc_clean ( $_POST [ 'expiry_date' ] ),
2016-08-26 13:50:17 +00:00
'individual_use' => isset ( $_POST [ 'individual_use' ] ),
'product_ids' => array_filter ( array_map ( 'intval' , explode ( ',' , $_POST [ 'product_ids' ] ) ) ),
'excluded_product_ids' => array_filter ( array_map ( 'intval' , explode ( ',' , $_POST [ 'exclude_product_ids' ] ) ) ),
'usage_limit' => absint ( $_POST [ 'usage_limit' ] ),
'usage_limit_per_user' => absint ( $_POST [ 'usage_limit_per_user' ] ),
'limit_usage_to_x_items' => absint ( $_POST [ 'limit_usage_to_x_items' ] ),
'free_shipping' => isset ( $_POST [ 'free_shipping' ] ),
2016-11-24 17:43:01 +00:00
'product_categories' => array_filter ( array_map ( 'intval' , $product_categories ) ),
'excluded_product_categories' => array_filter ( array_map ( 'intval' , $exclude_product_categories ) ),
2016-08-26 13:50:17 +00:00
'exclude_sale_items' => isset ( $_POST [ 'exclude_sale_items' ] ),
'minimum_amount' => wc_format_decimal ( $_POST [ 'minimum_amount' ] ),
'maximum_amount' => wc_format_decimal ( $_POST [ 'maximum_amount' ] ),
'email_restrictions' => array_filter ( array_map ( 'trim' , explode ( ',' , wc_clean ( $_POST [ 'customer_email' ] ) ) ) ),
) );
$coupon -> save ();
2014-02-23 15:27:27 +00:00
do_action ( 'woocommerce_coupon_options_save' , $post_id );
2013-08-06 10:41:20 +00:00
}
2014-01-15 03:57:41 +00:00
}