将“Add-to-Cart”按钮合并为一个“Add-all-to-Cart”按钮

时间:2013-04-17 作者:DrizzlyOwl

我试图实现的是有一个“添加到购物车”按钮,可以将目录页面上的多个产品的选定数量添加到购物篮中。

以下是我的目标图像:

example

我发现输出现有按钮的代码具有以下代码:

echo apply_filters(
    \'woocommerce_loop_add_to_cart_link\',
    sprintf(\'<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="%s button product_type_%s">%s</a>\',
        esc_url( $link[\'url\'] ),
        esc_attr( $product->id ),
        esc_attr( $product->get_sku() ),
        esc_attr( $link[\'class\'] ),
        esc_attr( $product->product_type ),
        esc_html( $link[\'label\'] ) ),
    $product,
    $link
);
我知道有一种方法可以使用jQuery通过循环一次提交每个表单,但由于我的知识有限,我认为我无法实现它。

或者,如果有一个自定义按钮,可以为每个产品及其相应数量提交多个表单,从长远来看,这可能会使事情变得更容易。

2 个回复
SO网友:generousdesigner

可能分组的产品类型就是您想要的。

您可以创建分组产品,然后向其中添加子产品。一次单击即可添加一个分组产品(包含子产品)。

看见WooThemes docs.

Edit:

如果不是您想要的,请尝试使用jQuery搜索提交多个表单(可能是this one), 看看关于AJAX添加到购物车的问题:

Woocommerce - Add a product to cart programmatically via JS or PHP

SO网友:Cosy

以下不是只插入常规WooCommerce目录页的解决方案。然而,这很容易成为试图实现这一目标的人的基础。

Background: 我正在构建一个Angular/JS应用程序以加载到存档产品页面,它将处理包括购物车在内的所有内容,直到用户准备好进行结帐。。。此时,我需要一个Ajax调用,将整个购物车一次性转储到“真正的”WooCommerce购物车中,然后开始结帐。我努力做到彻底,几乎可以使用常规WooCommerce页面,但我以前从未编写过PHP。此外,我不支持任何非JS用户,也没有单独的产品页面。

有几个插件声称可以做到这一点,但我已经检查了它们,并且所有插件都是通过Ajax“添加到购物车”,一次一个产品。我的感觉是,这是BS,对于大量项目来说效率很低。

我的解决方案是扩展WC\\u AJAX类,并向其添加一个新方法来处理多个产品&;数量,一次呼叫完成。

我跟踪了这个excellent tutorial并实现了我自己的方法。

我按照著名的教程扩展了这个类,并添加了一个方法multiple_add_to_cart 如下所示(如果您不使用ChromePhp进行调试,只需删除这些行即可):

public static function multiple_add_to_cart() {
    ob_start();
    /*
    *Decode json to a post varioable
    */
    if ($_SERVER[\'REQUEST_METHOD\'] == \'POST\' && empty($_POST)) {
        $_POST = json_decode(file_get_contents(\'php://input\'), true);
        $products = $_POST[\'products\'];
    } else {
        $products = $POST[\'products\'];
    }
    $errors = false;
    $errorArr = array();
    /* for each product, json decode data & deal with it as per original add to cart function */
    foreach ($products as $product) {
        $prod = json_decode($product);
        ChromePhp::log("Prod: " . $prod->id . " - Qty: " . $prod->qty);
        $product_id        = apply_filters( \'woocommerce_add_to_cart_product_id\', absint( $prod->id ) );
        $quantity          = empty( $prod->qty ) ? 1 : wc_stock_amount( $prod->qty );
        $passed_validation = apply_filters( \'woocommerce_add_to_cart_validation\', true, $product_id, $quantity );
        $product_status    = get_post_status( $product_id );

        if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity ) && \'publish\' === $product_status ) {

        ChromePhp::log("Added!");
        do_action( \'woocommerce_ajax_added_to_cart\', $product_id );

        } else {
            /*
            * If product had errors add it to error array for output at end - to inspect later with js.
            */
            $errors = true;
            $object = (object) [\'id\' => $product_id, \'valid\' => $passed_validation, \'Status\' => $product_status];
            $errorArray[] = $object;
        }
    }

    if($errors) {
        ChromePhp::log("There were errors!" . $errorArray);
        wp_send_json( $errorArray );
    } else {
        // Return fragments if you like but no use to me.
        //self::get_refreshed_fragments();

        $suc = array(
            \'error\'  => false,
        );
        wp_send_json( $suc );
    }

    die();
}
然后,我用Ajax调用Angular/JS中的服务,因此:

var products = [];
        var p1 = {};
        p1[\'id\'] = \'6147\';
        p1[\'qty\'] = \'3\';
        products.push(JSON.stringify(p1));

        var p2 = {};
        p2[\'id\'] = \'6147\';
        p2[\'qty\'] = \'4\';
        products.push(JSON.stringify(p2));

        var p3 = {};
        p3[\'id\'] = \'6157\'; // !Doesnt exist !
        p3[\'qty\'] = \'3\';
        products.push(JSON.stringify(p3));

        $http({
            method: \'POST\',
            url: sitePath,
            headers: {
                \'Content-type\': \'application/json\'
            },
            params: {
                \'wc-ajax\': \'multiple_add_to_cart\'
            },
            data: {
                \'products\': products
            }
        }).then(function(response) {
            console.log(response);
            // this callback will be called asynchronously
            // when the response is available
        }, function(response) {
            console.log(response);
            // called asynchronously if an error occurs
            // or server returns response with an error status.
        });
我预计,我将继续向Ajax类添加更多函数,以处理我想从应用程序中与WooCommerce通信的任何其他内容。。。如果你想要全班的复印件,请喊我一声。

如果有任何PHP大师可以帮助清理我的代码,使其更具通用性,或者帮助将其移植到一个功能强大的“插件”中,以便在任何WooCommerce网站上使用,那对我来说将是一个很棒的学习。

结束

相关推荐

Combining wordpress themes

有没有办法在不使用插件呈现不同主题的页面的情况下组合两个Wordpress主题,如果有,最有效的方法是什么?它是否像复制和粘贴一个主题的功能一样简单。php(和其他文件)进入第一个主题?我是否制作儿童主题?我正试图为全球的清洁能源计划建立一个数据库,并且喜欢我购买的其中一个主题的地图功能。然而,一旦你通过地图,主题就不是很好用,也不能容纳很多信息。这就是第二个主题。如果可能的话,我想保留这两个主题的功能。