以下不是只插入常规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网站上使用,那对我来说将是一个很棒的学习。