通过 WooCommerce 中的 URL (GET) 设置自定义添加到购物车的价格

Set a custom add to cart price via the URL (GET) in WooCommerce

我正在开发一个基于 wordpress 和 woocommerce 的网站,提供与烹饪相关的培训信息并出售各种厨房材料。

想参加培训的人请填写表格申请。厨房用品也通过 woocommerce 销售。

培训已添加到网站,内容类型称为培训。

要求通过 woocommerce 结构销售一些培训。然而,这些想要出售的“培训”却希望以教育内容的形式保留下来。另外,请不要作为产品添加或移动。

首先,我创建了一个名为教育的虚拟产品。我把产品藏在店里了。

然后我为教程添加了一个名为价格的自定义字段。此处将输入每份培训的销售价格。

我在培训详细信息页面上有一个按钮“注册培训”,我将其更改为“购买”以获取想要出售的培训和 link

?add-to-cart=340&custom_price=600&quantity=1 

我填表了

这里的340是我创建的虚拟商品的id

单击“购买”按钮后,名为“教育”的虚拟产品将添加到购物篮中。但是我想根据打印的培训详情页来更新这个培训的名称和价格。

我添加到 functions.php 的代码。

add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals' );
function before_calculate_totals( $_cart ){
// loop through the cart_contents
foreach ( $_cart->cart_contents as $cart_item_key => &$item ) {
    // you will need to determine the product id you want to modify, only when the "donation_amount" is passed
    if ( $item['product_id'] == 340 && isset( $_GET['custom_price'] ) ){
        // custom price from POST
        $custom_price = $_GET['custom_price'] > 0 ? $_GET['custom_price'] : 0;
        // save to the cart data
        //$item['data']->price = $custom_price;
        // new versions of WooCommerce may require (instead of line above)...
        $item['data']->set_price($custom_price);
    }
}
}

function ipe_product_custom_price( $cart_item_data, $product_id ) {
if( isset( $_POST['custom_price'] ) && !empty($_POST['custom_price'])) {        
    $cart_item_data[ "custom_price" ] = $_POST['custom_price'];     
}
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'ipe_product_custom_price', 99, 2 );

我想用这些代码更新价格,但没用。

如何动态更新虚拟商品信息?或者你会建议什么不同的方法?

您的代码中存在一些错误,并且缺少一些使其正常工作的内容。请尝试以下操作:

// Set custom data as custom cart data in the cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_price_as_custom_cart_item_data', 30, 3 );
function add_custom_price_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    if( ! isset($_GET['custom_price']) ) {
        $cart_item_data['custom_price'] = (float) esc_attr( $_GET['custom_price'] );
        $cart_item_data['unique_key'] = md5( microtime().rand() ); // Make each item unique  
    }
    return $cart_item_data;
}

// Change cart item price
add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' );
function change_cart_item_price( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // loop through the cart_contents
    foreach ( $cart->get_cart() as $cart_item ) {
        // you will need to determine the product id you want to modify, only when the "donation_amount" is passed
        if ( isset($cart_item['custom_price']) ) {.
            $item['data']->set_price($cart_item['custom_price']);
        }
    }
}

// Display the custom price on minicart too
add_filter( 'woocommerce_cart_item_price', 'change_minicart_item_price', 10, 3 );
function change_minicart_item_price( $price_html, $cart_item, $cart_item_key ) {
    if( ! is_cart() && isset( $cart_item['custom_price'] ) ) {
        $args = array( 'price' => floatval($cart_item['custom_price']) );

        if ( WC()->cart->display_prices_including_tax() ) {
            $product_price = wc_get_price_including_tax( $cart_item['data'], $args );
        } else {
            $product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
        }
        return wc_price( $product_price );
    }
    return $price_html;
}

代码进入您的活动子主题(或活动主题)的 functions.php 文件。它应该有效。