如何在Woocommerce中向购物车会话数组添加自定义文本框值

时间:2014-03-18 04:52:27

标签: woocommerce

我们需要从cart_session中的Add to cart页面获取文本输入,并将其显示在view cart页面中,并将其保存在数据库中。我尝试将其添加到:

$this->cart_contents[$cart_item_key] = apply_filters( 'woocommerce_add_cart_item', array_merge( $cart_item_data, array('' => '','custom_text' => $_POST['custom_txt']) ), $cart_item_key );

它将custom_txt保存一次,并在将下一个产品添加到购物车时将其清除。我认为我们需要做一些事情来保存会话中的那些人。请帮助我们。

1 个答案:

答案 0 :(得分:3)

我假设您在"单个产品"中有一个(或多个)字段。页面,您想要从购物车内的那些(或那些)字段中插入值。在我的一个项目中,我使用了以下可能对您有帮助的代码。您需要根据需要进行自定义。

        // Add to cart
        add_filter( 'woocommerce_add_cart_item', 'woocommerce_add_cart_item_custom' );


        // Add item data to the cart
        add_filter( 'woocommerce_add_cart_item_data', 'woocommerce_add_cart_item_data_custom', 10, 2 );

        // Load cart data per page load
        add_filter( 'woocommerce_get_cart_item_from_session', 'woocommerce_get_cart_item_from_session_custom', 20, 2 );

        // Get item data to display
        add_filter( 'woocommerce_get_item_data', 'woocommerce_get_item_data_custom', 10, 2 );

        // Validate when adding to cart
        add_filter( 'woocommerce_add_to_cart_validation', 'woocommerce_add_to_cart_validation_custom', 10, 3 );

        // Add meta to order
        add_action( 'woocommerce_add_order_item_meta', 'woocommerce_add_order_item_meta_custom', 10, 2 );

        // order again
        add_filter( 'woocommerce_order_again_cart_item_data', 'woocommerce_order_again_cart_item_data', 10, 3 );


    //  add to cart 
    function woocommerce_add_cart_item_custom( $cart_item ) {

        // operation done while item is added to cart.

        return $cart_item;

    }

    //  get cart from session

    function woocommerce_get_cart_item_from_session_custom( $cart_item, $values ) {

        if (!empty($values['cusotm_field'])) :
            $cart_item['cusotm_field'] = $values['cusotm_field'];
            $cart_item = woocommerce_add_cart_item_custom( $cart_item );
        endif;

        return $cart_item;

    }


    //  get item data
    function other_options_get_item_data( $other_data, $cart_item ) {

        if (!empty($cart_item['custom_option'])) :

            $other_data = array(
                'name' => $custom,
                'value' => $value,
                'display' => $custom .' : '.$value
            );

        endif;

        return $other_data;

    }

    function woocommerce_add_cart_item_data_custom($cart_item_meta, $product_id){
        global $woocommerce;

    if(empty($cart_item_meta['custom_field']))
        $cart_item_meta['custom_field'] = array();

$cart_item_meta['custom_field'] = esc_attr($_POST[sanitize_title('name_of_field')]);            

        return $cart_item_meta;

    }


    //  add to order meta

    function woocommerce_add_order_item_meta_custom( $item_id, $values ) {

        if ( ! empty( $values['custom_option'] ) ) {
            woocommerce_add_order_item_meta( $item_id, $option_name, $option_value );           
        }
    }


    //  validation

    function woocommerce_add_to_cart_validation_custom($passed, $product_id, $qty){

        global $woocommerce;

$option = ''; // your custom field's name

   if( isset($_POST[sanitize_title($option)]) && $_POST[sanitize_title($option)] == '' )
        $passed = false;

    if (!$passed)
        $woocommerce->add_error( sprintf( __('"%s" is a required field.', 'woocommerce'), $option) );

        return $passed;

    }

    function woocommerce_order_again_cart_item_data($cart_item_meta, $product, $order){
        global $woocommerce;

    // Disable validation
    remove_filter( 'woocommerce_add_to_cart_validation', array( $this, 'validate_add_cart_item' ), 10, 3 );

        if(empty($cart_item_meta['custom_field']))
            $cart_item_meta['custom_field'] = array();

$cart_item_meta['_other_options']= esc_attr($_POST[sanitize_title('field_name')]);

        return $cart_item_meta;
    }

这是一个非常通用的代码。你需要修改你需要的最佳套房。

感谢。