我正在尝试创建一个"产品兑换页面,如SitePoint上的this tutorial所示。
问题是产品确实已添加到购物车中,您可以继续结帐,但与优惠券代码相关的折扣不会自动应用。在我创建的优惠券代码中,该值设置为100%折扣。
您可以通过&#34再次申请优惠券代码;您是否有优惠券代码"在结帐页面上飞出来,但这违背了整个目的。
我也没有让这段代码开始工作,但我能够弄明白:
// Check coupon to make determine if its valid or not
if( ! $coupon->id && ! isset( $coupon->id ) ) {
...Rest of code here...
应该是:
// Check coupon to make determine if its valid or not
if( ! $coupon->id && ! isset( $coupon_id ) ) {
请注意第二个Not isset变量名称。也许这确实有效,但不是处理事情的正确方法,大家都知道,但是我。
可悲的是,我已经离开了我的舒适区域,但是我愿意通过犯错误并弄清楚如何解决这些错误来学习,并向那些比我更聪明和/或更先进的人学习。在我直接的朋友中,我没有任何人可以随时得到任何其他答案:"嗯?!?",所以我在Stackoverflow上给它一个镜头。只有SitePoint教程的链接可能不受欢迎,所以这里是我正在使用的完整代码:
在functions.php中添加了Ajax处理程序
add_action( 'wp_ajax_spyr_coupon_redeem_handler', 'spyr_coupon_redeem_handler' );
add_action( 'wp_ajax_nopriv_spyr_coupon_redeem_handler', 'spyr_coupon_redeem_handler' );
优惠券登录也添加到functions.php
function spyr_coupon_redeem_handler() {
// Get the value of the coupon code
$code = $_REQUEST['coupon_code'];
// Check coupon code to make sure is not empty
if( empty( $code ) || !isset( $code ) ) {
// Build our response
$response = array(
'result' => 'error',
'message' => 'Code text field can not be empty.'
);
header( 'Content-Type: application/json' );
echo json_encode( $response );
// Always exit when doing ajax
exit();
}
// Create an instance of WC_Coupon with our code
$coupon = new WC_Coupon( $code );
// Check coupon to make determine if its valid or not
if( ! $coupon->id && ! isset( $coupon_id ) ) {
// Build our response
$response = array(
'result' => 'error',
'message' => 'Invalid code entered. Please try again.'
);
header( 'Content-Type: application/json' );
echo json_encode( $response );
// Always exit when doing ajax
exit();
} else {
// Attempting to add the coupon code as a discount.
WC()->cart->add_discount( $code );
// Coupon must be valid so we must
// populate the cart with the attached products
foreach( $coupon->product_ids as $prod_id ) {
WC()->cart->add_to_cart( $prod_id );
}
// Build our response
$response = array(
'result' => 'success',
'href' => WC()->cart->get_cart_url()
);
header( 'Content-Type: application/json' );
echo json_encode( $response );
// Always exit when doing ajax
exit();
}
}
jQuery表单提交代码,通过functions.php
中注册的Ajax处理程序排队jQuery( document ).ready( function() {
jQuery( '#ajax-coupon-redeem input[type="submit"]').click( function( ev ) {
// Get the coupon code
var code = jQuery( 'input#coupon').val();
// We are going to send this for processing
data = {
action: 'spyr_coupon_redeem_handler',
coupon_code: code
}
// Send it over to WordPress.
jQuery.post( woocommerce_params.ajax_url, data, function( returned_data ) {
if( returned_data.result == 'error' ) {
jQuery( 'p.result' ).html( returned_data.message );
} else {
// Hijack the browser and redirect user to cart page
window.location.href = returned_data.href;
}
})
// Prevent the form from submitting
ev.preventDefault();
});
});
先谢谢你指点我正确的方向。
答案 0 :(得分:1)
更新:此时我获得了想要的功能。
需要做的是添加:
// Let's add the discount to the cart.
global $woocommerce;
WC()->cart->add_discount( $code );
在foreach声明中。完整的else语句现在看起来像这样:
} else {
// Coupon must be valid so we must
// populate the cart with the attached products
foreach( $coupon->product_ids as $prod_id ) {
WC()->cart->add_to_cart( $prod_id );
// Let's add the discount to the cart.
global $woocommerce;
WC()->cart->add_discount( $code );
}
// Build our response
$response = array(
'result' => 'success',
'href' => WC()->cart->get_cart_url()
);
header( 'Content-Type: application/json' );
echo json_encode( $response );
// Always exit when doing ajax
exit();
我仍然不确定这是否是正确处理此问题的方法,但它似乎有效。
例如,我调用(?!)全局$woocommerce
变量,但在下面我使用全局(?!)类WC()
添加优惠券。不确定这是否像它一样干净和合乎逻辑。
如果有人知道更好/更清洁的方式,请告诉我!我很高兴向你们学习,也许有一天,我可能能够回报那些知道的人。