将WooCommerce优惠券代码应用于结帐

时间:2017-02-22 19:19:56

标签: php jquery ajax wordpress woocommerce

我正在尝试创建一个"产品兑换页面,如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();
    }); 
});

先谢谢你指点我正确的方向。

1 个答案:

答案 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()添加优惠券。不确定这是否像它一样干净和合乎逻辑。

如果有人知道更好/更清洁的方式,请告诉我!我很高兴向你们学习,也许有一天,我可能能够回报那些知道的人。