更新购物篮/购物车页面WooCommerce产品附加组件上的购物篮自定义属性

时间:2020-07-03 20:02:47

标签: php wordpress woocommerce shopping-cart

我一直在努力做到这一点,以便可以更新使用 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();
}

});

欢呼 伊斯坎德尔

1 个答案:

答案 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';
    }
});

如果您只想对单个产品执行此操作,则可以在迭代产品时检查它们的其他值。