在 Woocommerce 3 中使用 WC_Cart add_to_cart() 方法存储自定义数据

Store custom data using WC_Cart add_to_cart() method in Woocommerce 3

我正在创建一个会员站点,并为每个会员计划(只有 3 个计划)完全创建了静态页面。但是,我为每个计划添加了产品,当我点击 SELECT PLAN 按钮时,我重定向到一些自定义表单,我在其中询问用户我们将用于完成计划的信息范围(与 sneakertub.com 相同).

我已将代码写入 PHP 页面,它将处理表单的 SUBMIT 操作。 PHP 文件 infopage.php 将处理我通过 POST 调用发送的 POST 数据,并将这些所有数据存储到 WC 会话中。

$customer_name = $_POST["customer_name"];
$customer_email = $_POST["customer_email"];
$customer_sex = $_POST["customer_sex"];
$customer_age = $_POST["customer_age"];
$product_id = $_POST["product_id"];

global $wp_session;
$data = array(
       'customer_name' => $customer_name,
       'customer_email'   => $customer_email,
       'customer_sex'  => $customer_sex,
       'customer_age'     => $customer_age);
$wp_session['custom_SESSION_child']=$data;

WC()->session->set('custom_data_child', $data);

//Add product to WooCommerce cart.
WC()->cart->add_to_cart( $product_id )

但是,我认为上面的代码行不通。因为我没有发现任何上述技术的价值。我使用了 wp_sessionWC()->session$_SESSION,但没有任何方法有效。

我正在尝试通过这种方式将这些值访问到 functions.php

add_action( 'woocommerce_before_calculate_totals', 'twf_additional_price', 1, 3 );

function twf_additional_price( $cart_object ) {

    global $wpdb;

    global $wp_session;
    $session_data_2 =  $wp_session['custom_SESSION_child'];
    $session_data = WC()->session->get('custom_data_child');
    var_dump($session_data);
    var_dump($session_data2);

    foreach ( $cart_object->cart_contents as $key => $value ) {
        $extra_charge = 0;
        if(isset($value['twf_user_custom_datas'])){
            $extra_charge = 100;
        }

        $value['data']->set_price($value['data']->price + $extra_charge);
    }
}

暂时忽略 for 循环。主要是

var_dump($session_data);
        var_dump($session_data2);

两个都只转储 NULL

我的主要目标是将以上所有字段添加到 Woocommerce 结帐和订购页面中。

请告诉我这里有什么问题。我知道我可能正在使用非常糟糕的方法,但我希望计划选择与 sneakertub.com 相同的结帐过程。如果有任何关于此的教程或正确的方法,请告诉我。我更喜欢在没有插件的情况下这样做,但我也准备好使用插件了。

感谢您的关注。

已更新 - 您应该使用 WC_Cart add_to_cart() method 中的最后一个可用参数,而不是使用会话,这将允许您添加 任何自定义购物车项目数据

For cart item price change based on calculations, is better to make the new price calculation before and to set it in that custom cart item data.

请尝试以下操作:

1) 对于 php 页面中的代码:

$custom_data = array(); // Initializing

// Set the posted data as cart item custom data
if( isset($_POST['customer_name']) && ! empty($_POST['customer_name']) )
    $custom_data['custom_data']['name']  = sanitize_text_field( $_POST['customer_name'] );
if( isset($_POST['customer_email']) && ! empty($_POST['customer_email']) )
    $custom_data['custom_data']['email'] = sanitize_text_field( $_POST['customer_email'] );
if( isset($_POST['customer_sex']) && ! empty($_POST['customer_sex']) )
    $custom_data['custom_data']['sex']   = sanitize_text_field( $_POST['customer_sex'] );
if( isset($_POST['customer_age']) && ! empty($_POST['customer_age']) )
    $custom_data['custom_data']['age']   = sanitize_text_field( $_POST['customer_age'] );

// Set the calculated item price as custom cart item data
if( isset($custom_data['custom_data']) && sizeof($custom_data['custom_data']) > 0 && $product_id > 0 ) {
    // Get an instance of the WC_Product object
    $product = wc_get_product( $product_id );
    // Save the new calculated price as custom cart item data
    $custom_data['custom_data']['new_price'] = $product->get_price() + 100;
}

// Add product to cart with the custom cart item data
WC()->cart->add_to_cart( $product_id, '1', '0', array(), $custom_data );

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。


2) 您重新访问的函数将更改购物车商品价格

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 30, 1 );
function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset($cart_item['custom_data']['new_price']) )
            $cart_item['data']->set_price( $cart_item['custom_data']['new_price'] );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。

All other custom cart item data is available under the cart item key 'custom_data' as an indexed array… So you will be able to get that data easily from the cart object, to save it in the order.