我一直在努力做到这一点,以便可以更新使用 WooCommerce产品插件在购物篮/购物车页面上添加的自定义字段(每种产品)。
我确实有一个方法可以用作测试,但这确实是一个很好的解决方案,并且大多数都是测试/错误代码。由于某种原因,它也只能第二次工作-好像高速缓存正在中断它! 它将通过文本区域进行更改,但是我现在设置了一个值,以查看是否可以使用它。
因此,为澄清起见,在第一次提交时,什么都没有发生,就是第二次更新产品,但是现在它不更新属性,而是更新数量等(当我在代码中添加值时),但是属性。
我已将其设置为以后删除产品,但是删除该属性时它将失去该属性,因此我暂时将重复项留在那里,直到修复了更新页面所需的两次更新为止!
有没有人可以看到的东西可以指引我更快地解决问题?非常感谢您的帮助!
从注释中可以看到,我一直在尝试几种方法,但是一直失败!
<?php
if ( ! empty( $_POST['update_cart'] ) ) {
$cart_totals = isset( $_POST['cart'] ) ? $_POST['cart'] : '';
if ( sizeof( $woocommerce->cart->get_cart() ) > 0 ) {
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
if ( isset( $cart_totals[ $cart_item_key ]['addons'] ) ) {
WC()->cart->remove_cart_item($cart_item_key);
#print_r($woocommerce->cart->cart_contents[ $cart_item_key ]['addons']);
#$cart_item['addons'] = array('name' => 'Add your message', 'value' => 'testing the message box', 'price' => 0, 'field_name' => $cart_item['product_id'].'-add-your-message-1', 'field_type' => 'custom_textarea', 'price_type' => 'quantity_based' );
$data = array('name' => 'Add your message', 'value' => 'testing the message box', 'price' => 0, 'field_name' => $cart_item['product_id'].'-add-your-message-1', 'field_type' => 'custom_textarea', 'price_type' => 'quantity_based' );
#WC()->cart->add_to_cart($cart_item['product_id'], $cart_item['quantity'], $cart_item['variation_id'], $cart_item['addons']);
WC()->cart->add_to_cart($cart_item['product_id'], $cart_item['quantity'], $cart_item['variation_id'], $cart_item['addons']);
#$woocommerce->cart->cart_contents[$cart_item_key]['addons'][0]['value'] = 'test';
$woocommerce->cart->cart_contents[$cart_item]['addons'] = $data;
}
}
}
}
编辑: 下面是更新每个项目的消息框,这很棒,而且确实是所需的,只是试图使会话接受更新。该购物车是多页购物车,因为它是所请求的,因此,当您转到下一页/结帐页面时,您可以看到它已恢复为原始消息,并且可以在购物车会话中看到它。另外,如果您只是刷新页面,则页面会还原(在更新页面之后)。
我尝试通过WC()-> session-> set进行编辑,但是我认为我设置的位置错误!我得到了一些会话设置,但是没有设置正确的条目!
add_action('woocommerce_update_cart_action_cart_updated', function ($cartUpdated) {
// loop through cart items, passing the $item array by reference, so it can be updated
foreach (WC()->cart->cart_contents as $key => &$item) {
// set the values of the addons array as required
$test = $_POST['cart'][$key]['addons'];
$item['addons'][0]['value'] = $test;
#$session = WC()->session;
#print_r($session->cart);
print_r(WC()->session->get( 'cart'));
}
});
编辑-工作代码: 谢谢@benJ的解决方案,非常有帮助!需要设置会话,但不是我认为必须设置的方式!
//钩上woocommerce_update_cart_action_cart_updated add_action('woocommerce_update_cart_action_cart_updated',函数($ cartUpdated){
// loop through cart items, passing the $item array by reference, so it can be updated
foreach (WC()->cart->cart_contents as $key => &$item) {
// set the values of the addons array as required
$addon = $_POST['cart'][$key]['addons'];
$item['addons'][0]['value'] = $addon;
// set the session
WC()->cart->set_session();
}
});
欢呼 伊斯坎德尔
答案 0 :(得分:0)
如果我正确理解了您的问题,则您想在更新购物车时更新每个产品上的插件字段。
这可以通过在woocommerce_update_cart_action_cart_updated
上添加一个钩子并根据需要编辑购物车项目来实现。
// hook on woocommerce_update_cart_action_cart_updated
add_action('woocommerce_update_cart_action_cart_updated', function ($cartUpdated) {
// loop through cart items, passing the $item array by reference, so it can be updated
foreach (WC()->cart->cart_contents as $key => &$item) {
// set the values of the addons array as required
$item['addons'][0]['value'] = 'your message here';
}
});
如果您只想对单个产品执行此操作,则可以在迭代产品时检查它们的其他值。