Last active
June 28, 2020 15:19
-
-
Save gabrielmerovingi/8700026 to your computer and use it in GitHub Desktop.
This custom shortcode allows your users to convert their myCRED points into a WooCommerce coupon, in order to give themselves a discount or partial payment on their order. In order for this to work, you need to set an exchange rate between points and your store currency and select. Requires myCRED 1.6+ and WooCommerce 2.4+
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Convert myCRED Points into WooCommerce Coupon | |
* Requires myCRED 1.4 or higher! | |
* @version 1.3.1 | |
*/ | |
add_shortcode( 'mycred_to_woo_coupon', 'mycred_pro_render_points_to_coupon' ); | |
function mycred_pro_render_points_to_coupon( $atts, $content = NULL ) { | |
// Users must be logged in | |
if ( ! is_user_logged_in() ) | |
return 'You must be logged in to generate store coupons.'; | |
// myCRED must be enabled | |
if ( ! function_exists( 'mycred' ) ) | |
return 'myCRED must be enabled to use this shortcode'; | |
extract( shortcode_atts( array( | |
'exchange' => 1, | |
'minimum' => 0, | |
'maximum' => 0, | |
'type' => 'mycred_default', | |
'button_label' => 'Create Coupon', | |
'before_tax' => 'yes', | |
'free_shipping' => 'no' | |
), $atts ) ); | |
// Load myCRED | |
$mycred = mycred( $type ); | |
// Prep | |
$error = $code = false; | |
$output = ''; | |
$user_id = get_current_user_id(); | |
// No need to show this for excluded users | |
if ( $mycred->exclude_user( $user_id ) ) return $content; | |
$balance = $mycred->get_users_balance( $user_id ); | |
// Form submission | |
if ( isset( $_POST['mycred_to_woo'] ) && wp_verify_nonce( $_POST['mycred_to_woo']['token'], 'points-to-woo-coupon' ) ) { | |
// Make sure amounts are always positive | |
$amount = abs( $_POST['mycred_to_woo']['amount'] ); | |
// Exchange rate | |
$value = wc_format_decimal( ( $amount*$exchange ), '' ); | |
// Make sure amount is not zero | |
if ( $amount == $mycred->zero() ) | |
$error = 'Amount can not be zero'; | |
// If we are enforcing a minimum | |
if ( $minimum > 0 && $amount < $minimum ) | |
$error = sprintf( 'Amount must be minimum %s', $mycred->format_creds( $minimum ) ); | |
// If we are enforcing a maximum | |
elseif ( $maximum > 0 && $amount > $maximum ) | |
$error = sprintf( 'Amount can not be higher than %s', $mycred->format_creds( $maximum ) ); | |
// Make sure user has enough points | |
if ( $amount > $balance ) | |
$error = 'Insufficient Funds. Please try a lower amount'; | |
// If no errors | |
if ( $error === false ) { | |
// Create Woo Coupon | |
$code = strtolower( wp_generate_password( 12, false, false ) ); | |
$new_coupon_id = wp_insert_post( array( | |
'post_title' => $code, | |
'post_content' => '', | |
'post_status' => 'publish', | |
'post_author' => 1, | |
'post_type' => 'shop_coupon' | |
) ); | |
// Deduct points from user | |
$mycred->add_creds( | |
'points_to_coupon', | |
$user_id, | |
0-$amount, | |
'%plural% conversion into store coupon: %post_title%', | |
$new_coupon_id, | |
array( 'ref_type' => 'post', 'code' => $code ), | |
$type | |
); | |
$balance = $balance-$amount; | |
$balance = $mycred->number( $balance ); | |
// Update Coupon details | |
update_post_meta( $new_coupon_id, 'discount_type', 'fixed_cart' ); | |
update_post_meta( $new_coupon_id, 'coupon_amount', $value ); | |
update_post_meta( $new_coupon_id, 'individual_use', 'no' ); | |
update_post_meta( $new_coupon_id, 'product_ids', '' ); | |
update_post_meta( $new_coupon_id, 'exclude_product_ids', '' ); | |
// Make sure you set usage_limit to 1 to prevent duplicate usage!!! | |
update_post_meta( $new_coupon_id, 'usage_limit', 1 ); | |
update_post_meta( $new_coupon_id, 'usage_limit_per_user', 1 ); | |
update_post_meta( $new_coupon_id, 'limit_usage_to_x_items', '' ); | |
update_post_meta( $new_coupon_id, 'usage_count', '' ); | |
update_post_meta( $new_coupon_id, 'expiry_date', '' ); | |
update_post_meta( $new_coupon_id, 'apply_before_tax', ( in_array( $before_tax, array( 'no', 'yes' ) ) ? $before_tax : 'yes' ) ); | |
update_post_meta( $new_coupon_id, 'free_shipping', ( in_array( $free_shipping, array( 'no', 'yes' ) ) ? $free_shipping : 'no' ) ); | |
update_post_meta( $new_coupon_id, 'product_categories', array() ); | |
update_post_meta( $new_coupon_id, 'exclude_product_categories', array() ); | |
update_post_meta( $new_coupon_id, 'exclude_sale_items', 'no' ); | |
update_post_meta( $new_coupon_id, 'minimum_amount', '' ); | |
update_post_meta( $new_coupon_id, 'customer_email', array() ); | |
} | |
} | |
// Show users current balance | |
$output .= ' | |
<p>Your current balance is: ' . $mycred->format_creds( $balance ) . '</p>'; | |
// Error | |
if ( $error !== false ) | |
$output .= '<p style="color:red;">' . $error . '</p>'; | |
// Success | |
elseif ( $code !== false ) | |
$output .= '<p>Your coupon code is: <strong>' . $code . '</strong></p>'; | |
// The form for those who have points | |
if ( $balance > $mycred->zero() ) | |
$output .= ' | |
<form action="" method="post"> | |
<input type="hidden" name="mycred_to_woo[token]" value="' . wp_create_nonce( 'points-to-woo-coupon' ) . '" /> | |
<label>Amount</label> | |
<input type="text" size="5" name="mycred_to_woo[amount]" value="" /> | |
<input type="submit" name="submit" value="' . $button_label . '" /> | |
</form>'; | |
// Not enough points | |
else | |
$output .= '<p>Not enough points to create coupons.</p>'; | |
return $output; | |
} |
Hi,
This is a great script!
May I know where or how do I set the requirements for user to convert?
- limit the number of times to convert, to prevent user separate the cart to make purchase
- the promo code to that particular user
- set expiry date. and if once expired, the points will return back to the user
Thanks!
hey, great snippet! is it possible that this is only possible for a few specific products? maybe id = 111, 234 & 6096?
Tranks from Germany;)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
J ai mis le code en functions.php
[mycred_to_woo_coupon] sur ma page
j ai activer payer par mes points
rien ne se passe