当另一个产品存在时,自动将商品添加到购物车

时间:2015-01-15 02:42:42

标签: php wordpress woocommerce product cart

我使用动态定价来折扣项目以互相免费,我想避免让客户将免费产品添加为单独的步骤并让系统添加它。

我从snippet开始,但当项目存在时,我无法让它工作

这是我到目前为止所得到的:

<?php

function add_product_to_cart() {
  if ( ! is_admin() ) {
        global $woocommerce;
        $product_id_gift = 2287;
        $found = false;
        $product_id = 30;
        $incart_free = false;

        foreach($woocommerce->cart->get_cart() as $cart_item_key => $values ) {
            $_product = $values['data'];
                if ( $_product->id == $product_id ){
                $incart_free = true;
            }
        return $incart_free;
}
        if( $incart_free == true ) {
            //check if product already in cart
            if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
                foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
                    $_product = $values['data'];
                    if ( $_product->id == $product_id_gift )
                        $found = true;
                }
                // if product not found, add it
                if ( $found != true  )
                    $woocommerce->cart->add_to_cart( $product_id_gift );
            } else {
                // if no products in cart, add it
                $woocommerce->cart->add_to_cart( $product_id_gift );
            }
        }
    }
}

add_action( 'init', 'add_product_to_cart' );

?>

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么如果购物车中有某些商品,您可以免费提供商品。这是我的解决方案:

1. 在Wordpress中为WooCommerce创建优惠券。优惠券金额 100%和折扣类型&#39;产品%折扣&#39;。转到使用限制 - &gt;产品并指定您想要免费的特定产品,这将使优惠券仅适用于该特定产品

2. 创建一个第一个检查购物车中是否存在特定商品的功能,如果有,则将您想要空闲的商品添加并折扣到购物车。下面的代码可以解决这个问题(我测试过它并且工作正常,尽管它不是最干净的解决方案):

var static = require('node-static');
var fs = require('fs');
var wwwpath = './www';
var fileServer = new static.Server(wwwpath);

require('http').createServer(function (request, response) {
    request.addListener('end', function () {
        fileServer.serve(request, response, function (err, result) {
            var filepath = wwwpath + request.url;

            // browser is checking cache
            if (request.headers && request.headers['if-modified-since']) {
                var ifModifiedSince = new Date(request.headers['if-modified-since']);
                var stats = fs.statSync(filepath);

                // file has been edited since
                if (stats.mtime.getTime() > (ifModifiedSince.getTime() + 1000)) {  // +1000 Date header is no millisecond accurate
                    response.writeHead(304, 'Not Modified');
                    response.end();
                }
            }

            // file not found / ...
            if (err) {
                response.writeHead(err.status, err.headers);
                response.end();
            }
        });
    }).resume();
}).listen(8080);

希望这有帮助!

答案 1 :(得分:0)

你的逻辑在这里是完全错误的,因为if ( $_product->id == $product_id_gift )永远不会是真的,因为 product_id 都不同。

所以逻辑应该是:

1。检查添加到购物车中的所有商品
2。检查购物车中是否有免费产品的产品 3. 如果是,则只需添加免费产品。

所以code会是这样的:

    add_action( 'init', 'add_product_to_cart' );

    function add_product_to_cart() {
    if ( ! is_admin() ) {
    global $woocommerce;
    $product_id = 30; //Your product ID here
    $free_product_id = 2287; //Free product ID here
    $found = false;
    //check if product already in cart
    if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
    $_product = $values['data'];
    if ( $_product->id == $product_id ){
    $found = true;
    }
    }
    // if product not found, add it
    if ( $found )
    $woocommerce->cart->add_to_cart( $free_product_id );
    }
    }
    }

注意:未经测试。也让我知道输出。