self::norm_decimal( (string) $coupon->get_amount() ), 'discount_type' => (string) $coupon->get_discount_type(), 'product_ids' => array_map( 'intval', (array) $coupon->get_product_ids() ), 'excluded_product_ids' => array_map( 'intval', (array) $coupon->get_excluded_product_ids() ), 'product_categories' => array_map( 'intval', (array) $coupon->get_product_categories() ), 'excluded_product_categories' => array_map( 'intval', (array) $coupon->get_excluded_product_categories() ), 'individual_use' => (bool) $coupon->get_individual_use(), 'free_shipping' => (bool) $coupon->get_free_shipping(), 'minimum_amount' => self::norm_decimal( (string) $coupon->get_minimum_amount() ), 'maximum_amount' => self::norm_decimal( (string) $coupon->get_maximum_amount() ), 'date_expires' => $coupon->get_date_expires() ? (string) $coupon->get_date_expires()->date( 'Y-m-d H:i:s' ) : '', 'usage_limit' => (int) $coupon->get_usage_limit(), 'usage_limit_per_user' => (int) $coupon->get_usage_limit_per_user(), 'limit_usage_to_x_items' => (int) $coupon->get_limit_usage_to_x_items(), 'exclude_sale_items' => (bool) $coupon->get_exclude_sale_items(), 'status' => method_exists( $coupon, 'get_status' ) ? (string) $coupon->get_status() : '', ); return self::hash_payload( $payload ); } /** * @param array $payload Material payload. * @return string */ public static function hash_payload( array $payload ) { return hash( 'sha256', (string) wp_json_encode( self::normalize_payload( $payload ) ) ); } /** * @param array $payload Raw. * @return array */ public static function normalize_payload( array $payload ) { $sort_ints = static function ( array $ids ) { $ids = array_values( array_unique( array_map( 'intval', $ids ) ) ); sort( $ids, SORT_NUMERIC ); return $ids; }; return array( 'amount' => self::norm_decimal( isset( $payload['amount'] ) ? (string) $payload['amount'] : '0' ), 'discount_type' => isset( $payload['discount_type'] ) ? (string) $payload['discount_type'] : '', 'product_ids' => $sort_ints( isset( $payload['product_ids'] ) ? (array) $payload['product_ids'] : array() ), 'excluded_product_ids' => $sort_ints( isset( $payload['excluded_product_ids'] ) ? (array) $payload['excluded_product_ids'] : array() ), 'product_categories' => $sort_ints( isset( $payload['product_categories'] ) ? (array) $payload['product_categories'] : array() ), 'excluded_product_categories' => $sort_ints( isset( $payload['excluded_product_categories'] ) ? (array) $payload['excluded_product_categories'] : array() ), 'individual_use' => ! empty( $payload['individual_use'] ), 'free_shipping' => ! empty( $payload['free_shipping'] ), 'minimum_amount' => self::norm_decimal( isset( $payload['minimum_amount'] ) ? (string) $payload['minimum_amount'] : '' ), 'maximum_amount' => self::norm_decimal( isset( $payload['maximum_amount'] ) ? (string) $payload['maximum_amount'] : '' ), 'date_expires' => isset( $payload['date_expires'] ) ? (string) $payload['date_expires'] : '', 'usage_limit' => isset( $payload['usage_limit'] ) ? (int) $payload['usage_limit'] : 0, 'usage_limit_per_user' => isset( $payload['usage_limit_per_user'] ) ? (int) $payload['usage_limit_per_user'] : 0, 'limit_usage_to_x_items' => isset( $payload['limit_usage_to_x_items'] ) ? (int) $payload['limit_usage_to_x_items'] : 0, 'exclude_sale_items' => ! empty( $payload['exclude_sale_items'] ), 'status' => isset( $payload['status'] ) ? (string) $payload['status'] : '', ); } /** * @param string $value Raw. * @return string */ public static function norm_decimal( $value ) { return OrderMaterialHasher::norm_decimal( $value ); } }