WooCommerce:将产品作为不同的项目多次添加到购物车,但按其元数据分组

Posted

技术标签:

【中文标题】WooCommerce:将产品作为不同的项目多次添加到购物车,但按其元数据分组【英文标题】:WooCommerce: add product to cart multiple times as different items but grouped by its meta data 【发布时间】:2022-01-02 08:01:55 【问题描述】:

我只有一种产品('testare-psihologica')。当买家购买它时,他必须将此产品与会影响价格的附加信息(特定的“测试”标题)相关联。我不想使用可变产品,因为那些“测试”标题会很多,所以可变产品对我来说不是很方便。在这种情况下,我选择将此产品多次添加为单独的项目,但具有不同的“测试”标题。

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
function add_cart_simple_product_custom_price( $cart_item_data, $product_id ) 
    //add selected test ID to 'testare-psihologica' cart item
    if( isset( $_GET['test'] ) ) 
        $test_id = get_page_by_path( $_GET['test'], OBJECT, 'tests' )->ID;
        $test_title = get_post_field( 'post_title', $test_id );
        $cart_item_data['test_title'] = $test_title;
    

    // add product to cart multiple times, but as different items
    $unique_cart_item_key = md5( microtime() . rand() );
    $cart_item_data['unique_key'] = $unique_cart_item_key;

    return $cart_item_data;

在此之后,“测试”标题将显示在购物车和结帐页面中的产品名称下,然后它们将作为元数据添加到订单中(使用其他代码)。

这种方法的唯一缺点是,当产品多次添加到购物车但具有相同(相同)“测试”标题时,它也会显示为单独的项目,但我希望这些项目显示为一个而且只会增加他们的数量。所以,而不是这个:

我想要这个:

我想以编程方式执行此操作。如何实现?

【问题讨论】:

【参考方案1】:

看来下面这几行代码是多余的:

$unique_cart_item_key = md5( microtime() . rand() );
$cart_item_data['unique_key'] = $unique_cart_item_key;

所以要回答你的问题,你可以删除这些行


因为我没有你在回答中使用的相同获取数据,所以我做了一个概念证明,分为 3 个步骤:

1.在单个产品页面的添加到购物车按钮之前添加输入字段

function action_woocommerce_before_add_to_cart_button() 
    // Add a new input field, allowing the customer to set "test"
    echo '<div class="my-div"><input type="text" id="test" name="test"></div>';

add_action( 'woocommerce_before_add_to_cart_button', 'action_woocommerce_before_add_to_cart_button' );

2. 将“测试”值添加到购物车项目

function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id )  
    // Add test to cart item
    if ( ! empty ( $_POST[ 'test' ] ) ) 
        $cart_item_data['test_title'] = sanitize_text_field( $_POST['test'] );
    
    
    return $cart_item_data; 

add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 10, 3 );

3. 可选择在购物车和结帐页面中显示自定义数据

// Optionally display custom data in cart and checkout pages
function filter_woocommerce_get_item_data( $cart_data, $cart_item = null ) 
    if ( isset( $cart_item['test_title'] ) ) 
        $cart_data[] = array(
            'name' => 'Test title',
            'value' => $cart_item['test_title']
        );
    

    return $cart_data;

add_filter( 'woocommerce_get_item_data', 'filter_woocommerce_get_item_data', 99, 2 );

然后在第一步应用以下步骤:

插入 group1 作为值,然后按添加到购物车按钮 插入 group2 作为值,然后按添加到购物车按钮 插入 group1 作为值,然后按添加到购物车按钮

值为group1的产品会自动根据对应的值进行分组:

【讨论】:

非常有趣!由于第 2 步,当添加的项目真正被更改时,不需要“冗余”代码行!如果添加的项目没有以任何方式更改,但您仍想将其多次添加为单独的项目,您需要它们!?我学到了新东西!非常感谢!不错的答案! @IurieMalai “如果添加的项目没有以任何方式更改,但您仍想多次添加它作为单独的项目,您需要它们!?” - 是的,没错!

以上是关于WooCommerce:将产品作为不同的项目多次添加到购物车,但按其元数据分组的主要内容,如果未能解决你的问题,请参考以下文章

在 WooCommerce 中显示不包括产品类别的订单项目名称

WooCommerce 中特定产品变体的自定义后缀

在 Woocommerce 的产品标题中添加产品 ID 作为后缀

基于 WooCommerce 电子邮件通知中销售的产品的不同收件人

特定页面的不同 Woocommerce 产品缩略图大小

Cloudfront + Woocommerce - 购物车未更新