【问题标题】:How to add a custom text box value to cart session array in Woocommerce如何在 Woocommerce 中将自定义文本框值添加到购物车会话数组
【发布时间】:2014-03-18 04:52:26
【问题描述】:

我们需要从 cart_session 中的 Add to 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,并在将下一个产品添加到购物车时将其清除。我认为我们需要做一些事情来拯救那些在会议中的人。请帮助我们。

【问题讨论】:

    标签: woocommerce


    【解决方案1】:

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

            // 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;
        }
    

    这是一个非常通用的代码。您需要修改所需的最佳套件。

    谢谢。

    【讨论】:

    • 谢谢。我添加了一个新属性 Customization_text 并使用该属性来获取自定义文本。
    • 很好,但我的代码专注于使用简单属性无法完成的事情。总之谢谢
    • 在我看来,这应该被接受,因为它回答了最初的问题。虽然我很好奇你为什么要再次禁用订单验证?
    • 感谢您的评论。就我而言,只有当他/她已经订购了特定产品时,才会看到再次订购按钮(如果网站支持的话)。由于用户已经填写了必填字段并且已经过验证,因此不需要再次验证。这就是为什么我再次禁用订单验证过滤器的原因。
    猜你喜欢
    • 2016-10-21
    • 2021-04-21
    • 2021-01-21
    • 1970-01-01
    • 2015-05-27
    • 2017-10-14
    • 2018-05-18
    • 2015-12-04
    • 2019-02-13
    相关资源
    最近更新 更多